como compilar o v-usb com avr-gcc 4.6.2

Olá eventuais visitantes,

Pelos últimos dias eu tenho passado algum tempo remoendo a idéia de instalar a funcionalidade usb em um atmega8 e num atmega168 e encontrei a biblioteca v-usb, mas nem tudo foi só alegrias…

Inicialmente eu quis testar usando o  bootloadHID e o USBaspLoader. Como uso o Arch Linux, tive alguns problemas com a compilação pois o que temos por “padrão” é a versão 4.6.2 (mas aparece também nas versões 4.6.0, 4.6.1 e 4.7.0-svn). Seguem abaixo:

usbdrv/usbdrv.h:455:6: error: variable ‘usbDescriptorDevice’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
usbdrv/usbdrv.h:461:6: error: variable ‘usbDescriptorConfiguration’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
usbdrv/usbdrv.h:467:6: error: variable ‘usbDescriptorHidReport’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
usbdrv/usbdrv.h:473:6: error: variable ‘usbDescriptorString0’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
usbdrv/usbdrv.h:479:5: error: variable ‘usbDescriptorStringVendor’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
usbdrv/usbdrv.h:485:5: error: variable ‘usbDescriptorStringDevice’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
usbdrv/usbdrv.h:491:5: error: variable ‘usbDescriptorStringSerialNumber’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
In file included from main.c:23:0:
usbdrv/usbdrv.c:70:14: error: variable ‘usbDescriptorString0’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
usbdrv/usbdrv.c:80:14: error: variable ‘usbDescriptorStringVendor’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
usbdrv/usbdrv.c:89:14: error: variable ‘usbDescriptorStringDevice’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
usbdrv/usbdrv.c:111:14: error: variable ‘usbDescriptorDevice’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
usbdrv/usbdrv.c:142:14: error: variable ‘usbDescriptorConfiguration’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
usbdrv/usbdrv.h:213:24: warning: ‘usbFunctionDescriptor’ used but never defined [enabled by default]

A solução não foi complicada, mas demorei um pouco pra me convencer de que era uma “gambiarra” aceitável. Em ambos os casos tive esse mesmo problema, então abri o arquivo usbdrv.h e adicionei a palavra chave em negrito em todas as ocorrências da palavra PROGMEM :

<linha 452>#ifndef __ASSEMBLER__
<linha 453> extern
<linha 454>#if !(USB_CFG_DESCR_PROPS_DEVICE & USB_PROP_IS_RAM)
<linha 455> const PROGMEM
<linha 456> #endif
<linha 457> char usbDescriptorDevice[];

E no arquivo, também busquei todas as ocorrências da palavra chave PROGMEM em usbdrv/usbdrv.c:

<linha 70> const PROGMEM char usbDescriptorString0[] = { /* language descriptor */

O grande problema aqui é que a partir da versão 4.6.0, o qualificador PROGMEM (que é um artifício existente na avr-libc para por determinadas variáveis no espaço de memória de programa) passa a requerer a adição do qualificador const A necessidade disso me parece intuitiva, uma vez que o dado reside no espaço de programa, não poderá ser alterado. Penso que essa exigência aumenta a consistência do programa (ao menos exige que o programador saiba melhor o que está fazendo) e deve facilitar a vida do gcc-avr na hora de analisar o código e implementar otimizações.

, , , , , , , , ,

  1. #1 por Roberto T. M. em setembro 1, 2014 - 2:10 pm

    Olá Eduardo. Obrigado pela dica. Preciso montar urgente esse gravador e estava dando esse erro. Tudo de bom, muita paz e sucesso. Obrigado.

Deixar mensagem para Roberto T. M. Cancelar resposta