0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

Q4MP_gh_c472c21 来源:未知 作者:易水寒 2018-05-19 09:55 次阅读

以前稍微写过操作系统上的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.

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8653

    浏览量

    361850
  • C语言
    +关注

    关注

    180

    文章

    7534

    浏览量

    128846
  • BSS
    BSS
    +关注

    关注

    0

    文章

    17

    浏览量

    12123
  • 堆栈指针
    +关注

    关注

    0

    文章

    5

    浏览量

    2800

原文标题:嵌入式ARM开发环境下,设置堆栈指针和清理BSS段的意义

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ARM9处理器C语言编程(全) ADS开发环境创建简介

    与简介ADS1.2的安装ADS1.2的仿真,调试用AXD进行代码仿真,调试JTAQ概述Nor和Nand Flash的区别与使用Flash编程ARM使用C
    发表于 07-28 15:06

    ARM堆栈学习笔记

    以下是我在学习ARM指令中记录的关于堆栈方面的知识:1、寄存器 R13 ARM 指令中常用作堆栈指针
    发表于 06-15 11:50

    浅谈text、databss

    的一块内存区域,一般初始化时bss 部分将会清零(bss属于静态内存分配,即程序一开始就将其清零了)。 比如,
    发表于 08-21 15:51

    C语言ARM堆栈指针SP设置的理解与总结(转载)

    的,从地址向高地址,依次为:程序(.text),BSS,然后上面还可能会有堆空间,然后最上面才是堆栈,这样安排
    发表于 01-26 17:11

    初步学习ARM11

    。但是STM32采用的是THUMB2指令,其中包含THUMB的16位指令,所以指令不是严格的4字节对齐。但是写STM32程序的时候,都是用C语言写的,所以对这些就不怎么关心。但是ARM
    发表于 12-10 18:08

    迅为-imx6ull开发板之C语言实现LED例程

    实现 LED 的例程。10.1 C 程序版LED例程简介汇编完成 C 语言环境的初始化主要包括内存初始化,设置
    发表于 07-01 11:25

    如何设置堆栈指针清理BSS

    嵌入式ARM开发环境设置堆栈指针
    发表于 02-04 06:26

    嵌入式ARM开发环境下为什么要设置堆栈指针清理BSS

    嵌入式ARM开发环境设置堆栈指针
    发表于 04-02 06:39

    概述C语言的特点

    的资源,得到更多的信息,对软件工具的发展起到了更大的促进作用。1、嵌入式Linux C语言开发概述C
    发表于 11-04 07:21

    ARM汇编在嵌入式Linux开发中有何作用

    前言  我们进行嵌入式 Linux 开发的时候是绝对要掌握基本的 ARM 汇编,因为 Cortex-A 芯片一上电 SP 指针还没初始化, C
    发表于 12-20 08:20

    堆栈指针作用是什么?

    堆栈指针作用是什么
    发表于 11-02 08:10

    堆栈指针是什么_有什么作用

    堆栈指针总是指向栈顶位置。一般堆栈的栈底不能动,所以数据入栈前要先修改堆栈指针,使它指向新的空余空间然后再把数据存进去,出栈的时候相反。
    发表于 11-10 11:01 9611次阅读

    基址指针堆栈指针分别是什么意思_有什么分别

    堆栈指针总是指向栈顶位置。一般堆栈的栈底不能动,所以数据入栈前要先修改堆栈指针,使它指向新的空余空间然后再把数据存进去,出栈的时候相反。
    发表于 11-13 09:40 1.3w次阅读
    基址<b class='flag-5'>指针</b>和<b class='flag-5'>堆栈</b><b class='flag-5'>指针</b>分别是什么意思_有什么分别

    C语言ARM堆栈指针SP设置的理解与总结

    开始将堆栈指针设置在内部RAM,是因为不是每个板上都有外部RAM,而且外部RAM的大小也不相同,而且如果是SDRAM,还需要初始化,在内部RAM开始运行的一般是一个小的引导程序,基本上不怎么使用
    的头像 发表于 04-06 19:46 8903次阅读

    深入分析MCU堆栈作用 以及该如何设置堆栈大小

    深入分析MCU堆栈作用,以及该如何设置堆栈大小
    的头像 发表于 03-01 14:13 4536次阅读
    深入分析MCU<b class='flag-5'>堆栈</b>的<b class='flag-5'>作用</b> 以及该如何<b class='flag-5'>设置</b><b class='flag-5'>堆栈</b>大小