以前稍微写过操作系统上的c程序,感受不出来:bss段,堆栈的意义。到了在单片机上写程序也没有考虑这些问题。但是到了arm上环境似乎没有那么简单了,c的环境要自己来创建,不然就不能用。这也深刻的感受到了c语言中原来难以理解的概念。
裸机建立c语言环境-设置堆栈指针
这个是使用c语言的首要条件,不过这个就是指定一个sp指针就可以了,很简单的。ldr sp, =4096。
裸机建立c语言环境-清理bss段
如果c语言中用到的全局变量或者静态变量,这个编译的时候是把它们放到了bss段,这个段在内存中。怎么建成的?手动写一个链接脚本,添加__bss_start __bss_end变量来表示bss段的开始和结束。如下:
sections {
. = 0x00000000;
.text : { *(.text) }
.rodata align(4) : at((loadaddr(.text)+sizeof(.text)+3)&~(0x03)) {*(.rodata*)}
.data align(4) : at((loadaddr(.rodata)+sizeof(.rodata)+3)&~(0x03)) { *(.data) }
__bss_start = .;
.bss align(4) : { *(.bss) *(common) }
__bss_end = .;
}
这样在应用程序中清理__bss_start到__bss_end之间内在中的内容。这样全局变量就可以用了,否则会出现异常。我遇到的具体表现为:全局变量的值无法更改。代码可以学习u-boot中汇编方法清理:
/*
* these are defined in the board-specific linker script.
*/
.globl _bss_start
_bss_start:
.word __bss_start
.globl _bss_end
_bss_end:
.word __bss_end
/*
* 清bss段
*/
clear_bss:
ldr r0, _bss_start /* find start of bss segment */
ldr r1, _bss_end /* stop here */
mov r2, #0x00000000 /* clear */
clbss_l:str r2, [r0] /* clear loop... */
add r0, r0, #4
cmp r0, r1
ble clbss_l
mov pc, lr
/* end_of clear_bss */
也可以用c语言来实现:
void clean_bss(void)
{
extern int __bss_start, __bss_end;
int *p = &__bss_start;
for (; p < &__bss_end; p++)
*p = 0;
}
总结:就是往这段内存中写0.
新加坡电信计划开始引入5G网络
可重构计算架构将引领未来芯片的市场发展
全球活塞式飞机出货呈波动增长态势,通用飞机营业额同比增长14.35%
科通技术拟在深交所创业板上市
我国航发航材院成功研制石墨烯电池 突破批量生产技术
在ARM开发环境下C语言的设置堆栈指针和清理BSS段的作用概述
健身房中的智能显示屏可以将健身设备进行一键控制
中国广电与Qualcomm成功完成全球首次700MHz频段5G数据呼叫
闪联+德州仪器多模态组网技术标准暨芯片模组发布会即将召开
5G广播将帮助手机免费接收电视节目
净利劲增95.2%,耐威科技的MEMS进击之路
为什么电子产品/LED照明要选择非硅导热双面胶带
带弹性插针的MAG-MATE端子,多层PCB板连接的理想解决方案
镭神智能获评2022年度深圳市知识产权优势单位
人工智能对于核科技有什么帮助
小米7渲染图曝光屏占比高达97%,配置升级面部解锁价格2500?
灭菌剂在PCB电镀制程中对水质和产品质量的研究
产业爆发!上市公司成为国产传感器“芯”力量
创通联达解决方案获第九届中国电子信息博览会创新奖
COMSOL几何、仿真模型及电容量预测