C语言__eallow()和__edis()、if和#if、ASSERT()的区别(基于DSP)

1.__eallow()和__edis()
TI的DSP为了提高安全性能,将很多关键寄存器作了保护处理。通过状态寄存器1(ST1)的位6设置与复位,来决定是否允许DSP指令对关键寄存器进行操作。这些关键寄存器包括:器件仿真寄存器、FLASH寄存器、CSM寄存器、PIE矢量表、系统控制寄存器、GPIOMux寄存器等等。

DSP由于在上电复位之后,状态寄存器基本上都是清零,而这样的状态下正是上述特殊寄存器禁止改写的状态。为了能够对这些特殊寄存器进行初始化,所以在对上述特殊寄存器进行改写之前,一定要执行汇编指令asm(“EALLOW”)或者宏定义EALLOW来设置状态寄存器1的C6位,在设置完寄存器之后,一定要注意执行汇编指令asm(“EDIS”)或者宏定义EDIS来清除状态寄存器1的C6位,来防止杂散代码或指针破坏寄存器内容。

2 if和#if的区别?
#if是条件编译,条件编译是根据宏条件选择性地编译语句;而if是条件语句,条件语句是根据条件表达式选择性地执行语句。

#if是编译器在编译代码时完成的,if是在程序运行时进行的在程序运行时执行。

#if后面不能写变量,if后面可以写变量。

3.C/C++的ASSERT()函数
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行。
其使用注意事项如下:
(1) 在函数开始处检验传入参数的合法性在函数开始处检验传入参数的合法性。例如:assert(nNewSize >= 0);
(2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败,
如:
assert(nOffset>=0 &&nOffset+nSize<=m_nInfomationSize);——不建议
assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);
在这里插入图片描述