函数指针变量被分配到不同的 section,然后依次从这些代码段读取函数指针执行函数,通过不同 section 实现了哪些函数先执行,哪些函数后执行 除了定义空函数记录起始地址和结束地址,也可以在 lds 相应段中定义变量 link.lds /*section information for initial.*/.= ALIGN(4); //ALIGN()是在.h中定义__rt_init_sta...
工程中若使用 gcc工具链,需在链接脚本中添加 AT 服务器命令表对应的 section ,参考如下链接脚本: /* Constant data goes into FLASH */.rodata:{.../* section information for RT-thread AT package */.=ALIGN(4);__rtatcmdtab_start=.;KEEP(*(RtAtCmdTab))__rtatcmdtab_end=.;.=ALIGN(4);}>...
init_rti_end */static int rti_end(void){return 0;}INIT_EXPORT(rti_end, "6.end"); 自动初始化机制中宏定义的核心部分为INIT_EXPORT,这个宏定义的涉及到的一些宏定义如下: #define SECTION(x) __attribute__((section(x)))/* 该宏的作用是向编译器说明这段代码有用 */#define RT_USED __attribu...
把函数加入符号段,其实就是使用了MDK编译器的__attribute__((section(x)))关键字,对函数进行声明,通过section关键字进行声明的函数,在编译器进行链接的时候,就会自动收集这些函数并把他们放到一个集中的区域里面,查看以下.map文件可知。 如上图红框所示,rt_hw_pin_init和rt_hw_usart_init都是使用 INIT_BOARD_...
3. 宏定义中,两个符号##用于将两个字符串进行拼接。宏定义INIT_EXPORT将 字符串__rt_init_和 函数名字符串fn进行拼接。 section关键字可以将变量定义到指定的输入段中。宏定义会将__rt_init_fn放到指定的段中。 OK,今天先到这,下次继续。加油~
SECTION(".rti_fn." "1") 等效于 SECTION(".rti_fn.1"),可见 level 是前一段的后缀,称".rti_fn.1"为段名 以下定义空函数,为了后面遍历函数用,标记起始地址和结束地址 staticintrti_start(void) {return0; } INIT_EXPORT(rti_start,"0");staticintrti_board_start(void) ...
rt_uint8_t _svc_stack_start[1024] SECTION(".nobss"); rt_uint8_t _svc_stack_start[1024] RT_SECTION(".nobss"); extern unsigned char __bss_start; extern unsigned char __bss_end; #endif 2 changes: 1 addition & 1 deletion 2 bsp/fh8620/platform/fh8620/iot_cam/startup.c Original...
从上面的分析可以看出,使用符号段的方式来存放初始化函数,好处就是当我需要添加某一个初始化函数的时候,就不需要再去改动RT-Thread的启动代码了,直接通过section关键字,把初始化函数添加到相应的符号段即可。 以上就是RT-Thread的自动初始化机制分析,正是由于采用了这种机制,所以,当我们对内核或组件进行裁剪的时候,...
1.3 各object中Section放置信息 从map文件第三部分开始,就进入非常有用的信息环节了。第一个重要信息就是section放置信息。我们在第四节课可重定向文件(.o/.a)里分析过单个relocatable文件task.o,task.o里各个基本section都有,但是都并没有分配有效地址,而这里列出了所有relocatable文件统一存储和地址分配信息,从这里...
segger_rtt的地址,这边通过修改代码,将地址默认设置在0x20000000上面,目前只支持KEIL这样做,后面会支持其他的,其他编译器需要debug的时候看下_SEGGER_RTT变量的地址。 SEGGER_RTT_PUT_CB_SECTION(SEGGER_RTT_CB_ALIGN(SEGGER_RTT_CB _SEGGER_RTT))__attribute__((section(".ARM.__at_0x20000000"))); ...