加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在我的裸机C程序中使用crt0.o设置.bss和.data?

发布时间:2020-12-16 07:11:26 所属栏目:百科 来源:网络整理
导读:我成功写了一个在我的STM32F4上运行的裸机C程序.它没什么特别的,只是通常的led-blinky程序.在这个项目中,我编写了初始化例程,它清除.bss部分并自己初始化.data部分. 这并不是很复杂.在链接器脚本中,我刚刚指示链接器创建一些符号,这些符号标记.data和.bss部
我成功写了一个在我的STM32F4上运行的裸机C程序.它没什么特别的,只是通常的led-blinky程序.在这个项目中,我编写了初始化例程,它清除.bss部分并自己初始化.data部分.

这并不是很复杂.在链接器脚本中,我刚刚指示链接器创建一些符号,这些符号标记.data和.bss部分的开头和结尾.

.data 0x20001000 :
    ALIGN(4)
    {
        __etext = LOADADDR(.data);
        __data_start__ = ADDR(.data) ;
        *(.data*) ;
        __data_end__ = ADDR(.data) + SIZEOF(.data) ;
    } >RAM AT>ROM


.bss :
    ALIGN(4)
    {
        __bss_start__ = ADDR(.bss) ;
        *(.bss*) ;
        __bss_end__ = ADDR(.bss) + SIZEOF(.bss) ;
    } >RAM

然后我在我的代码中使用这些符号:

extern unsigned int __etext;
extern unsigned int __data_start__;
extern unsigned int __data_end__;
extern unsigned int __bss_start__;
extern unsigned int __bss_end__;


void Reset_Handler()
{
    unsigned int * src;
    unsigned int * dest;

    src = &__etext;
    dest = &__data_start__;

    /* copy .data */
    while (dest < &__data_end__)
        *(dest++) = *(src++);

    /* Zero bss.  */
    for (dest = &__bss_start__; dest < &__bss_end__; dest++)
        *dest = 0;
}

现在我想使用crt0来设置.bss和.data. (我听说设置东西是crt0的主要目的.)

我怎样才能做到这一点?
在链接描述文件中定义符号并在代码中使用相同的基本原则是什么?

TL; DR

如何使用crt0设置我的.bss和.data部分?

解决方法

通常,在链接器命令文件/脚本中…

发布的脚本有一些问题.

建议类似以下的内容.
(使用实际原点和长度参数)
(注意.text,.data,.bss不是唯一创建的部分.
??还有更多,应该适当列出)

你应该看看http://www.math.utah.edu/docs/info/ld_3.html#SEC18
有关链接器命令文件的详细信息和示例

/* this is a very simple memory layout */
/* usually there are separate memory items */
/* for each memory mapped peripheral */
/* external RAM,etc etc etc */
MEMORY {
    rom : ORIGIN = 0,LENGTH = 256K
    ram : ORIGIN = 0x40000000,LENGTH = 4M
}

SECTIONS {
    rom :0 (NOLOAD) BLOCK(4) {
    }

    ram : {
        .text : BLOCK(4) {
        .textStart = .;
        *(.text)
        .textEnd = .;
        }

        .bss : BLOCK(4) {
        .bssStart = .;
        *(.bss)
        .bssEnd = .;
        }

        .data : BLOCK(4) {
        .dataStart = .;
        *(.data)
        .dataEnd = .;
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读