Mul*_*ync 5 c embedded crt bare-metal cortex-m
我成功地编写了一个在我的 STM32F4 上运行的裸机 C 程序。没什么特别的,只是通常的led-blinky-program。在这个项目中,我编写了初始化例程,用于清除该.bss部分并.data自己初始化该部分。
这并不复杂。在链接器脚本中,我只是指示链接器创建一些标记.dataand.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
Run Code Online (Sandbox Code Playgroud)
然后我在我的代码中使用了这些符号:
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;
}
Run Code Online (Sandbox Code Playgroud)
现在我想将crt0用于设置.bss和.data. (我听说设置东西是 的主要目的crt0。)
我怎样才能做到这一点?在链接描述文件中定义符号和在代码中使用 的基本原理是否相同?
如何使用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 = .;
}
}
}
Run Code Online (Sandbox Code Playgroud)