2023.11月开始做了新项目,技术不到家导致程序多次跑飞,现在总结如下
一、引脚配置错误
错误原因:同一个引脚初始化两次
1.硬件原理图变更,引脚功能变动,改动时不仔细
2.代码规范不好:对于引脚的宏定义封装不好,除了.h文件还在其他地方出现数字引脚
错误现象:
1.程序跑飞
2.调试时将新增引脚初始化挪动位置程序就会正常:原因时挪动位置后初始化正确了
解决办法:
1.做好引脚定义的宏封装,避免在.c文件里还出现数字引脚,如pin3,一律在.h文件中就封装完成
二、中断的使用
开发过程中需要使用一个新得芯片,芯片要求在数据传输时使用CPU级得中断
错误原因:误用不属于freertos的CPU中断
__get_PRIMASK();
__set_PRIMASK(cpu_key);
错误现象:一旦芯片开始数据传输调用到该中断,程序会直接卡死直到看门狗复位
解决办法:使用FreeRtos专用的中断
taskENTER_CRITICAL();
taskEXIT_CRITICAL();
友情提醒:
在FreeRtos中使用互斥锁时判断一下是否未NULL
if(g_Spi0_Comm_MutexSemaphore != NULL)
{
xSemaphoreTake(g_Spi0_Comm_MutexSemaphore, portMAX_DELAY);
ret_Data = SPI_RW_byte(0);
xSemaphoreGive(g_Spi0_Comm_MutexSemaphore);
}
三、while循环
在FreeRtos中如果使用While循环需要保证有超时退出机制以及适当增加延时,给别的任务留出运行时间
错误原因:移植过来的芯片驱动代码默认硬件100%没问题,使用了while死循环等待某些状态
while(1)
{
if (p_this->p_gpio->pfn_busy_pin_read() == 0)
{
break;
}
}
//默认硬件一定会成功,所以使用while循环直接死等待
错误现象:这种情况比较隐蔽,只有当电路板硬件出现故障的时候会出现程序卡死复位
解决办法:
1.增加超时退出机制
2.在while循环里增加 vTaskDelay()----就算失败也会给其他任务运行时间,程序不会卡死
while (0 != p_this->p_gpio->pfn_busy_pin_read())
{
if((u16ErrorCnt--) == 0)
{
break;
}
vTaskDelay(5);
}
四、数组越界
平常使用小数组时基本不会有问题,但是当一份协议的寄存器从0开始到65535,这样庞大的数组就会出现问题
错误原因:新建的数组过大,浪费资源,极易导致堆栈溢出
错误现象:程序进入该线程处理数据就会出现程序卡死,看门狗复位
解决办法:我自己想的办法是将数据按照不同类型分割,分别新建不同的小数组,然后使用一个表做驱动,因为寄存器不可能全部填满,建立一个数组包含所有寄存器是非常浪费的
下面抛砖引玉贴上我得代码,有不对的请指正:
(1)先做数据类型分割,建立小数组
//汇总信息
S16 g_s16SumParamArry[10] = {0};
//告警信息
S16 g_s16AlarmParamArry[10] = {0};
//全局控制参数
S16 g_s16GlobalParamArry[5] = {0};
//单体信息
S16 g_s16SingleMsgArry[20] = {0};
(2)建立新表,使用表驱动
【优点---比如你要查询寄存器1110的数据,实际程序进来只需要查看g_s16SingleMsgArry[i]数组里第9个数据即可】
REG_ADDR_ST Reg_Info_Array[] =
{
//寄存器地址 //寄存器地址映射值
//汇总信息 g_s16SumParamArry[i]
{0, 0},
{1, 1},
{2, 2},
{3, 3},
{4, 4},
{5, 5},
{6, 6},
{7, 7},
{8, 8},
{9, 9},
{10, 10},
//告警信息 g_s16AlarmParamArry[i]
{80, 0},
{81, 1},
{82, 2},
{90, 3},
//全局信息 g_s16GlobalParamArry[i]
{950, 0},
{951, 1},
//单包信息 g_s16SingleMsgArry[i]
{1101, 0},
{1102, 1},
{1103, 2},
{1104, 3},
{1105, 4},
{1106, 5},
{1107, 6},
{1108, 7},
{1109, 8},
{1110, 9},
{1111, 10},
{1112, 11},
{1113, 12},
{1114, 13},
};
五、硬件原因
这个概率比较小,而且很好验证,使用稳定的程序版本在该硬件板子上实验即可
一般硬件原因会有以下几个情况: