<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 【IAR學(xué)習(xí)】學(xué)習(xí)筆記

          【IAR學(xué)習(xí)】學(xué)習(xí)筆記

          作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏

          如果你在C代碼的頭文件里包含stdbool.h, bool數(shù)據(jù)類型也可以使用在C語(yǔ)言里。也可以使用布爾值 false和 true。不過(guò)是占用8位1個(gè)字節(jié)。

          #i nclude
          #i nclude
          bool y=0;//定義位變量
          void main(void)
          {
          y=!y;//取反位變量
          PORTB_Bit3=y;//傳遞位變量
          }

          IAR for AVR 學(xué)習(xí)筆記(4)--Flash操作

          FLASH常用類型的具體操作方法

          4.1.FLASH 區(qū)域數(shù)據(jù)存儲(chǔ)。

          用關(guān)鍵字 __flash 控制來(lái)存放, __ flash 關(guān)鍵字寫在數(shù)據(jù)類型前后效果一樣
          __flash unsigned char a;//定義一個(gè)變量存放在flash空間
          unsigned char __flash a;//效果同上
          __flash unsigned char p[];//定義一個(gè)數(shù)組存放在flash空間
          對(duì)于flash空間的變量的讀操作同SRAM數(shù)據(jù)空間的操作方法一樣,編譯器會(huì)自動(dòng)用
          LPM,ELPM 指令來(lái)操作。

          例:

          #i nclude
          __flash unsigned char p[];
          __flash unsigned char a;
          void main(void)
          {PORTB=p[1];// 讀flash 數(shù)組變量的操作
          PORTB=a;// 讀flash 變量的操作
          }

          由于在正常的程序中,flash 空間是只讀的,所以沒(méi)有賦值的變量是沒(méi)有意義的。定義常數(shù)在flash 空間,只要給變量賦與初值就可以了。由于常數(shù)在flash空間的地址是隨機(jī)分配的,讀取變量才可以讀取到常數(shù)值。

          10

          IAR-AVR –C 編譯器簡(jiǎn)要指南

          __flash unsigned char a=9;//定義一個(gè)常數(shù)存放在EEPROM空間。
          __flash unsigned char p[]={1,2,3,4,5,6,7,8};
          //定義一個(gè)組常數(shù)存放在flash 空間。

          例:

          #i nclude
          __flash unsigned char p[]={1,2,3,4,5,6,7,8};
          __flash unsigned char a=9;
          void main(void)
          {
          PORTB=a;//讀取flash 空間值9
          PORTC=p[0]; //讀取flash 空間值
          }

          4.1.2flash 空間絕對(duì)地址定位:

          __flash unsigned char a @ 0x8;//定義變量存放在flash 空間0X08單元__flash unsigned char p[] @ 0x22//定義數(shù)組存放在flash 空間,開始地址為0X22單元
          __flash unsigned char a @ 0x08=9;//定義常數(shù)存放在flash 空間0X08單元
          __flash unsigned char p[] @ 0x22={1,2,3,4,5,6,7,8};
          //定義一個(gè)組常數(shù)存放在EEPROM空間開始地址為0X22單元

          由于常數(shù)在flash 空間的地址是已經(jīng)分配的,讀取flash 空間值可以用變量和地址。

          4.2.與 __flash 有關(guān)的指針操作。 __flash 關(guān)鍵字控制指針的存放和類型。

          4.2.1指向flash 空間的指針flash 指針(控制類型屬性)

          unsigned char __flash * p;//定義指向flash 空間地址的指針,8位。
          unsigned int __flash * p;//定義個(gè)指向flash 空間地址的指針,16位。
          unsigned int __farflash * p;//定義指向flash 空間地址的指針,24位。
          unsigned int __hugeflash * p;//定義指向flash 空間地址的指針,24位。
          unsigned char __flash * p;//定義一個(gè)指向flash 空間地址的指針,指針本身存放在SARM中。P的值代表flash 空間的某一地址。*p表示flash 空間該地址單元存放的內(nèi)容。例:假定p=10,表示flash空間地址10單元,而flash M空間10單元的內(nèi)容就用*p來(lái)讀取。

          例:

          #i nclude
          char __flash t @ 0x10 ;
          char __flash *p ;
          void main(void)
          {
          PORTB=*p;//讀取flash 空間10單元的值
          PORTB=*(p+3);//讀取flash 空間0x13單元的值
          }

          4.2.2.存儲(chǔ)于flash 空間的指針數(shù)據(jù)指針

          就象存儲(chǔ)與flash 空間的數(shù)據(jù)一樣控制存儲(chǔ)屬性

          __flash unsigned char * p; //定義指向SARMM空間地址的指針,指針本身存放在flash 中。

          4.3.控制數(shù)據(jù)和指針存放的__flash 定義必須是全局變量,控制類型屬性(好像只有指針)可以是局部變量。

          #i nclude
          __flash unsigned char p;//控制存放
          void main(void)
          {
          unsigned char __flash* t;//控制屬性
          PORTB=p;
          PORTB=*t;
          }

          4.4. __root 關(guān)鍵字保證沒(méi)有使用的函數(shù)或者變量也能夠包含在目標(biāo)代碼中.

          定義存放在__flash 空間的數(shù)據(jù)在程序編譯時(shí)會(huì)自動(dòng)生成代碼嵌入到flash代碼中,對(duì)于程序沒(méi)有使用也要求編譯的數(shù)據(jù)(比如可以在代碼中嵌入你的版本號(hào),時(shí)間等)必須加關(guān)鍵字__root 限制。

          例:

          #i nclude
          __root __flash unsigned char p @ 0x10 =0x56;
          void main(void)
          {}

          程序沒(méi)有使用P變量,編譯也會(huì)生成該代碼。

          :020000020000FC
          :1000000016C018951895189518951895189518955F
          :10001000569518951895189518951895189518953A
          :10002000189518951895089500008895FECF0FE94A
          :100030000DBF00E00EBFC0E8D0E003D0F4DFF4DF76
          :06004000F3CF01E008957A
          :0400000300000000F9
          :00000001FF

          4.5.flash 操作宏函數(shù):在comp_a90.h intrinsics.h頭文件里有詳細(xì)說(shuō)明。flash 空間具正常情況下有只讀性能,對(duì)于讀flash 數(shù)據(jù)編譯器會(huì)自動(dòng)編譯對(duì)應(yīng)的LPM,ELPM指令,但對(duì)于flash 空間的自編程寫命令SPM就沒(méi)有對(duì)應(yīng)的C指令了,這里不講解詳細(xì)的自編程方法,只是講解一下對(duì)flash 的讀寫函數(shù)。

          直接在程序中讀取flash 空間地址數(shù)據(jù):要包含intrinsics.h頭文件
          __load_program_memory(const unsigned char __flash *);//64K空間
          //從指定flash 空間地址讀數(shù)據(jù)。該函數(shù)在intrinsics.h頭文件里有詳細(xì)說(shuō)明。

          在comp_a90.h文件有它的簡(jiǎn)化書寫_LPM(ADDR)。注意匯編指令LPM Rd ,Z中的Z是一個(gè)指針。所以用(const unsigned char __flash *)來(lái)強(qiáng)制轉(zhuǎn)換為指向flash空間地址指針。故該條宏函數(shù)的正確寫法應(yīng)該如下:

          __load_program_memory((const unsigned char __flash *)ADDR);

          例:

          #i nclude
          #i nclude
          void main(void)
          {PORTB=__load_program_memory((const unsigned char __flash *)0x12);
          }

          該條函數(shù)書寫不方便,在comp_a90.h文件有簡(jiǎn)化:

          #define _LPM(ADDR) __load_program_memory (ADDR)稍微方便一點(diǎn)。改為
          #define _LPM(ADDR) __load_program_memory ((const unsigned char
          __flash *)ADDR)就更方便了,直接使用數(shù)據(jù)就可以了。

          例:

          #i nclude
          #i nclude
          #i nclude
          void main(void)
          {
          PORTB=__LPM(0x12);// 從指定flash 空間地址單元0x12中讀數(shù)據(jù)
          }
          __extended_load_program_memory(const unsigned char __farflash *);
          //128K空間_ELPM(ADDR); //128K空間

          參照上面的理解修改可以書寫更簡(jiǎn)單。

          4.6.自編程函數(shù):

          _SPM_GET_LOCKBITS();//讀取縮定位
          _SPM_GET_FUSEBITS();//讀取熔絲位
          _SPM_ERASE(Addr);//16位頁(yè)擦除
          _SPM_FILLTEMP(Addr,Word);//16位頁(yè)緩沖
          _SPM_PAGEWRITE(Addr;)//16位頁(yè)寫入
          _SPM_24_ERASE(Addr); //24位頁(yè)擦除
          _SPM_24_FILLTEMP(Addr,Data); //24位頁(yè)緩沖
          _SPM_24_PAGEWRITE(Addr) //24位頁(yè)寫入

          IAR for AVR 學(xué)習(xí)筆記(5)--SRAM操作

          SARM數(shù)據(jù)類型的具體操作方法

          SARM空間是AVR單片機(jī)最重要的部分,所有的操作必須依賴該部分來(lái)完成。變量在SARM空間的存儲(chǔ)模式有tiny ,small large 三種,也就是對(duì)應(yīng)于__tiny, __near __far三中存儲(chǔ)屬性。一旦選擇為哪種存儲(chǔ)模式,對(duì)應(yīng)的數(shù)據(jù)默認(rèn)屬性也就確定了,但可以采用__tiny, __near __far關(guān)鍵字來(lái)更改。

          對(duì)于程序中的局部變量,編譯器會(huì)自動(dòng)處理的,我們也不可能加什么儲(chǔ)存屬性,但I(xiàn)AR提供了強(qiáng)大的外部變量定義。

          5.1.定義變量在工作寄存器

          IAR編譯器內(nèi)部使用了部分工作寄存器,留給用戶的只有R4-R15供12個(gè)寄存器供用戶使用,要使用工作寄存器必須在工程選項(xiàng)里打開鎖定選項(xiàng)。

          例:

          定義兩個(gè)變量使用工作寄存器R14,R15。

          #i nclude
          __regvar __no_init char g @ 15;
          __regvar __no_init char P @ 14;
          void main(void)
          {
          g++;
          P++;
          }

          在工程選項(xiàng)里c/c++ complier>code里打開要使用的寄存器R14-R15。

          編譯結(jié)果就如下,看看是不是直接使用了寄存器做為數(shù)據(jù)應(yīng)用

          // 4 void main(void)
          main:
          CFI Block cfiBlock0 Using cfiCommon0
          CFI Function main
          // 5 { g++;
          REQUIRE ?Register_R14_is_global_regvar
          REQUIRE ?Register_R15_is_global_regvar
          INC R15
          // 6 P++; }
          INC R14
          RET

          注意:定義在寄存器里變量不能帶有初始值。最好不要使用超過(guò)9個(gè)寄存器變量,不然可能引起潛在的危險(xiǎn),因?yàn)榻?kù)的時(shí)候沒(méi)有鎖定任何寄存器。

          5.2.定義變量的絕對(duì)地址.沒(méi)有特性的變量是隨機(jī)分配的,要給變量分配地址必須加以特性修飾注意在定義地址的時(shí)候千萬(wàn)不要和片內(nèi)寄存器地址重合了。



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();