DSP控制器原理与技术应用
上QQ阅读APP看书,第一时间看更新

2.1.5 关键字

TMS320F2833x的C/C++编译器除了支持标准的const、volatile关键字外,还支持cregister、interrupt等关键字。

1.关键字const

C/C++编译器支持ANSI/ISO标准的关键字const,通过该关键字可以优化和控制存储空间的分配。const关键字用来表明变量或数组的值是不变的。例如

2.关键字volatile

编译用户程序时优化器会分析数据流,尽可能避免对存储器的直接读/写操作。因此,对存储器或外设寄存器进行访问时,需要使用volatile关键字,来说明所定义的变量可以被DSP系统中的其他硬件修改,而不是只能被C语言本身修改。用volatile关键字的变量被分配到未初始化块,编译器不会在优化时修改引用volatile变量的语句。例如以下语句循环地对一个外设寄存器的地址进行读写操作,直到读出的值等于0xFF。

while(* ctrl != 0xFF);

* ctrl指针所指向的地址内容在循环过程中不会发生变化,该循环语句会被编译器优化,对存储器执行一次读操作。如果定义* ctrl指针为volatile类型变量,即

* ctr指针指向一个硬件地址,比如PIE中断标志寄存器,该地址单元的内容可以被其他硬件修改。

3.关键字cregister

cregister关键字允许采用高级语言直接访问控制寄存器。在TMS320F2833x的C语言中,cregister仅限于中断使能寄存器IER和中断标志寄存器IFR,程序中应有如下声明。

可以用运算符|(位或)和&(位与)进行操作,例如

IER = 0x100;

IER |= 0x100;

IFR |= 0x0004;

IFR &= 0x0800;

4.关键字interrupt

interrupt关键字用来声明一个函数是中断服务程序。CPU响应中断服务程序时需要遵守特定的规则,如函数调用前依次对相关寄存器进行入栈保护,返回时恢复寄存器的值。当一个函数采用interrupt声明后,编译器会自动为中断函数产生保护现场和恢复现场所需执行的操作。对于采用interrupt声明的函数,其返回值应定义为void类型,且无参数调用。在中断函数内可以定义局部变量,并可以自由使用堆栈和全局变量,例如:

有一个特殊的名为c_int00的中断程序(汇编语言中名称为_c_int00),用于DSP复位中断的处理。它完成系统初始化并调用主函数main(),是用户C程序的入口。