1.cpu_def.h

宏定义
(1)临界区的概念
(2)临界区相关的宏
CPU_CRITICAL_METHOD_NONE 没有方法解决临界区
CPU_CRITICAL_METHOD_INT_DIS_EN interrupt disable enable,中断关闭和使能来实现
CPU_CRITICAL_METHOD_STATUS_STK 中断状态保存到栈中
CPU_CRITICAL_METHOD_STATUS_LOCAL 中断状态保存在本地的局部变量

2.Cpu.h

(1)CPU_CRITICAL_ENTER()宏用来进入临界区,实现其实就是函数内部关闭中断,然后备份CPSR到局部变量cpu_sr中即可。
(2)CPU_CRITICAL_EXIT()宏用来退出临界区,
(3)ARM中的总中断开关在CPSR寄存器中(bit7,记作I位),I位为0时总中断开关开,I位为1时总中断开关关闭。CPSID I指令其实就是通过将I位置1来实现中断关闭的。

3. CPU.c

(1)下面三行在宏定义配置判断成功时,其实相当于定义了一个函数内的局部变量,类型是CPU_SR,变量名是cpu_sr。定义这个局部变量的作用,是用来配合后面的2个宏。
#if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
CPU_SR cpu_sr;
#endif

(2)RTOS中实现临界区常用的有三种方法,uCOS2本来是想要三种方式都支持的,所以在宏定义的时候定义了三种,但是实际上方式1和2都不靠谱,
实际全是用的3,1和2名存实亡。所以CPU_CRITICAL_ENTER()和CPU_CRITICAL_EXIT()中直接使用了方式3,
但是方式3的这2个宏依赖于一个名叫cpu_sr的局部变量。如果没有这个局部变量则会编译时报错,所以只要函数用到了这2个宏,
就得在函数前面加上(1)中的三行。
总结:uC-CPU/ARM-Cortex-M3/cpu_c.c中主要是一些函数定义,这些函数包括位带访问区(SRAM的位带访问区和外设寄存器位带访问区)的位清零和置位函数;中断源的关闭和打开函数;中断源的各个中断的优先级的设置和获取函数。这些函数的实现很多都用到了NVIC模块的控制寄存器的位定义。

(1)interrupt中断 和 exception异常,这两个词的区别?
异常指的是CPU的非正常状态,譬如复位、指令错误、中断(IRQ、FIQ),而中断是一种特殊的异常。
中断是一种异常,而异常不一定非是中断。