當前位置:首頁 » 編程語言 » c語言data

c語言data

發布時間: 2024-12-22 11:34:31

c語言中,關鍵字data是什麼意思

這是單片機C語言中特有的關鍵字,表示數據存儲區,標准C語言中是沒有的,如

int data x ;

表示將 x 定義在數據存儲區。

單片機的C語言採用C51編譯器。由C51產生的目標代碼短,運行速度高,存儲空間小,符合C語言的ANSI標准,生成的代碼遵循Intel目標文件格式,而且可與A51匯編語言PL/M51語言目標代碼混合使用。

(1)c語言data擴展閱讀:

單片機的C語言:

單片機軟體設計使用C語言作為編程開發軟體,採用模塊化的程序結構,設計了按鍵模塊程序、RFID模塊程序、日歷時鍾模塊程序、GPRS模塊程序、顯示存儲模塊程序等,並編寫系統主程序,將五個程序模塊組合在一起,實現單片機控制系統的整體功能。

51單片機支持三種高級語言,即PL/M,C和BASIC。C語言是一種通用的程序設計語言,其代碼率高,數據類型及運算符豐富,並具有良好的程序結構,適用於各種應用的程序設計,是使用較廣的單片機編程語言。

單片機的C語言採用C51編譯器(簡稱C51)。有C51產生的目標代碼短,運行速度高,所需存儲空間小,符合C語言的ANSI標准,生成的代碼遵循Intel目標文件格式,而且可與A51匯編語言或PL/M51語言目標代碼混合使用。

㈡ C語言代碼組成 - BSS、Data、Stack、Heap、Code、Const

一段C語言經過編譯連接後,成為一段可以運行的代碼,可運行的代碼可以分為以下四個部分組成:全局變數/靜態變數區、堆、棧、代碼區。其中全局變數/靜態變數區又分為未初始化變數區和初始化變數區,代碼區又分為代碼和常量區。即匯總下來,代碼可以分為6部分組成,包括:BSS區(未初始化的全局變數/靜態變數區)、Data區(實始化的全局變數區)、Stack區(棧區)、heap區(堆區)、Code區(代碼區)、const區(常量區)。

一、BSS區和Data區

C語言編程中定義的全局變數、靜態局部變數,就是分配在全局變數/靜態變數區域,但是為什麼又要分為BSS區域和Data區域呢?其實我們在定義全局或者靜態變數區,有時我會對它賦初始值,有的又不會賦初始化,比如我們定義的全局變數,初始化的賦值,是怎麼樣寫到變數區域中的,我們定義的靜態局部變數,在定義時初始化後,為什麼後面函數被調用,又不會再初始化呢?這個局部靜態變數是怎麼樣實始化的,什麼時候初始化的?

如果分析編譯後的匯編代碼,就會發現在代碼運行起來後,會有一段給變數賦值的指令,這一段代碼,不是我們C代碼對應的匯編,而是C編譯器生成的匯編譯代碼,這段代碼的作用就是給初始化了的靜態變數和全局變數進行初始化。這也是為什麼全局/靜態變數區域,要分BSS和Data的原因。

二、Stack區

棧是一種先進後出的數據結構,這種數據結構正好完美的匹配函數調用時的模型過程,比如函數f(a)在運行過程中調用函數f(b),f(a)在運行過程中的變數就是分配在棧中,通過在調用f(b)前,會將代碼中用到的R0~Rn寄存器的值保存到棧中,同時將函數的傳入參數寫入到棧中,然後進入f(b)函數,函數f(b)的變數b分配在棧中,當函數運行完畢後,釋放變數b,將棧中存放的f(a)函數的運行的R0~Rn寄存器值恢復到寄存器中,同時f(b)的返回結果存入到棧中,這樣f(a)繼續運行。當一個函數運行完畢後,它在棧中分配的臨時變數會全部釋放。

對於中斷也是一樣的,中斷發生時,也是一個函數打斷了另一個函數的運行,這種現場的保存(即寄存器的值),都是通過棧來完成的。所以棧的作用有:

三、Heap區

全局變數分配的內存在代碼整個運行周期內都是有效的,而在棧區分配的內存在函數調用完成後,就會釋放。這兩種內存模型都是由編譯器決定它的使用,代碼是無法控制的。那有沒有內存是由用戶控制的,要用時,就自由分配,不用時,就自行釋放?答案是肯定的,這部分內存就是堆。

用戶需要使用的動態內存,就是通過malloc函數,調用分配的,在沒有釋放前,可一直由代碼使用。當這部分內存不再需要使用時,可以通過free函數進行釋放,將它歸還到堆中。從這中可以看出,堆的內存,是按需分配的。這就是賦予了代碼很大的自由度,但這也是會帶來負作用的,比如:內存碎片化導致的malloc失敗;忘記釋放內存導致的內存泄露,而這些往往是致命的失誤。

