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

    文章

    9021

    浏览量

    366377
  • C语言
    +关注

    关注

    180

    文章

    7589

    浏览量

    135767
  • BSS
    BSS
    +关注

    关注

    0

    文章

    18

    浏览量

    12198
  • 堆栈指针
    +关注

    关注

    0

    文章

    5

    浏览量

    2900

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    浅谈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

    如何设置堆栈指针清理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

    C语言指针电子教程

    本资料是一份不错的关于C语言指针的电子教程,希望对大家有所帮助... 指针简介 指针C
    发表于 07-30 16:00 77次下载

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

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

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

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

    C语言入门教程之堆栈的详细资料概述

    本文档的主要内容详细介绍的是C语言入门教程之堆栈的详细资料概述
    发表于 11-29 11:47 12次下载

    堆栈C语言中的定义是怎么样的

     计机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。
    发表于 08-16 17:32 0次下载
    <b class='flag-5'>堆栈</b><b class='flag-5'>在</b><b class='flag-5'>C</b><b class='flag-5'>语言</b>中的定义是怎么样的

    C语言中的悬空指针和野指针是什么意思?

    提起C语言大部分开发者很自然就会想到指针二字,没错,作为C的核心和灵魂,它的地位咱们就不再赘述了,今天我们想跟大家讲的是
    的头像 发表于 02-09 17:20 1044次阅读