avr-gcc:变量必须是常量,才能通过“__attribute__((progmem))”放入只读部分

zzwlnbp8  于 2022-11-12  发布在  其他
关注(0)|答案(4)|浏览(246)

我试图重现这个4-key-keyboard,为此,我试图在我的Linux机器上用avr-gcc编译its source
我设法通过使用参数扩展命令行解决了编译器抛出的几个错误,但现在我遇到了下面的错误。问题是,很多V-USB上的演示项目使用相同的库,并抛出相同的错误,我不想费力地通过所有的代码来尝试修复我想检查的每个项目。我意识到最好的方法是修复源代码中的错误,但是尽管下面的错误可以很容易地解决,但新的错误会抛出,解决起来要复杂得多 * 并且 * 随着对源代码的所有更改,我不能保证生成的程序仍然可以实际工作。
我的问题是:avr-gcc是否有一些兼容性命令行参数,使代码编译起来就像它是一个旧版本的gcc?
这是我用来编译源代码的命令:

avr-gcc main.c -I /usr/lib/avr/include/ -mmcu=attiny85 -DF_CPU=16000000 -Os -I ./usbdrv

以下是avr-gcc抛出的错误:

In file included from main.c:32:0:
./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))’
main.c:105:14: error: variable ‘usbDescriptorHidReport’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’

我的配置:
Ubuntu 13.10版本
avr-gcc(通用条款)4.7.2

7xllpg7q

7xllpg7q1#

我知道这篇文章有点过时,但这可能会对某些人有所帮助。
这个错误的原因是newavr-gcc需要PROGMEMconst。您只需要在每一行以PROGMEM开头的前面放置const。

Sed使用sed -i 's/^PROGMEM/const PROGMEM/g' usbdrv/*很好地解决了这个问题。

6kkfgxo0

6kkfgxo02#

usbdrv/目录需要更新到最新版本。下载V-USB tarball或zip文件,并将项目的usbdrv/替换为归档文件中的usbdrv/。您可能需要修改项目的usbconfig.h,以便新的V-USB可以与现有项目一起工作,尽管大多数情况下它应该可以工作。

p4rjhz4m

p4rjhz4m3#

您没有给出错误出现的代码,但通过查看错误消息,问题就很清楚了

./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))’

你只能把constants放在只读区(例如flash)。所有变量都放在RAM中。因此,如果你想把“usbDescriptorDevice”(我不知道它是做什么的)放在只读区(因为你要把“progrmem”放进去),你应该把它声明为常量。
这个问题通常出现在不符合这个简单规则的旧库中。

ffscu2ro

ffscu2ro4#

我通过下载lastet vusb并将其放在固件文件夹中解决了这个问题:

cd ./USBASPTTY/usbasp+/firmware
mv usbdrv usbdrv.old
wget https://www.obdev.at/downloads/vusb/vusb-20121206.tar.gz
tar -xvzf vusb-20121206.tar.gz 
cp -av ./vusb-20121206/usbdrv ./
make main.hex

相关问题