0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在ARM開發(fā)環(huán)境下C語言的設(shè)置堆棧指針和清理BSS段的作用概述

Q4MP_gh_c472c21 ? 來源:未知 ? 作者:易水寒 ? 2018-05-19 09:55 ? 次閱讀

以前稍微寫過操作系統(tǒng)上的C程序,感受不出來:BSS段,堆棧的意義。到了在單片機(jī)上寫程序也沒有考慮這些問題。但是到了ARM上環(huán)境似乎沒有那么簡單了,C的環(huán)境要自己來創(chuàng)建,不然就不能用。這也深刻的感受到了C語言中原來難以理解的概念。

裸機(jī)建立C語言環(huán)境-設(shè)置堆棧指針

這個是使用C語言的首要條件,不過這個就是指定一個sp指針就可以了,很簡單的。ldr sp, =4096。

裸機(jī)建立C語言環(huán)境-清理BSS段

如果C語言中用到的全局變量或者靜態(tài)變量,這個編譯的時候是把它們放到了BSS段,這個段在內(nèi)存中。怎么建成的?手動寫一個鏈接腳本,添加__bss_start __bss_end變量來表示BSS段的開始和結(jié)束。如下:

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 = .;

}

這樣在應(yīng)用程序中清理__bss_start到__bss_end之間內(nèi)在中的內(nèi)容。這樣全局變量就可以用了,否則會出現(xiàn)異常。我遇到的具體表現(xiàn)為:全局變量的值無法更改。代碼可以學(xué)習(xí)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語言來實(shí)現(xiàn):

void clean_bss(void)

{

extern int __bss_start, __bss_end;

int *p = &__bss_start;

for (; p < &__bss_end; p++)

*p = 0;

}

總結(jié):就是往這段內(nèi)存中寫0.

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9097

    瀏覽量

    367608
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136861
  • BSS
    BSS
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    12213
  • 堆棧指針
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    2912

原文標(biāo)題:嵌入式ARM開發(fā)環(huán)境下,設(shè)置堆棧指針和清理BSS段的意義

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    ARM9處理器C語言編程(全) ADS開發(fā)環(huán)境創(chuàng)建簡介

    與簡介ADS1.2的安裝ADS1.2的仿真,調(diào)試用AXD進(jìn)行代碼仿真,調(diào)試JTAQ概述Nor和Nand Flash的區(qū)別與使用Flash編程ARM使用C
    發(fā)表于 07-28 15:06

    淺談text、databss

    的一塊內(nèi)存區(qū)域,一般初始化時bss 部分將會清零(bss屬于靜態(tài)內(nèi)存分配,即程序一開始就將其清零了)。 比如,
    發(fā)表于 08-21 15:51

    C語言ARM堆棧指針SP設(shè)置的理解與總結(jié)(轉(zhuǎn)載)

    的,從地址向高地址,依次為:程序(.text),BSS,然后上面還可能會有堆空間,然后最上面才是堆棧,這樣安排
    發(fā)表于 01-26 17:11

    初步學(xué)習(xí)ARM11

    。但是STM32采用的是THUMB2指令,其中包含THUMB的16位指令,所以指令不是嚴(yán)格的4字節(jié)對齊。但是寫STM32程序的時候,都是用C語言寫的,所以對這些就不怎么關(guān)心。但是ARM
    發(fā)表于 12-10 18:08

    如何設(shè)置堆棧指針清理BSS

    嵌入式ARM開發(fā)環(huán)境設(shè)置堆棧指針
    發(fā)表于 02-04 06:26

    嵌入式ARM開發(fā)環(huán)境下為什么要設(shè)置堆棧指針清理BSS?

    嵌入式ARM開發(fā)環(huán)境,設(shè)置堆棧指針
    發(fā)表于 04-02 06:39

    概述C語言的特點(diǎn)

    的資源,得到更多的信息,對軟件工具的發(fā)展起到了更大的促進(jìn)作用。1、嵌入式Linux C語言開發(fā)概述C
    發(fā)表于 11-04 07:21

    ARM匯編在嵌入式Linux開發(fā)中有何作用

    前言??我們進(jìn)行嵌入式 Linux 開發(fā)的時候是絕對要掌握基本的 ARM 匯編,因?yàn)?Cortex-A 芯片一上電 SP 指針還沒初始化, C
    發(fā)表于 12-20 08:20

    堆棧指針作用是什么?

    堆棧指針作用是什么
    發(fā)表于 11-02 08:10

    C語言指針電子教程

    本資料是一份不錯的關(guān)于C語言指針的電子教程,希望對大家有所幫助... 指針簡介 指針C
    發(fā)表于 07-30 16:00 ?77次下載

    堆棧指針是什么_有什么作用

    堆棧指針總是指向棧頂位置。一般堆棧的棧底不能動,所以數(shù)據(jù)入棧前要先修改堆棧指針,使它指向新的空余空間然后再把數(shù)據(jù)存進(jìn)去,出棧的時候相反。
    發(fā)表于 11-10 11:01 ?1w次閱讀

    C語言ARM堆棧指針SP設(shè)置的理解與總結(jié)

    開始將堆棧指針設(shè)置在內(nèi)部RAM,是因?yàn)椴皇敲總€板上都有外部RAM,而且外部RAM的大小也不相同,而且如果是SDRAM,還需要初始化,在內(nèi)部RAM開始運(yùn)行的一般是一個小的引導(dǎo)程序,基本上不怎么使用
    的頭像 發(fā)表于 04-06 19:46 ?9286次閱讀

    C語言入門教程之堆棧的詳細(xì)資料概述

    本文檔的主要內(nèi)容詳細(xì)介紹的是C語言入門教程之堆棧的詳細(xì)資料概述。
    發(fā)表于 11-29 11:47 ?12次下載

    堆棧C語言中的定義是怎么樣的

     計(jì)機(jī)領(lǐng)域,堆棧是一個不容忽視的概念,我們編寫的C語言程序基本上都要用到。但對于很多的初學(xué)著來說,堆棧是一個很模糊的概念。
    發(fā)表于 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語言大部分開發(fā)者很自然就會想到指針二字,沒錯,作為C的核心和靈魂,它的地位咱們就不再贅述了,今天我們想跟大家講的是
    的頭像 發(fā)表于 02-09 17:20 ?1099次閱讀