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

本文详细介绍了TI DSP中用于提高安全性的__eallow()和__edis()指令,以及C/C++中assert()函数的正确使用方法。文章强调了在DSP上电复位后如何解除关键寄存器的保护以进行初始化,并在操作完成后重新启用保护,防止意外修改。同时,对比了#if与if的区别,解释了assert()在调试过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
在这里插入图片描述

### DSP28335中EALLOWEDIS的功能及使用方法 #### 1. 基本概念 在DSP28335中,某些配置寄存器受到保护机制的约束,以防止意外写入导致系统不稳定或错误行为。这种保护通过 `EALLOW` `EDIS` 指令实现。具体来说: - **EALLOW (Edit ALLOW)** 是一种指令,用于请求对受保护寄存器的写权限。执行此指令后,程序可以访问并修改那些原本受限的寄存器[^1]。 - **EDIS (Edit DISABLE)** 则是对上述权限的一种撤销操作。它重新启用对特定寄存器的保护功能,从而阻止未经授权的操作[^2]。 #### 2. 使用场景 当需要更改受保护的寄存器时,必须遵循以下模式来确保安全性稳定性: ```assembly EALLOW; // 修改受保护的寄存器内容 PieVectTable.WAKEINT = &wakeint_isr; EDIS; ``` 在此过程中,`EALLOW` 解除保护状态以便允许必要的写入动作发生;而随后紧跟的 `EDIS` 又迅速恢复原有的防护措施,避免其他部分代码可能带来的风险。 #### 3. 实际应用中的注意事项 对于实际开发而言,在涉及任何敏感区域前都需要确认是否已经适当处理好了这些控制命令。例如如果要初始化EPWM模块,则除了考虑其本身参数设定外还需要注意关联到GPIO端口映射等问题。这里给出一个简单的例子展示如何正确运用它们完成任务: 假设我们要设置某个中断向量表项指向自定义的服务例程地址,并且该过程涉及到受控资源调整: ```c #include "DSP2833x_Device.h" void initCustomInterrupt(void){ EALLOW; // Enable access to protected registers. PieVectTable.INTCUST = &custom_ISR; EDIS; // Disable further accesses after setup complete. } ``` 另外值得注意的是,在一些情况下还可能存在额外的要求比如调用专门提供的库函数来进行外围设备接口(PERIPHERAL I/O)分配如上文中提到过的 `InitEPwm6Gpio()` 函数就是这样一个典型代表[^4]。 #### 结论 综上所述,合理利用好这两个简单却极其重要的工具可以帮助开发者构建更加健壮可靠的嵌入式解决方案同时减少潜在隐患的发生几率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值