久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3526|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

C語(yǔ)言指針變量訪問(wèn)ROM中數(shù)組常量的方法

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:351097 發(fā)表于 2020-2-28 16:54 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
    當(dāng)使用到ASCII碼字庫(kù)點(diǎn)陣的時(shí)候,我們習(xí)慣定義一個(gè)大的數(shù)組來(lái)存放。如果沒(méi)有指定存儲(chǔ)區(qū)域,數(shù)組一般都是保存在RAM當(dāng)中的,如果單片機(jī)的RAM空間比較緊張,就需要將數(shù)組保存在ROM當(dāng)中。對(duì)于51單片機(jī),如果只在數(shù)組前加const,只是聲明這個(gè)數(shù)組的內(nèi)容是只讀的,但是,數(shù)組還是保存在RAM中的,可以通過(guò)查看代碼空間大小進(jìn)行驗(yàn)證。網(wǎng)上還有不少人認(rèn)為只要聲明const,就是只讀的,就是放在ROM里面的,這個(gè)是錯(cuò)誤的。這個(gè)只讀只是你無(wú)法直接更改數(shù)組的內(nèi)容,因?yàn)榫幾g器會(huì)強(qiáng)制報(bào)錯(cuò)。但是,通過(guò)指針指向數(shù)組的方式,還是可以間接更改數(shù)組的內(nèi)容的。要指定數(shù)組保存在ROM里,除了需要const關(guān)鍵字,還需要加上數(shù)據(jù)存儲(chǔ)類型(區(qū)域修飾符)。對(duì)于keil,用code表明變量存放在ROM中;對(duì)于IAR for 8051,用__code表面變量存放在ROM中。由于我用的平臺(tái)是IAR for 8051,單片機(jī)是STC8A8K64S4A12,測(cè)試也是基于這個(gè)平臺(tái)。下面講一下用指針訪問(wèn)ROM中數(shù)組的方法。 首先定義一個(gè)數(shù)組                                                                                                                                                                          __code const unsignde char array[] = {0x11,0x22,0x33,0x44};//聲明數(shù)組保存在ROM里
再定義一個(gè)指針:                                                                                                                                                                                      
unsigned char __code const *p;//這是一個(gè)指針,指向code區(qū)域的unsigned char常量(const)
再獲取數(shù)組的首地址                                                                                                                                                                                      
p = array;//指向數(shù)組首地址                                                                                                                                                                           
    這里指針p一定要用__code修飾,如果不用__code修飾,會(huì)報(bào)錯(cuò)。指針可以正常訪問(wèn)ROM中數(shù)組的內(nèi)容。
不過(guò)可能有人可能會(huì)這樣做:                                                                                                                                                                           
__code const unsignde char array[] = {0x11,0x22,0x33,0x44};//聲明數(shù)組保存在ROM里                                                                                      
unsigned char *p;                                                                                                                                                                                       
p = (unsigned char*)array;//指向數(shù)組首地址   (類型強(qiáng)制轉(zhuǎn)換)                                                                                                                  
    這樣雖然編譯不會(huì)報(bào)錯(cuò),p指向的地址就是數(shù)組存放在ROM當(dāng)中的地址值,這樣看起來(lái)沒(méi)問(wèn)題,把地址值打印出來(lái)驗(yàn)證也正確,但是在使用的時(shí)候,會(huì)發(fā)現(xiàn)怎么也沒(méi)法訪問(wèn)到正確的數(shù)組內(nèi)容,而是其他內(nèi)容,感覺(jué)像是指針跑飛了一樣。其實(shí)原因很簡(jiǎn)單,定義指針p時(shí)沒(méi)有加上__code,那么p指向的地址空間是在RAM里面的。也就是在RAM中訪問(wèn)和ROM相同地址值的內(nèi)容,當(dāng)然永遠(yuǎn)也無(wú)法訪問(wèn)到數(shù)組的內(nèi)容的。                                                     
    如果硬要這樣定義指針p,也不是沒(méi)有辦法訪問(wèn)ROM中的數(shù)組。比如先將ROM數(shù)組復(fù)制到RAM中,再進(jìn)行訪問(wèn),可以按照如下操作:                    
__code const unsignde char array[] = {0x11,0x22,0x33,0x44};//聲明數(shù)組保存在ROM里                                                                                    
unsigned char *p;                                                                                                                                                                                       
unsigned char a[4];                                                                                                                                                                                      
for(unsigned char i = 0; i < 4; i++)                                                                                                                                                                  
{                                                                                                                                                                                                                  
    a[ i] = array[ i]; //直接訪問(wèn)ROM的數(shù)組,再?gòu)?fù)制到RAM中                                                                                                                                      
}
p = a;
    里面多了一個(gè)操作,再定義一個(gè)數(shù)組a,然后將數(shù)組array存放在ROM里面的內(nèi)容復(fù)制到存放在RAM里面的a,再用p指向a的地址。雖然最終也可以正常獲取數(shù)據(jù),但是效率低下,這種操作是最不值得推薦的。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 狠狠色香婷婷久久亚洲精品 | 欧美中文字幕在线 | 精品三级在线观看 | 国产精品久久久久婷婷二区次 | 亚洲国产成人精品久久 | 自拍偷拍第一页 | 色综合天天综合网国产成人网 | 亚洲午夜在线 | 亚洲一区二区三区免费在线观看 | 精品一区二区三区四区 | 欧美日韩国产精品一区二区 | 欧美日韩高清一区 | 亚洲风情在线观看 | 亚洲高清视频一区二区 | 免费在线日韩 | 国产美女精品视频 | 中文字幕在线免费视频 | 亚洲精品视频二区 | 国产精品欧美一区二区三区不卡 | 日韩三级免费观看 | 一区天堂 | 日本一区二区三区在线观看 | 欧美韩一区二区三区 | 午夜影院网站 | 天天久| 欧美老少妇一级特黄一片 | 97国产在线视频 | 欧美一级黄色片免费观看 | 中文字幕精品一区久久久久 | www.精品国产 | 亚洲乱码一区二区三区在线观看 | 国产伦精品一区二区三区照片91 | 婷婷激情五月网 | 国产三级国产精品 | 欧美精品在线一区二区三区 | 国产精品久久久久999 | 成人在线中文字幕 | 91色综合| 香蕉av免费 | 久久国产日韩欧美 | 国产精品不卡一区二区三区 |