avr-gcc:变量必须是const才能通过'__attribute __((progmem))'进入只读部分

时间:2014-01-19 13:34:16

标签: gcc avr-gcc

我正在尝试重现这个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(GCC)4.7.2

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我知道这则帖子有些保留。但这可能会对某人有所帮助。

该错误的原因是新的 avr-gcc 需要 PROGMEM const 。您只需要将const放在以PROGMEM开头的每一行的前面。

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

答案 2 :(得分: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))’

你只能将常量放在只读部分(例如flash)。所有变量都转到RAM。因此,如果你想要“usbDescriptorDevice”(我不知道它做了什么)进入只读部分(因为你把“progrmem”),你应该声明它是常量。

问题通常出现在不符合此简单规则的旧库中。