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

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

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

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-8-19 17:53:13 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
C 語(yǔ)言嵌入式系統(tǒng)編程修煉之三:內(nèi)存操作
一、 數(shù)據(jù)指針
        在嵌入式系統(tǒng)的編程中,常常要求在特定的內(nèi)存單元讀寫(xiě)內(nèi)容,匯編有對(duì)應(yīng)的MOV指令,而除C/C++以外的其它編程語(yǔ)言基本沒(méi)有直接訪問(wèn)絕對(duì)地址的能力。在嵌入式系統(tǒng)的實(shí)際調(diào)試中,多借助C 語(yǔ)言指針?biāo)哂械膶?duì)絕對(duì)地址單元內(nèi)容的讀寫(xiě)能力。
        以指針直接操作內(nèi)存多發(fā)生在如下幾種情況:
        (1) I/O芯片被定位在CPU的存儲(chǔ)空間而非I/O 空間,而且寄存器對(duì)應(yīng)于某特定地址;
        (2) 兩個(gè)CPU之間以雙端口RAM通信,CPU需要在雙端口RAM 的特定單元(稱為mail box)書(shū)寫(xiě)內(nèi)容以在對(duì)方CPU 產(chǎn)生中斷;
        (3) 讀取在ROM FLASH 的特定單元所燒錄的漢字和英文字模。
譬如:
        unsigned  char  *p  =  (unsigned char *) 0xF000FF00;
        *p=11;
        以上程序的意義為在絕對(duì)地址0xF0000+0xFF00(80186 使用16 位段地址和16 位偏移地址)寫(xiě)入11。
        在使用絕對(duì)地址指針時(shí),要注意指針自增自減操作的結(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語(yǔ)言指針以指向的數(shù)據(jù)類型長(zhǎng)度作自增和自減。理解這一點(diǎn)對(duì)于以指針直接操作內(nèi)存是相當(dāng)重要的。


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

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

本版積分規(guī)則

關(guān)閉

站長(zhǎng)推薦上一條 /1 下一條


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