我试图重现这个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
4条答案
按热度按时间7xllpg7q1#
我知道这篇文章有点过时,但这可能会对某些人有所帮助。
这个错误的原因是newavr-gcc需要PROGMEM为const。您只需要在每一行以PROGMEM开头的前面放置const。
Sed使用
sed -i 's/^PROGMEM/const PROGMEM/g' usbdrv/*
很好地解决了这个问题。6kkfgxo02#
usbdrv/
目录需要更新到最新版本。下载V-USB tarball或zip文件,并将项目的usbdrv/
替换为归档文件中的usbdrv/
。您可能需要修改项目的usbconfig.h
,以便新的V-USB可以与现有项目一起工作,尽管大多数情况下它应该可以工作。p4rjhz4m3#
您没有给出错误出现的代码,但通过查看错误消息,问题就很清楚了
你只能把constants放在只读区(例如flash)。所有变量都放在RAM中。因此,如果你想把“usbDescriptorDevice”(我不知道它是做什么的)放在只读区(因为你要把“progrmem”放进去),你应该把它声明为常量。
这个问题通常出现在不符合这个简单规则的旧库中。
ffscu2ro4#
我通过下载lastet vusb并将其放在固件文件夹中解决了这个问题: