制作付费下载网站,抖音推广平台,网站设计公司推荐,找谁做网站优化R8C/M16C提供一系列预处理指令#xff0c;能够很好的优化C代码。 本文以nc30编译器为例#xff0c;谈谈#pragma的用法。 1)。与内存有关的命令 #pragma ROM 将一个变量放入ROM里面#xff0c;比如#xff1a; #pragma ROM aa int aa; #pragma BIT 位变量申明。表…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为一个任务(线程)。 等等。