extern:
extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行链接指定。
const: 可以用const定义一些变量或数组,以确保它的值不被改变。
例:int *const p = &x; 定义一个常量指针p给变量int。
const int *q = &x; 定义一个变量指针q给常量int。
cregister:定义用来直接访问CPU控制寄存器的变量。
你可以先定义一个头文件,专门定义这个变量(实际就是相应的寄存器),
然后在相应的c源代码中直接引用这些变量了。
定义这些变量的方式是:
extern cregister volatile unsigned int register;
其中register就是AMR,CSR,IFR等寄存器。
例如:
extern cregister volatile unsigned int AMR;
extern cregister volatile unsigned int CSR;
extern cregister volatile unsigned int IFR;
extern cregister volatile unsigned int ISR;
extern cregister volatile unsigned int ICR;
extern cregister volatile unsigned int IER;
extern cregister volatile unsigned int FADCR;
extern cregister volatile unsigned int FAUCR;
extern cregister volatile unsigned int FMCR;
main()
{
printf(”AMR = %x/n”, AMR);
}
interrupt:文档原文如下
When you use the interrupt keywordwith the definition of the function,
the compiler generates register saves basedon the rules for interrupt
functions and the special return sequence for interrupts.
翻译:当你使用interrupt关键字定义函数时,编译器基于中断函数的规则生成寄存器存档,
而且特殊的会返回中断序列(不一定准确)
interrupt void int_handler()
{
unsigned int flags;
...
}
Near and Far :
全局和静态变量可以声明为near或far,near和far为类型修饰符。
声明为near的变量采用了寄存器相对寻址,基址寄存器为数据指针DP(32Bits),偏移
地址为15位常量,所以,near型全局和静态变量不能超过32Bytes;
声明为far的变量采用寄存器间接寻址,可以对任何空间进行寻址,无大小限制;
Near型变量在访问时比far型变量少执行两条语句。
restrict:
restrict关键字用来修饰指针、引用和数组变量,表示在变量的有效范围内,指针所指的对象
只通过此指针来引用。
volatile:
易变(C:与const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。)
推荐一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用 保存在寄存器里的备份。