BSS(Block Started by Symbol)有什么作用呢?百度百科的释义如下:"BSS段通常是指用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域。特点是可读写的,在程序执行之前BSS段会自动清0。"程序初始化时,BSS段为什么会被清零呢?围绕这个话题,本文聚焦以下几点:
************************************************************************************
关注微信公众号“开心果 Need Car”,一起讨论Autosar开发中遇到的那些“坑”!
************************************************************************************
因为*.bss段会映射到RAM区(DSPR:Data Scratch-Pad SRAM),所以,在弄清楚*.bss段为什么会自动清零之前,我们先了解一下Reset对RAM区域的影响。
查看TC3xx的用户手册,发现:除了Cold power-on Reset以外,其他Reset类型,对DSPR和PSPR没有影响,也就是说,实际上,非Cold power-on Reset对RAM区(DSPR)没有影响,为什么软复位后,对应的*.bss RAM区(DSPR)清零了呢?Reset类型对RAM区的影响如下所示:
注意:Cold Power-on Reset,RAM区受影响,会初始化为0x00。诊断服务的$10 02/82,一般对应Application Reset或者System Reset。调试器的DAP(Debug Access Port)/JTAG(Joint Test Action Group)调试口对应Debug Reset。
不同Reset请求,触发的Reset方式,如下所示:
主程序执行之前,*.bss段为什么会自动清零?搞清楚这个问题之前,需要先认识一下链接文件和启动文件。
本文基于HighTec编译器讨论。链接文件(*.lsl)中,会将所有的*.bss段的起始地址和对应的长度记录,形成一个Table表,即:__clear_table。代码中所有未初始化的全局变量,或者初始化为零的全局变量,启动代码会按照__clear_table记录的*.bss段起始地址和长度完成清零动作。__clear_table示意如下:
......
/*
* Create the clear and copy tables that tell the startup code
* which memory areas to clear and to copy, respectively.
*/
PROVIDE(__clear_table = .);
LONG(0 + ADDR(.CPU5.zbss)); LONG(SIZEOF(.CPU5.zbss));
LONG(0 + ADDR(.CPU5.bss)); LONG(SIZEOF(.CPU5.bss));
LONG(0 + ADDR(.CPU5.lmubss)); LONG(SIZEOF(.CPU5.lmubss));
......
LONG(-1); LONG(-1);
......
<< · Back Index ·>>