如何在我的裸机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部分? 解决方法
通常,在链接器命令文件/脚本中…
发布的脚本有一些问题. 建议类似以下的内容. 你应该看看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 = .; } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- objective-c – DCRoundSwitch在使用ARC时给出EXC_BAD_ACCE
- postgresql 系统字段 tableoid,xmin,cmin,xmax,cmax,c
- postgresql slow sql report 慢查询报告
- Flex 设置Layer叠加位置
- SQLite的链接扩展
- Vue制作Todo List网页
- c – 如何推断出变量参数后的模板参数?
- 为什么(* p = * p)&(* q = * q);在C中触发未定义的行为
- Swift开源第一天:1万多star、开源核心库和包管理器、支持L
- ruby-on-rails – 如何在Rails中使用Active Admin gem时删除