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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

嵌入式C語言高手煉成之內(nèi)存操作篇

電子工程技術 ? 來源:電子工程技術 ? 2023-12-11 17:20 ? 次閱讀

數(shù)據(jù)指針

嵌入式系統(tǒng)編程中,常常要求在特定的內(nèi)存單元讀寫內(nèi)容,匯編有對應的MOV指令,而除C/C++以外的其它編程語言基本沒有直接訪問絕對地址的能力。在嵌入式系統(tǒng)的實際調(diào)試中,多借助C語言指針所具有的對絕對地址單元內(nèi)容的讀寫能力。以指針直接操作內(nèi)存多發(fā)生在如下幾種情況:

(1) 某I/O芯片被定位在CPU的存儲空間而非I/O空間,而且寄存器對應于某特定地址;

(2) 兩個CPU之間以雙端口RAM通信,CPU需要在雙端口RAM的特定單元(稱為mail box)書寫內(nèi)容以在對方CPU產(chǎn)生中斷;

(3) 讀取在ROM或FLASH的特定單元所燒錄的漢字和英文字模。


譬如:

unsigned char *p = (unsigned char *)0xF000FF00;
*p="11";

以上程序的意義為在絕對地址0xF0000+0xFF00(80186使用16位段地址和16位偏移地址)寫入11。

在使用絕對地址指針時,要注意指針自增自減操作的結果取決于指針指向的數(shù)據(jù)類別。上例中p++后的結果是p= 0xF000FF01,若p指向int,即:

int *p = (int *)0xF000FF00;
p++(或++p)的結果等同于:p = p+sizeof(int),而p-(或-p)的結果是p = p-sizeof(int)。

記?。篊PU以字節(jié)為單位編址,而C語言指針以指向的數(shù)據(jù)類型長度作自增和自減。理解這一點對于以指針直接操作內(nèi)存是相當重要的。

函數(shù)指針

首先要理解以下三個問題:

(1)C語言中函數(shù)名直接對應于函數(shù)生成的指令代碼在內(nèi)存中的地址,因此函數(shù)名可以直接賦給指向函數(shù)的指針;

(2)調(diào)用函數(shù)實際上等同于"調(diào)轉(zhuǎn)指令+參數(shù)傳遞處理+回歸位置入棧",本質(zhì)上最核心的操作是將函數(shù)生成的目標代碼的首地址賦給CPU的PC寄存器;

(3)因為函數(shù)調(diào)用的本質(zhì)是跳轉(zhuǎn)到某一個地址單元的code去執(zhí)行,所以可以"調(diào)用"一個根本就不存在的函數(shù)實體,暈?請往下看:

請拿出你可以獲得的任何一本大學《微型計算機原理》教材,書中講到,186 CPU啟動后跳轉(zhuǎn)至絕對地址0xFFFF0(對應C語言指針是0xF000FFF0,0xF000為段地址,0xFFF0為段內(nèi)偏移)執(zhí)行,請看下面的代碼:

typedef void (*lpFunction) ( ); /* 定義一個無參數(shù)、無返回類型的*/
/* 函數(shù)指針類型*/
lpFunction lpReset = (lpFunction)0xF000FFF0; /* 定義一個函數(shù)指針,指向*/
/* CPU啟動后所執(zhí)行第一條指令的位置*/
lpReset(); /* 調(diào)用函數(shù)*/

在以上的程序中,我們根本沒有看到任何一個函數(shù)實體,但是我們卻執(zhí)行了這樣的函數(shù)調(diào)用:lpReset(),它實際上起到了"軟重啟"的作用,跳轉(zhuǎn)到CPU啟動后第一條要執(zhí)行的指令的位置。

記?。汉瘮?shù)無它,唯指令集合耳;你可以調(diào)用一個沒有函數(shù)體的函數(shù),本質(zhì)上只是換一個地址開始執(zhí)行指令!

數(shù)組vs.動態(tài)申請

在嵌入式系統(tǒng)中動態(tài)內(nèi)存申請存在比一般系統(tǒng)編程時更嚴格的要求,這是因為嵌入式系統(tǒng)的內(nèi)存空間往往是十分有限的,不經(jīng)意的內(nèi)存泄露會很快導致系統(tǒng)的崩潰。

