M16C
R8C/M16C提供一系列預處理指令,能夠很好的優化C代碼。?
本文以nc30編譯器為例,談談#pragma的用法。?
1)。與內存有關的命令?
#pragma ROM?
將一個變量放入ROM里面,比如:?
#pragma ROM aa?
int aa;?
#pragma BIT?
位變量申明。表示將一個變量放在能夠進行位操作指令的地址區,比如:?
#pragma BIT aa;?
struct _aa{?
char bit0:1;?
char bit: 7;?
}aa;?
aa.bit0 = 1;?
#pragma SBDATA?
申明訪問變量是基于SB寄存器尋址的方式,如:?
#pragma SBDATA aa;?
int aa;?
訪問aa時,是基于SB寄存器尋址的?
#pragma SECTION?
將程序或變量什么在某個區域?
#pragma STRUCT?
結構體對齊申明?
#pragma STRUCT _aa unpacked?
struct _aa{?
int aa;?
char bb;?
};?
表示結構體_aa不對齊?
#pragma EXT4MPTR?
表示將變量申明在大于4MB的區域?
#pragma EXT4MPTR aa?
int _far aa;?
2),針對目標平臺的預處理指令?
#pragma ADDRESS?
絕對地址申明,將變量放入某個絕對地址,例如?
#pragma ADDRESS aa 0xff000?
int aa;?
#pragma BITADDRESS?
位絕對地址申明。典型應用是申明一個bool變量到某個絕對地址?
#pragma BITADDRESS aa 0 0xff000?
_Bool aa;?
#pragma INTCALL?
申明一個軟中斷(int指令)函數?
#pragma INTCALL 25 func()?
void main(void)?
{?
func();?
}?
執行func()時,相當于執行int 25指令?
#pragma INTERRUPT?
這個就不多說了,申明一個中斷服務子函數?
#pragma INTERRUPT isr1(vect = 20)?
void isr1(void);?
#pragma PARAMETER?
申明通過寄存器傳遞參數到匯編函數?
int asm_func(int, int);?
#pragma PARAMETER asm_func(R0,R1)?
void main(void)?
{?
int i,j;?
asm_func(i,j);?
}?
表示i,j參數通過寄存器R0,R1傳遞到匯編函數asm_func();?
3),匯編預處理指令?
#pragma ASM?
#pragma ENDASM?
內嵌匯編指令,例如:?
void fun(void)?
{?
#pragma ASM?
fset i?
nop?
#pragma ENDASM?
}?
#pragma JSRA?
申明調用一個函數時,使用JSR.A指令?
extern void func();?
#pragma JSRA func?
void main(void)?
{?
func();?
}?
#pragma JSRW?
類似于#pragma JSRA?
后記:?
還有基于M16C系列RTOS的預處理指令,例如?
#pragma TASK tsk1?
void tsk1(void)?
{?
}?
表示申明tsk1為一個任務(線程)。?
等等。
本文以nc30編譯器為例,談談#pragma的用法。?
1)。與內存有關的命令?
#pragma ROM?
將一個變量放入ROM里面,比如:?
#pragma ROM aa?
int aa;?
#pragma BIT?
位變量申明。表示將一個變量放在能夠進行位操作指令的地址區,比如:?
#pragma BIT aa;?
struct _aa{?
char bit0:1;?
char bit: 7;?
}aa;?
aa.bit0 = 1;?
#pragma SBDATA?
申明訪問變量是基于SB寄存器尋址的方式,如:?
#pragma SBDATA aa;?
int aa;?
訪問aa時,是基于SB寄存器尋址的?
#pragma SECTION?
將程序或變量什么在某個區域?
#pragma STRUCT?
結構體對齊申明?
#pragma STRUCT _aa unpacked?
struct _aa{?
int aa;?
char bb;?
};?
表示結構體_aa不對齊?
#pragma EXT4MPTR?
表示將變量申明在大于4MB的區域?
#pragma EXT4MPTR aa?
int _far aa;?
2),針對目標平臺的預處理指令?
#pragma ADDRESS?
絕對地址申明,將變量放入某個絕對地址,例如?
#pragma ADDRESS aa 0xff000?
int aa;?
#pragma BITADDRESS?
位絕對地址申明。典型應用是申明一個bool變量到某個絕對地址?
#pragma BITADDRESS aa 0 0xff000?
_Bool aa;?
#pragma INTCALL?
申明一個軟中斷(int指令)函數?
#pragma INTCALL 25 func()?
void main(void)?
{?
func();?
}?
執行func()時,相當于執行int 25指令?
#pragma INTERRUPT?
這個就不多說了,申明一個中斷服務子函數?
#pragma INTERRUPT isr1(vect = 20)?
void isr1(void);?
#pragma PARAMETER?
申明通過寄存器傳遞參數到匯編函數?
int asm_func(int, int);?
#pragma PARAMETER asm_func(R0,R1)?
void main(void)?
{?
int i,j;?
asm_func(i,j);?
}?
表示i,j參數通過寄存器R0,R1傳遞到匯編函數asm_func();?
3),匯編預處理指令?
#pragma ASM?
#pragma ENDASM?
內嵌匯編指令,例如:?
void fun(void)?
{?
#pragma ASM?
fset i?
nop?
#pragma ENDASM?
}?
#pragma JSRA?
申明調用一個函數時,使用JSR.A指令?
extern void func();?
#pragma JSRA func?
void main(void)?
{?
func();?
}?
#pragma JSRW?
類似于#pragma JSRA?
后記:?
還有基于M16C系列RTOS的預處理指令,例如?
#pragma TASK tsk1?
void tsk1(void)?
{?
}?
表示申明tsk1為一個任務(線程)。?
等等。
總結
- 上一篇: mysql client 未开启_Dja
- 下一篇: socket 编程入门教程(一)TCP