C 語言嵌入式系統(tǒng)編程修煉之三:內(nèi)存操作 一、 數(shù)據(jù)指針 在嵌入式系統(tǒng)的編程中,常常要求在特定的內(nèi)存單元讀寫內(nèi)容,匯編有對(duì)應(yīng)的MOV指令,而除C/C++以外的其它編程語言基本沒有直接訪問絕對(duì)地址的能力。在嵌入式系統(tǒng)的實(shí)際調(diào)試中,多借助C 語言指針?biāo)哂械膶?duì)絕對(duì)地址單元內(nèi)容的讀寫能力。 以指針直接操作內(nèi)存多發(fā)生在如下幾種情況: (1) 某I/O芯片被定位在CPU的存儲(chǔ)空間而非I/O 空間,而且寄存器對(duì)應(yīng)于某特定地址; (2) 兩個(gè)CPU之間以雙端口RAM通信,CPU需要在雙端口RAM 的特定單元(稱為mail box)書寫內(nèi)容以在對(duì)方CPU 產(chǎn)生中斷; (3) 讀取在ROM 或FLASH 的特定單元所燒錄的漢字和英文字模。 譬如: unsigned char *p = (unsigned char *) 0xF000FF00; *p=11; 以上程序的意義為在絕對(duì)地址0xF0000+0xFF00(80186 使用16 位段地址和16 位偏移地址)寫入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語言指針以指向的數(shù)據(jù)類型長度作自增和自減。理解這一點(diǎn)對(duì)于以指針直接操作內(nèi)存是相當(dāng)重要的。
[hide]
C 語言編程修煉之三內(nèi)存操作.doc
(43.5 KB, 下載次數(shù): 0)
2020-8-19 17:53 上傳
點(diǎn)擊文件名下載附件
下載積分: 聯(lián)盟幣 -5
[\hide]
|