四、Code區

代碼區就是編譯後機器指令,這些指令決定了功能的執行。我們編譯的代碼一般是下載進flash中,但是運行,卻有兩種方式:在RAM中運行和在ROM中運行。 在RAM中運行,即是boot啟動後,將flash中的代碼復制到RAM中,然後PC指針在指到RAM中的代碼中開始運行。 有時在調試時,我們可以直接將代碼下載進RAM中運行進行調試,這樣加快調試速度。便是大部分的情況我們的代碼是從flash中開始運行的。

五、常量區

代碼中的常量,一部分是作為立即數,在代碼區中,但是像定義的字元串、給某數組賦值的一串數值,這些常量,就存在常量區,我們常用const來定義一個常量,即該變數不能再必變。這部分的變數,編譯器一般將它定義的flash中。

六、各個區域大小的是如何決定的:

code區和const區:是由代碼的大小和代碼中常量的多少來決定的。

bss區和data區:這是由代碼中定義的全局變數和局部變數的多少來決定的。

stack區:這個可以由使用都自行定義大小,但使用都要根據自已代碼的情況,評估出一個合理的值,再定義其大小,如果定義的太小,很容易爆棧,導至代碼異常,但是如果定義的太大,就容易浪費內存。

heap區:RAM剩下的部分,編譯器就會作為堆區使用。

七、嵌入式代碼一般啟動過程

以STM32為例,通過分析其匯編啟支代碼,大致可以分為以下幾個步驟:

如果大家想看編譯扣,代碼文件的組成,可以查看統後生的map文件,裡面有詳細的數據,包括各個函數的分配內存,BSS,Data,Stack,Heap,Text的分配情況。

如果相要了解詳細的代碼啟動過程,可看它的啟動匯編文件。

㈢ 詳細講解C語言五大內存分區與可執行程序的三段(Text段、Date段、Bss段)【建議收藏】

本文詳細講解C語言五大內存分區與可執行程序的三段(Text段、Data段、Bss段)。
首先,C語言五大內存分區包括:靜態內存、動態內存、棧內存、堆內存和文件I/O內存。靜態內存用於存儲全局變數和靜態變數,動態內存由new和malloc函數分配,棧內存用於函數調用時的局部變數和函數參數,堆內存用於動態分配和管理,文件I/O內存用於文件讀寫操作。
其次,可執行程序的三段分別為:Text段、Data段、Bss段。Text段存儲了程序的機器代碼,Data段存儲了程序的全局變數和靜態變數的初始值,Bss段用於存放未初始化的全局變數和靜態變數。Text段和Data段是只讀的,而Bss段是可讀可寫的。
在可執行程序內存空間與邏輯地址空間的映射與劃分上,執行文件通常被映射到進程的邏輯地址空間中。執行文件的文本、數據和Bss段分別映射到進程的文本、數據和Bss段。
接著,存儲類型關鍵字定義了變數的存儲類型,如static、extern、auto和register。這影響了變數的作用域和生命周期。靜態變數在全局或文件級作用域中,其生命周期在程序運行期間一直存在;外部變數在文件級作用域中,其值在程序運行期間始終存在;自動變數在函數作用域中,其值在函數調用結束後釋放;寄存器變數在函數調用期間使用,以提高執行效率。
在堆與棧的區別上,堆和棧在申請方式、申請後的系統響應、申請大小限制、申請效率、存儲內容以及存取效率上有所不同。在運行時刻賦值的變數通常在堆中分配,而編譯時已經確定的變數通常在棧中分配。在存取效率上,棧上的數組比指針指向的字元串更快。

熱點內容
解壓游戲香皂 發布:2024-12-22 16:49:29 瀏覽:352
新預演算法的亮點 發布:2024-12-22 16:36:30 瀏覽:959
linux命令行快捷鍵 發布:2024-12-22 16:33:27 瀏覽:10
淘寶網怎麼上傳寶貝 發布:2024-12-22 16:30:53 瀏覽:753
伺服器gps是什麼意思 發布:2024-12-22 16:10:43 瀏覽:996
iqoo安卓11變聲器在哪裡 發布:2024-12-22 15:46:45 瀏覽:252
ie鎖定初始密碼在哪裡找 發布:2024-12-22 15:44:48 瀏覽:296
linuxtcp窗口 發布:2024-12-22 15:34:24 瀏覽:948
安卓官翻機和原裝有什麼區別 發布:2024-12-22 15:34:24 瀏覽:662
linux掛載的磁碟 發布:2024-12-22 15:34:23 瀏覽:234