所以一定要保證你的malloc和free成對出現(xiàn),如果你寫出這樣的一段程序:

char * function(void)
{
char *p;
p = (char *)malloc(…);
if(p==NULL)
…;
… /* 一系列針對p的操作*/
return p;
}

在某處調(diào)用function(),用完function中動態(tài)申請的內(nèi)存后將其free,如下:

char *q = function();

free(q);

上述代碼明顯是不合理的,因為違反了malloc和free成對出現(xiàn)的原則,即"誰申請,就由誰釋放"原則。不滿足這個原則,會導致代碼的耦合度增大,因為用戶在調(diào)用function函數(shù)時需要知道其內(nèi)部細節(jié)!

正確的做法是在調(diào)用處申請內(nèi)存,并傳入function函數(shù),如下:

char *p="malloc"(…);
if(p==NULL)
…;
function(p);

free(p);
p="NULL";

而函數(shù)function則接收參數(shù)p,如下:

void function(char *p)
{
… /* 一系列針對p的操作*/
}

基本上,動態(tài)申請內(nèi)存方式可以用較大的數(shù)組替換。對于編程新手,筆者推薦你盡量采用數(shù)組!嵌入式系統(tǒng)可以以博大的胸襟接收瑕疵,而無法"海納"錯誤。畢竟,以最笨的方式苦練神功的郭靖勝過機智聰明卻范政治錯誤走反革命道路的楊康。

給出原則:

(1)盡可能的選用數(shù)組,數(shù)組不能越界訪問(真理越過一步就是謬誤,數(shù)組越過界限就光榮地成全了一個混亂的嵌入式系統(tǒng));

(2)如果使用動態(tài)申請,則申請后一定要判斷是否申請成功了,并且malloc和free應成對出現(xiàn)!


const在C++語言中則包含了更豐富的含義,而在C語言中僅意味著:"只能讀的普通變量",可以稱其為"不能改變的變量"(這個說法似乎很拗口,但卻最準確的表達了C語言中const的本質(zhì)),在編譯階段需要的常數(shù)仍然只能以#define宏定義!故在C語言中如下程序是非法的:

關鍵字const

const意味著"只讀"。區(qū)別如下代碼的功能非常重要,也是老生常談,如果你還不知道它們的區(qū)別,而且已經(jīng)在程序界摸爬滾打多年,那只能說這是一個悲哀: const int a;
int const a;
const int *a;
int * const a;
int const * a const;
const int SIZE = 10;
char a[SIZE]; /* 非法:編譯階段不能用到變量*/

關鍵字volatile

volatile變量可能用于如下幾種情況:
(1) 并行設備的硬件寄存器(如:狀態(tài)寄存器,例中的代碼屬于此類);
(2) 一個中斷服務子程序中會訪問到的非自動變量(也就是全局變量);
(3) 多線程應用中被幾個任務共享的變量。

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

    關注

    5059

    文章

    18973

    瀏覽量

    302015
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10804

    瀏覽量

    210828
  • C語言
    +關注

    關注

    180

    文章

    7594

    瀏覽量

    135856

原文標題:嵌入式C語言高手煉成之內(nèi)存操作篇

