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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是f28335与dac7724通信的SPI初始化函数和SPI写函数的示例代码: ```c // SPI初始化函数 void spi_init(void) { EALLOW; // 配置SPI引脚 GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1; // SPISIMOA GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1; // SPISOMIA GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 1; // SPICLKA GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 1; // SPISTEA // 使能SPI时钟 CpuSysRegs.PCLKCR1.bit.SPI_A = 1; // 复位SPI模块 SpiaRegs.SPICCR.bit.SPISWRESET = 0; // 配置SPI模式 SpiaRegs.SPICCR.bit.SPICHAR = 0x7; // 字长为8位 SpiaRegs.SPICCR.bit.SPILBK = 0; // 禁止环回 SpiaRegs.SPICCR.bit.CLKPOLARITY = 0; // 时钟极性为低电平 SpiaRegs.SPICCR.bit.CLKPHA = 1; // 数据采样从第二个边沿开始 SpiaRegs.SPICCR.bit.SPISWRESET = 1; // 使能SPI模块 // 配置SPI时钟 SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 0x4; // 时钟为主时钟的1/16 // 配置SPI中断 SpiaRegs.SPICTL.bit.SPIINTENA = 0; // 禁止中断 // 配置SPI模块为从机模式 SpiaRegs.SPICCR.bit.SPISWRESET = 0; SpiaRegs.SPIPRI.bit.FREE = 1; SpiaRegs.SPIPRI.bit.SOFT = 1; SpiaRegs.SPICCR.bit.SPICHAR = 0xF; // 字长为16位 SpiaRegs.SPICCR.bit.SPIMODE = 0x3; // 从机模式 SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0; // 从机模式 SpiaRegs.SPICCR.bit.SPISWRESET = 1; } // SPI写函数 void spi_write(uint16_t data) { // 等待SPI发送缓冲区为空 while (SpiaRegs.SPISTS.bit.SPITXFULL != 0); // 将数据写入发送缓冲区 SpiaRegs.SPITXBUF = data; // 等待SPI接收缓冲区非空 while (SpiaRegs.SPISTS.bit.SPIRXEMPTY != 0); // 读取接收缓冲区的数据 uint16_t dummy = SpiaRegs.SPIRXBUF; } ``` 这里假设我们使用SPIA作为与DAC7724的通信接口。DAC7724的控制信号CS与F28335的GPIO23相连,因此我们需要在初始化函数中将GPIO23设置为SPI的片选信号。在SPI写函数中,我们将要发送的数据放入SPI的发送缓冲区,然后等待SPI接收缓冲区非空,读取接收缓冲区的数据,这里我们仅仅是将SPI接收缓冲区的数据读取出来,并没有进行其他处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值