历史上的今天
返回首页

历史上的今天

今天是:2024年08月28日(星期三)

正在发生

2020年08月28日 | 在ARM开发环境下C语言的设置堆栈指针和清理BSS段的作用概述

2020-08-28 来源:elecfans

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

推荐阅读

史海拾趣

Daco Semiconductor Co Ltd公司的发展小趣事

随着技术的不断成熟,Daco开始积极寻求市场拓展。公司首先与几家知名的电子设备制造商建立了合作关系,为其提供定制的半导体解决方案。同时,Daco也积极参与国际半导体展览和交流活动,与全球的行业同仁建立了广泛的联系。通过不断的市场拓展和战略合作,Daco的产品逐渐进入了全球市场,公司的知名度和影响力也得到了显著提升。

All Sensors公司的发展小趣事

随着电子行业的快速发展和市场竞争的加剧,All Sensors面临着越来越多的挑战。然而,公司始终保持着敏锐的市场洞察力和创新精神。通过与客户紧密合作,仔细聆听客户需求,All Sensors不断开发出适应市场变化的新产品和技术。同时,公司还注重提升产品质量和服务水平,赢得了客户的广泛认可和信赖。

这些故事只是All Sensors在电子行业发展历程中的一部分缩影。作为一家全球领先的传感器技术领军企业,All Sensors将继续秉承创新精神,不断推动电子行业的发展和进步。

Dongguan Jingyue Electronics Co Ltd公司的发展小趣事

在电子行业的激烈竞争中,Dongguan Jingyue Electronics Co Ltd始终将技术创新作为公司发展的核心驱动力。公司自成立之初就投入大量资源用于研发新技术和新产品。通过不断的努力,公司成功推出了一系列具有市场竞争力的电子产品,赢得了消费者的广泛认可。这些技术创新不仅提升了公司的品牌形象,也为公司带来了丰厚的利润。

Connor-Winfield公司的发展小趣事

在电子行业中,技术的创新和产品的品质是企业生存和发展的关键。Connor-Winfield深知这一点,因此在发展过程中始终注重技术创新和品质提升。公司投入大量资源进行研发,不断推出具有创新性和高性能的产品。同时,公司还建立了严格的质量管理体系,确保每一件产品都符合最高的品质标准。这些努力使得Connor-Winfield的产品在市场上赢得了良好的口碑。

Elite公司的发展小趣事

进入21世纪后,电子行业迎来了新的发展机遇和挑战。面对行业内的激烈竞争和技术的快速迭代,Elite意识到必须加快转型升级步伐。公司开始涉足智能家居、物联网等新兴市场领域,并成功推出了一系列具有竞争力的产品。这些新产品不仅为公司带来了新的增长点,也进一步巩固了Elite在电子行业的领先地位。

常州星海电子(Starsea)公司的发展小趣事

常州星海电子有限公司,自1990年成立以来,便以生产中英合资的各类二极管为起点,逐渐在电子行业中崭露头角。随着公司业务的不断发展和市场需求的增长,2016年,公司正式更名为常州星海电子股份有限公司,完成了从合资到股份制的转变。这一转变不仅标志着公司管理结构的升级,也预示着公司在未来市场中的更大发展。

问答坊 | AI 解惑

关于单片机软件设计

最近在做一个单片机的软件设计项目,在这个项目过程中,发现老是在设计思路上走偏或走弯路,在具体设计上可能由于没有经验的缘故,也总是会出现设计结果可用但不好的问题 请教各位牛人,如何更快的解决这些问题?如果能给详细的分析和解决思路,或 ...…

查看全部问答>

保持理想是如此艰难

也是看到辛昕谈到理想的问题,想起春节回家时,上初三的侄子提起外教让大家写如果有钱了后干什么,结果班里几乎所有的同学写的都是“buy a big house for my parents”,我当时觉得非常悲哀,这就是中国的现状,房子的影响是如此深远,以致于大家将 ...…

查看全部问答>

AVR的mega,xmega和stm32比,有啥优势?

同样价钱,基本有同样容量的flash,ram,xmega的功能主频还强些,但和stm32比还是差, avr的生存空间在哪里?…

查看全部问答>

STM8S的GPIO如何做成双向IO,如访问DS1302等,或模拟I2C?版主指点

STM8S的GPIO如何做成双向IO,如访问DS1302等,或模拟I2CSTM8S的IO设置有方向,我写时设置输出,读时是否要设置为输入?还是只要设置为开路输出就可以读写?请版主指点.…

查看全部问答>

有个SD卡的问题请教大家

我想请问大家,如果不用文件系统,直接通过SPI方式写数据到SD卡里,每一次写入的数据大小是一个××OCK= 512B,但是我怎么知道一张SD卡有多少个××OCK呢,以1G的为例。…

查看全部问答>

防止LM3S811被锁死

虽然经常来论坛看看,但很少发帖子,看到论坛在搞LM3S811,去年电子设计时TI 发了块811的板子,但是同学玩的时候有很多锁死的,具体见文档。也可能论坛活动的板子和我的有区别,没有锁死的问题。还是看看吧,应该有好处的。     ...…

查看全部问答>

高手帮忙分析,可行性(chunyang大哥请进)

看到DIY的活动,有意参加。目前只是简单的想法,使用PI的软件设计出框架,然后修改控制部分,替换开关管,实现可调的数控开关电源。基本的电路如下(请下载TOPSwitch-HX_PIDesign2.pdf)我的想法是,使用TI的TMS320F28032来作为控制核心,产生PWM控 ...…

查看全部问答>

EE团了TI MSP-EXP430FR5739,试了下Demo

3轴传感器很有爱,小身材大智慧,其他功能尚待发掘;…

查看全部问答>

TMS320F28335 eCAN模块自检函数

做个一个TMS320F28335 eCAN模块自检函数Uint32 ECAN_SelfTest(Uint16 ECAN_mu16_CANModuleSN) { Uint16 ECAN_mu16_MBoxesSN; /* the mailbox serial number of ECAN Module */Uint32 ECAN_mu32_RecFrmID; /* the ID of receive frame */ Uint32 ...…

查看全部问答>