(这是这个问题的后续)
以下程序不起作用(在
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 中的错误吗?
如何强制编译器将所有 const 字符串写入
部分,以便我的程序正常运行?.data
这是错误的问题和错误的解决方案。 问题出在其他地方,例如您正在将
.text
和 .data
上传到设备,但缺少 .rodata
。 当我
$ avr-gcc-13 x.c -mmcu=atmega4809 -o x.elf && avr-objdump -h x.elf && avr-objdump -P mem-usage x.elf
x.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 00000000 00802800 00000130 000001c4 2**0
CONTENTS, ALLOC, LOAD, DATA
1 .text 0000012c 00000000 00000000 00000094 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .rodata 00000004 0000412c 0000012c 000001c0 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .comment 0000001b 00000000 00000000 000001c4 2**0
CONTENTS, READONLY
4 .note.gnu.avr.deviceinfo 00000040 00000000 00000000 000001e0 2**2
CONTENTS, READONLY, OCTETS
...
x.elf: file format elf32-avr
AVR Memory Usage
----------------
Device: atmega4809
Program: 304 bytes (0.6% Full)
(.text + .data + .rodata + .bootloader)
Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)
所以你的问题是如何上传二进制文件,或者如何构建二进制文件,或者两者兼而有之。