(这是该问题的后续内容)
以下程序无法运行(在ATmega4809
)
#include <avr/io.h>
void f(const char str[])
{
if (str[0] == 'a') // <-- here is the problem. The program thinks that str[0] != 'a'
PORTC.OUT |= PIN0_bm;
else
PORTC.OUT &= ~PIN0_bm;
}
const char str[] = "abc"; // this string the compiler stores in the .rodata section
int main()
{
PORTC.DIR |= PIN0_bm;
while (1) { f(str); }
}
问题是编译器str
在该.rodata
部分中写入。
str
如果我改变强制编译器将其写入部分中的定义 .data
:
const char str[] __attribute__((section(".data"))) = "abc";
该程序有效。
(您可以在我之前的问题中看到所有详细信息)
我的问题是:
我怎样才能强制编译器将所有 const 字符串写入该
.data
部分以使我的程序能够正常工作?这是
avr-gcc
13.3.0 中的一个错误吗?
这是错误的问题,错误的解决方案。问题出在其他地方,例如,您正在将
.text
和上传.data
到设备,但缺少.rodata
。当我所以你的问题是如何上传二进制文件,或者如何构建二进制文件,或者两者兼而有之。
-mmcu=atmega4809
(假设您执行单独的链接调用)。Flash 加载程序可以avrdude
理解 ELF;这通常比构建 HEX 文件更容易且更不容易出错。.rodata
到目标。在上面的例子中,根据 ,必须上传(至少)304 个字节avr-objdump -P mem-usage
。请注意,.rodata
显示是一个相对较新的附加功能,请参阅PR31687:avr-objdump -P mem-usage 的输出缺少 .rodata,已在 Binutils v2.43 中修复。