avr-gcc ATmega4809 `.rodata` 部分出现问题

问题描述 投票:0回答:1

(这是这个问题的后续

以下程序不起作用(在

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";

程序有效。

(您可以在我之前的问题中查看所有详细信息)

我的问题是:

  1. 如何强制编译器将所有 const 字符串写入

    .data
    部分,以便我的程序正常运行?

  2. 这是

    avr-gcc
    13.3.0 中的错误吗?

gcc avr atmega avr-gcc
1个回答
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)

所以你的问题是如何上传二进制文件,或者如何构建二进制文件,或者两者兼而有之。

© www.soinside.com 2019 - 2024. All rights reserved.