文章出處:【微信號:EngicoolArabic,微信公眾號:電子工程技術】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    嵌入式C語言知識點總結

    怎么才能做好嵌入式開發(fā)?學好C語言吧!今天就來推薦一大佬寫的嵌入式C
    發(fā)表于 09-27 09:53 ?1160次閱讀

    如何成為一名嵌入式C語言高手?

    如何成為一名嵌入式C語言高手? 嵌入式系統(tǒng)是當今科技領域的核心,而C
    發(fā)表于 03-25 14:12

    如何成為一名嵌入式C語言高手?

    如何成為一名嵌入式C語言高手? 嵌入式系統(tǒng)是當今科技領域的核心,而C
    發(fā)表于 04-07 16:03

    嵌入式大咖是如何煉成的?

    的設計實現(xiàn),包括器件選型、原理圖和PCB設計、電路調(diào)試,都需要過硬的電路基礎。2C語言C語言嵌入式開發(fā)中最重要的編程
    發(fā)表于 01-30 09:38

    嵌入式工程師是如何煉成

    管理工具,Shell Makefile腳本編寫等知識,以及嵌入式開發(fā)環(huán)境的搭建;其次要了解C語言,C語言
    發(fā)表于 04-17 09:31

    標準C語言嵌入式C語言有哪些區(qū)別

    嵌入式系統(tǒng)是各行各業(yè)的具體應用相結合的產(chǎn)物。例如計算機技術、半導體技術、電子技術。其更在乎效率和內(nèi)存有效使用。嵌入式系統(tǒng)是一個技術密集、資金密集、高度分散、不斷創(chuàng)新的知識集成系統(tǒng)。C
    發(fā)表于 12-14 06:15

    嵌入式系統(tǒng)C語言操作的移植與優(yōu)化

    嵌入式系統(tǒng)C語言操作的移植與優(yōu)化   單片機的應用越來越廣泛,種類也越來越多。由于嵌入式C
    發(fā)表于 03-29 15:15 ?1067次閱讀

    嵌入式c語言編程(由淺入深)

    本內(nèi)容詳細介紹了嵌入式c語言編程的各項知識,包括嵌入式c語言編程,
    發(fā)表于 11-02 14:37 ?0次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>c</b><b class='flag-5'>語言</b>編程(由淺入深)

    嵌入式系統(tǒng)編程之內(nèi)存操作學習

    嵌入式系統(tǒng)編程之內(nèi)存操作學習 1.數(shù)據(jù)指針 在嵌入式系統(tǒng)的編程中,常常要求在特定的內(nèi)存單元讀寫內(nèi)容,匯編有對應的MOV指令,而除
    發(fā)表于 09-08 18:11 ?344次閱讀

    嵌入式底層開發(fā)為什么選擇C語言

    嵌入式底層開發(fā)為什么選擇C語言嵌入式系統(tǒng)的編寫語言主要是C
    發(fā)表于 10-20 13:35 ?2次下載
    <b class='flag-5'>嵌入式</b>底層開發(fā)為什么選擇<b class='flag-5'>C</b><b class='flag-5'>語言</b>

    標準c語言嵌入式,嵌入式C語言C語言的區(qū)別

    嵌入式C語言C語言的區(qū)別:最常用的系統(tǒng)編程語言C
    發(fā)表于 10-20 14:06 ?6次下載
    標準<b class='flag-5'>c</b><b class='flag-5'>語言</b>與<b class='flag-5'>嵌入式</b>,<b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>與<b class='flag-5'>C</b><b class='flag-5'>語言</b>的區(qū)別

    嵌入式linux c語言,嵌入式LinuxC語言開發(fā)工具.pdf

    至關重要的,它直接影響到程序開發(fā)的效率。因此,希望讀者能自己動手操作,切實熟練掌握這些工具的使用。通過本章的學習,讀者將會掌握如下內(nèi)容:C 語言的產(chǎn)生歷史背景嵌入式Linux 下
    發(fā)表于 11-01 17:38 ?12次下載
    <b class='flag-5'>嵌入式</b>linux <b class='flag-5'>c</b><b class='flag-5'>語言</b>,<b class='flag-5'>嵌入式</b>LinuxC<b class='flag-5'>語言</b>開發(fā)工具.pdf

    C語言嵌入式培訓 嵌入式C語言程序設計基礎

      學習嵌入式的基礎語言C語言,因此先掌握C語言對于后續(xù)
    發(fā)表于 11-03 21:06 ?32次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>嵌入式</b>培訓  <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>程序設計基礎

    嵌入式C語言知識點總結

    導讀:怎么做好嵌入式?相信這個問題無論問誰你都會得到一句學好C語言!今天推薦一大佬寫的嵌入式C
    的頭像 發(fā)表于 04-13 11:12 ?2667次閱讀

    嵌入式C語言的結構特點

    嵌入式開發(fā)中既有底層硬件的開發(fā)又涉及上層應用的開發(fā),即涉及系統(tǒng)的硬件和軟件,C語言既具有匯編語言操作底層的優(yōu)勢,又具有高級
    的頭像 發(fā)表于 11-24 16:16 ?617次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>的結構特點