程序跑飞原因总结 && 引脚配置&&中断&&while循环&&数组越界 &&硬件原因

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},

};
五、硬件原因

这个概率比较小,而且很好验证,使用稳定的程序版本在该硬件板子上实验即可

一般硬件原因会有以下几个情况:

(1)本身制造工艺问题
(2)器件短路
(3)测试台架有问题,会将你的板子MCU拉掉电复位
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值