電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 2715|回復(fù): 1
收起左側(cè)

C 語言編程修煉之三內(nèi)存操作

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-8-19 17:53:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
C 語言嵌入式系統(tǒng)編程修煉之三:內(nèi)存操作
一、 數(shù)據(jù)指針
        在嵌入式系統(tǒng)的編程中,常常要求在特定的內(nèi)存單元讀寫內(nèi)容,匯編有對應(yīng)的MOV指令,而除C/C++以外的其它編程語言基本沒有直接訪問絕對地址的能力。在嵌入式系統(tǒng)的實際調(diào)試中,多借助C 語言指針所具有的對絕對地址單元內(nèi)容的讀寫能力。
        以指針直接操作內(nèi)存多發(fā)生在如下幾種情況:
        (1) I/O芯片被定位在CPU的存儲空間而非I/O 空間,而且寄存器對應(yīng)于某特定地址;
        (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。
        在使用絕對地址指針時,要注意指針自增自減操作的結(jié)果取決于指針指向的數(shù)據(jù)類別。上例中p++后的結(jié)果是p=0xF000FF01,若p 指向int,即:
        int *p = (int *)0xF000FF00;
        p++(++p)的結(jié)果等同于:p = p + sizeof(int),而p--(--p)的結(jié)果是p = p-sizeof(int)
        同理,若執(zhí)行:        long int *p = (long int *)0xF000FF00;
        p++(++p)的結(jié)果等同于:p = p+sizeof(long int) ,而p-(-p)的結(jié)果是p = p-sizeof(long int)。
        記住:CPU 以字節(jié)為單位編址,而C語言指針以指向的數(shù)據(jù)類型長度作自增和自減。理解這一點對于以指針直接操作內(nèi)存是相當重要的。


[hide] C 語言編程修煉之三內(nèi)存操作.doc (43.5 KB, 下載次數(shù): 0) [\hide]

回復(fù)

使用道具 舉報

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

關(guān)閉

站長推薦上一條 /1 下一條


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表