【IAR學(xué)習(xí)】學(xué)習(xí)筆記
4、IAR編譯器默認(rèn)支持的指針變量最大為0xFFFF,如果超過(guò)0XFFFF,則需要再OPTION內(nèi)進(jìn)行設(shè)置。Project-->Option-->General-->Target-->Data model選擇Large。
原文有圖片,請(qǐng)到原文看:http://www.52solution.com/bbs/redirect.php?tid=1128&goto=lastpost
IAR學(xué)習(xí)筆記(摘抄)
IAR for AVR 學(xué)習(xí)筆記(1)--數(shù)據(jù)類型
數(shù)據(jù)類型(編譯器支持 ISO/ANSI C 基本數(shù)據(jù)類型和一些附加數(shù)據(jù)類型)
1.1.
bool 數(shù)據(jù)類型在C++語(yǔ)言里是默認(rèn)支持的。如果你在C代碼的頭文件里包含stdbool.h, bool數(shù)據(jù)類型也可以使用在C語(yǔ)言里。也可以使用布爾值 false和 true。
1.2.浮點(diǎn)數(shù)據(jù)類型:
1.3.指針類型:指針有數(shù)據(jù)指針和函數(shù)指針。
1、數(shù)據(jù)指針:
數(shù)據(jù)指針的大小為8位,16位,24位。定義為:在整型數(shù)據(jù)類型后加”*”符號(hào)。
例如:char * p;
整型數(shù)據(jù)沒(méi)有24位,具體定義指針見后面擴(kuò)展關(guān)鍵字章節(jié)。
2、函數(shù)指針:函數(shù)指針的大小為16位,24位。
指針定義:在函數(shù)類型后加”*”符號(hào)
IAR for AVR 學(xué)習(xí)筆記(2)--擴(kuò)展關(guān)鍵字
可以用來(lái)解決數(shù)據(jù),函數(shù)的存放等。有了它我們就可以定義變量存放在EEPROM,F(xiàn)LASH空間。定義中斷函數(shù),指針等等。IAR關(guān)鍵字很多,這里只列舉常用的。
2.1.?dāng)U展關(guān)鍵字:用于控制數(shù)據(jù)和指針。
__eeprom 用于EEPROM 存儲(chǔ)空間, 控制數(shù)據(jù)存放,控制指針類型和存放
__tinyflash, __flash, __farflash, __hugeflash 用于flash 存儲(chǔ)空間, 控制數(shù)據(jù)存放,控制指針類型和存放:
__ext_io, __io 用于I/O存儲(chǔ)空間, 控制數(shù)據(jù)存放,控制指針類型和存放
__regvar 放置一個(gè)變量在工作寄存器中
2.2.函數(shù)擴(kuò)展關(guān)鍵字:。
__nearfunc __farfunc 用于控制數(shù)據(jù)存放,這組關(guān)鍵字必須在函數(shù)聲明和定義的時(shí)候指定:
__interrupt. 關(guān)鍵字控制函數(shù)的類型。這組關(guān)鍵字必須在函數(shù)聲明和定義的時(shí)候指定
__root. 關(guān)鍵字僅僅控制有定義的函數(shù):
2.3.其它特別的關(guān)鍵字:
@ 用于變量的絕對(duì)地址定位。也可以用#pragma location 命令
#pragma vector 提供中斷函數(shù)的入口地址。
__root 保證沒(méi)有使用的函數(shù)或者變量也能夠包含在目標(biāo)代碼中
__no_init 禁止系統(tǒng)啟動(dòng)的時(shí)候初始化變量.
asm, __asm 插入?yún)R編代碼
IAR for AVR 學(xué)習(xí)筆記(3)--位操作
3.1.在c語(yǔ)言里對(duì)位的操作如一般如下:
PORTB|=(1<<2);//置PORTB的第2位=1
PORTB&=~(1<<2);//置PORTB的第2位=0
PORTB^|=(1<<2);//取反PORTB的第2位
While(PORTB&(1<<2));//判斷1
While(!(PORTB&(1<<2)));//判斷為0
3.2.IAR編譯器對(duì)位的支持更強(qiáng)大,除了上面的方法外還有以下更簡(jiǎn)單的操作方法:
PORTB_ Bit2=1; //置PORTB的第2位=1
PORTB_ Bit2=0; //置PORTB的第2位=0
PORTB_ Bit2=~ PORTB_ Bit2;//取反PORTB的第2位
While(PORTB_ Bit2);或者while(PORTB_Bit2==1);//判斷1
while(PORTB_ Bit2==0);//判斷0
PORTC_Bit4=PORTB_Bit2;//把PORTB的第2位傳送到PORTC的第4位
3.3.位變量定義:
由于iar使用了擴(kuò)展語(yǔ)言,它對(duì)位域的支持變?yōu)樽钚閏har類型,我們可以很方便地用來(lái)定義位變量。
采用結(jié)構(gòu)體來(lái)定義位變量:
struct
{
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
}t;
然后就可以用以下位變量了。
t.bit0=1;
t.bit0=~t.bit0;
但是采用以上結(jié)構(gòu)體做出來(lái)的位變量只可以訪問(wèn)t的位,不能夠直接訪問(wèn)變量t,和標(biāo)準(zhǔn)的IAR位操作也不一樣。采用聯(lián)合體來(lái)定義效果更佳。
#i nclude
union
{
unsigned char t;
struct
{unsigned char t_bit0:1,
t_bit1:1,
t_bit2:1,
t_bit3:1,
t_bit4:1,
t_bit5:1,
t_bit6:1,
t_bit7:1;
};
};
void main(void)
{
t_bit0=1;//訪問(wèn)變量t的位
t_bit0=~t_bit0;
PORTB=t;//直接訪問(wèn)變量t
}
位變量也可以直接定義在工作寄存器里。
3.4 bool 數(shù)據(jù)類型在C++語(yǔ)言里是默認(rèn)支持的。
評(píng)論