在ARM开发环境下C语言的设置堆栈指针和清理BSS段的作用概述.doc
《在ARM开发环境下C语言的设置堆栈指针和清理BSS段的作用概述.doc》由会员分享,可在线阅读,更多相关《在ARM开发环境下C语言的设置堆栈指针和清理BSS段的作用概述.doc(2页珍藏版)》请在三一文库上搜索。
1、在ARM开发环境下C语言的设置堆栈指针和清理BSS段的作用概述以前稍微写过操作系统上的C程序,感受不出来:BSS段,堆栈的意义。到了在单片机上写程序也没有考虑这些问题。但是到了ARM上环境似乎没有那么简单了,C的环境要自己来创建,不然就不能用。这也深刻的感受到了C语言中原来难以理解的概念。裸机建立C语言环境-设置堆栈指针这个是使用C语言的首要条件,不过这个就是指定一个sp指针就可以了,很简单的。ldr sp, =4096。裸机建立C语言环境-清理BSS段如果C语言中用到的全局变量或者静态变量,这个编译的时候是把它们放到了BSS段,这个段在内存中。怎么建成的?手动写一个链接脚本,添加_bss_s
2、tart _bss_end变量来表示BSS段的开始和结束。如下:SECTIONS . = 0x00000000;.text : *(.text) .rodata ALIGN(4) : AT(LOADADDR(.text)+SIZEOF(.text)+3).data ALIGN(4) : AT(LOADADDR(.rodata)+SIZEOF(.rodata)+3)_bss_start = .;.bss ALIGN(4) : *(.bss) *(COMMON) _bss_end = .;这样在应用程序中清理_bss_start到_bss_end之间内在中的内容。这样全局变量就可以用了,否则会出现
3、异常。我遇到的具体表现为:全局变量的值无法更改。代码可以学习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, #4cmp r0, r1ble clbss_lmov pc, lr/* end_of clear_bss */也可以用C语言来实现:void clean_bss(void)extern int _bss_start, _bss_end;int *p = for (; p p+)*p = 0;总结:就是往这段内存中写0.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 开发 环境 语言 设置 堆栈 指针 清理 BSS 作用 概述
链接地址:https://www.31doc.com/p-3408083.html