使用void解除warning
在很多地方可以看到这些定义,将入参改变类型为void,其主要作用是将没用到的入参使用一下,不然编译器会报warning。
宏定义或枚举转换成字符串
#符号用于预处理指令,它可以将宏参数转换为字符串字面值。TRANS_TO_STR(STR) 是一个宏定义,它将宏或者枚举STR转换为字符串字面值。这种转换可以方便地将枚举值转换为相应的字符串表示,用于日志输出、错误处理等场景。
#define TRANS_TO_STR(STR) #STR
ASSERT断言
作用:是用于对程序进行调试的,对于执行结构的判断,而不是对于业务流程的判断。(相当于一个if ()语句,如果满足断言的执行程序,如果不满足则抛错误)
assert 的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先打印一条出错信息,然后通过调用 abort 来终止程序运行。
(注:使用 assert 的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。)
程序当中断言有几种,DEV_ASSERT,DEM_ASSERT,configASSERT。
DEV_ASSERT
里面是一个判断表达式,如果表达式成立,则什么都不做。如果表达式不成立,执行BKPT_ASM进入调试中断,并且死循环。
BKPT_ASM就是进入调试中断
DEM_ASSERT
该断言用于诊断。表达式成立则什么都不做,不成立也什么都不做。
configASSERT
如果表达式不成立,调用taskDISABLE_INTERRUPTS()函数失能所有中断并进入死循环。
指针传入封闭函数
情景:
使用一个封闭的接口函数进行开发。
Rte_Call_RL_Door_Status_Read(DigitalLevel * Level)
由于该函数被封,按照原理传入指针Level。
一开始的时候只是定义了指针DigitalLevel * Level;
传入函数Rte_Call_RL_Door_Status_Read(Level);
这样的做法是不对的,这样跟定义变量传入指针不同。
DigitalLevel Level;//定义变量的时候程序会自动分配RAM空间给到变量Level
Rte_Call_RL_Door_Status_Read(&Level);//在里面做的改变本质上改变的是RAM空间
需要让它指向RAM的区域,否则程序会在Rte_Call_RL_Door_Status_Read接口函数当中修改掉0地址的内容。
DigitalLevel * Level;//当指针初始化的时候,默认指向NULL,就是0地址的地方。
Rte_Call_RL_Door_Status_Read(&Level);//在里面做的改变本质上改变的是0地址的内容
关键字_at_的使用
查看一些老旧代码的时候看到有这么一段。
这个函数是轮询执行的,但是sourceinsight却没有找到vs_ucLedSegDutyRam的定义,全局搜索才找得到,结果发现原来它的定义很奇特。
里面用了_at_这个东西
_at_是让定义的vs_ucLedSegDutyRam首地址定义在0x530这个内存位置,实际上,这个位置是控制LED的几个IO口寄存器,配置这里就是配置LED的亮灭。