亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標(biāo)題: 嵌入式內(nèi)存的讀寫(xiě)方法,以及強(qiáng)制類型轉(zhuǎn)換的知識(shí)點(diǎn) [打印本頁(yè)]

作者: lianyiqun    時(shí)間: 2015-7-8 21:39
標(biāo)題: 嵌入式內(nèi)存的讀寫(xiě)方法,以及強(qiáng)制類型轉(zhuǎn)換的知識(shí)點(diǎn)
由函數(shù)flash讀取,type為0代表128字節(jié)儲(chǔ)存區(qū),為1代表64K存儲(chǔ)區(qū)(512字節(jié)/扇區(qū))
void InterFlashRead(unsigned short addr, unsigned char nLength, unsigned char* dat)
{
unsigned char i;
EA = 0;
PSCTL=0x04;
FLSCL = 0x00;
for(i=0; i
{
*(dat+i) = *(unsigned char code*)(addr+i);
}
PSCTL = 0;
EA = 1;
}
而想到的問(wèn)題,其中的   *(dat+i)= *(unsigned char code *)(addr+i);是什么意思呢?
這里面定義的dat是char型指針,也就是說(shuō)一個(gè)指針(地址)保存一個(gè)字節(jié)的數(shù)據(jù),然而addr這個(gè)地址是short型,addr是一個(gè)指針保存2個(gè)字節(jié)的數(shù)據(jù),所以要進(jìn)行強(qiáng)制的類型轉(zhuǎn)換,(unsignedchar code *)這一部分就是強(qiáng)制轉(zhuǎn)換

這里要明確的是如果我們對(duì)一個(gè)整型強(qiáng)制轉(zhuǎn)換時(shí)可以用下列例子描述:
unsigned inta=0x1234;
b=(unsigned char)a;
那么b就等于0x34   (,[size=14.399999618530273px]int型數(shù)值賦給char型變量[size=14.399999618530273px]時(shí),只保留其最低8位,高位部分舍棄)
[size=14.399999618530273px]

[size=14.545454025268555px]但是這個(gè)例子當(dāng)中涉及到了指針的操作,首先把a(bǔ)ddr是一個(gè)地址值,相當(dāng)于指針當(dāng)中的&p的值比如是0x1111,那么(unsignedchar code*)(addr+i)這一步就是轉(zhuǎn)換成指向這個(gè)地址的指針,指針的值是0x1111,前面再加一個(gè)*號(hào)就表示取值,哈哈,就這么理解。


2、以前看到#define SREG   (*(volatile unsigned char*)0x5F)這樣的定義,總是感覺(jué)很奇怪,不知道為什么,今天終于有了一點(diǎn)點(diǎn)心得,請(qǐng)大蝦們多多批磚~~~
    嵌入式系統(tǒng)編程,要求程序員能夠利用C語(yǔ)言訪問(wèn)固定的內(nèi)存地址。既然是個(gè)地址,那么按照C語(yǔ)言的語(yǔ)法規(guī)則,這個(gè)表示地址的量應(yīng)該是指針類型。所以,知道要訪問(wèn)的內(nèi)存地址后,比如0x5F,
    第一步是要把它強(qiáng)制轉(zhuǎn)換為指針類型
(unsigned char *)0x5F,AVR的SREG是八位寄存器,所以0x5F強(qiáng)制轉(zhuǎn)換為指向unsignedchar類型。
  volatile(可變的)這個(gè)關(guān)鍵字說(shuō)明這變量可能會(huì)被意想不到地改變,這樣編譯器就不會(huì)去假設(shè)這個(gè)變量的值了。這種“意想不到地改變”,不是由程序去改變,而是由硬件去改變——意想不到。
  第二步,對(duì)指針變量解引用,就能操作指針?biāo)赶虻牡刂返膬?nèi)容了
   *(volatile unsigned char*)0x5F
  第三步,小心地把#define宏中的參數(shù)用括號(hào)括起來(lái),這是一個(gè)很好的習(xí)慣,所以#defineSREG    (*(volatile unsigned char*)0x5F)
   類似的,如果使用一個(gè)32位處理器,要對(duì)一個(gè)32位的內(nèi)存地址進(jìn)行訪問(wèn),可以這樣定義:
    #define RAM_ADDR    (*(volatile unsigned long *)0x0000555F)
   然后就可以用C語(yǔ)言對(duì)這個(gè)內(nèi)存地址進(jìn)行讀寫(xiě)操作了
    讀:tmp = RAM_ADDR;
    寫(xiě):RAM_ADDR = 0x55;




作者: C羅戴帽    時(shí)間: 2017-7-7 13:34
mark一下,總結(jié)得不錯(cuò)
作者: zwf    時(shí)間: 2017-9-22 16:12
樓主辛苦了!!謝謝




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1