在ARM开发环境下C语言的设置堆栈指针和清理BSS段的作用概述

发布者:素心轻语最新更新时间:2020-08-28 来源: elecfans关键字:ARM  开发环境  C语言  设置堆栈指针  清理BSS段 手机看文章 扫描二维码
随时随地手机看文章

以前稍微写过操作系统上的C程序,感受不出来:BSS段,堆栈的意义。到了在单片机上写程序也没有考虑这些问题。但是到了ARM上环境似乎没有那么简单了,C的环境要自己来创建,不然就不能用。这也深刻的感受到了C语言中原来难以理解的概念。


裸机建立C语言环境-设置堆栈指针

这个是使用C语言的首要条件,不过这个就是指定一个sp指针就可以了,很简单的。ldr sp, =4096。

在ARM开发环境下C语言的设置堆栈指针和清理BSS段的作用概述

裸机建立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.

关键字:ARM  开发环境  C语言  设置堆栈指针  清理BSS段 引用地址:在ARM开发环境下C语言的设置堆栈指针和清理BSS段的作用概述

上一篇:ARM7处理器和ARM9E处理器的流水线差别
下一篇:三分钟了解 ARM、DSP及FPGA的区别

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved