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

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

时间:2024-03-23 13:58:07浏览次数:33  
标签:&& 引脚 程序 硬件 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拉掉电复位

标签:&&,引脚,程序,硬件,while,数组,寄存器
From: https://blog.csdn.net/kingboj/article/details/136963044

相关文章

  • do...while语句是什么,和while语句的区别
    do...while语句在c语言中也属于循环语句的一种,被称为do...while循环语句(函数),是while语句的另一种特殊格式和延申语句。do...while语句和while语句的区别在于,在检查while条件是否为真之前,do...while语句会首先执行一次do之内的语句,先不管条件如何,直接触发一次。然后在再去看whi......
  • NCV7321D11R2G收发器中文资料PDF数据手册引脚图参数图片价格芯片概述特性原理
    产品概述:NCV7321是一款全功能局部互联网(LIN)收发器,适用于LIN协议控制器和物理总线之间的接口。该收发器以I3T技术实施,可实现高电压模拟电路和数字功能在同一个芯片上的共存。NCV7321LIN器件属于车内联网(IVN)收发器系列。LIN总线适用于以最低可能成本从控制设备......
  • FAN3224TMX门极驱动器中文资料PDF数据手册引脚图参数价格图片功能特性
    产品概述:FAN3223-25系列双4A门极驱动器以较短的开关间隔提供高峰值电流脉冲,用于在低侧开关应用中驱动N沟道增强模式MOSFET。该驱动器提供TTL或CMOS输入阈值。内部电路将输出保持在低电平,直到电源电压处于运行范围内,从而提供欠压锁定功能。另外,这些驱动器具有匹配的......
  • NCV1117ST50T3G线性稳压器芯片中文资料规格书PDF数据手册引脚图图片价格参数
    产品概述:NCP1117系列为低压差(LDO)正向线性电压稳压器,能够提供超过1.0A的输出电流,800mA时温度范围内最大压差为1.2V。这一系列包括八个固定输出电压:1.5V、1.8V、2.0V、2.5V、2.85V、3.3V、5.0V和12V,保持稳压没有最低负载要求。另外还包括可调节输出版本,使用两个外部电阻,实现从......
  • while语句的实际应用(2)
    3150:【例25.2】26个兄弟姐妹2时间限制:1000ms      内存限制:65536KB提交数:6770   通过数:4845【题目描述】26个字母26枝花,26个兄弟姐妹是一家,大写字母与小写字母不分家。试编一程序,按顺序输出26个小写英文字母,再按逆序输出26个大写字母。【输入......
  • while语句的实际应用(3)
    3151:【例25.3】输出奇偶数之和时间限制:1000ms      内存限制:65536KB提交数:6981   通过数:4603【题目描述】利用for循环,分别输出1∼n之间的所有奇数的和、偶数的和。【输入】输入n(1≤n≤100)。【输出】输出为一行,两个数(用一个空格隔开)......
  • Python入门新手第三课:while
           今天我们来学习Python的while指令。while在Python中充当着类似中文里“如果”的角色,比如这个代码:whileTrue:       这个代码的意思是如果正确,则运行后面的代码。同样,我们还可以编写以下代码:whileFalse:       “whileFalse:”这个代码......
  • LM358P/LM358DR/LM358DT/LM358DR2G运算放大器中文资料PDF数据手册引脚图功能
    产品概述:LM358B和LM2904B器件是行业标准运算放大器LM358和LM2904的下一代版本,其中包括两个高压(36V)运算放大器。这些器件为成本敏感型应用提供了卓越的价值,其特性包括低偏移(300µV,典型值)、对地共模输入范围和高差分输入电压能力。LM358B和LM2904B运算放大器利用......
  • LM2904DT运算放大器中文资料规格书PDF数据手册引脚图参数图片功能概述
    产品概述:该电路由两个独立的高增益运算放大器(运算放大器)组成,内部实现了频率补偿。它们专为汽车和工业控制系统而设计。该电路采用单电源供电,工作电压范围很广。低功耗与电源电压的大小无关。应用领域包括传感器放大器、直流增益模块和所有传统的运算放大器电路,这些电路现在可......
  • Qt开发,报错:Error while building/deploying project untitled (kit: ....)
    1、问题描述 Qt开发,编译时,报错如下:1Cannotfindfile:F:\linux\...\Console.pro.213:49:47:进程"D:\Qt\Qt5.14.2\5.14.2\msvc2017_64\bin\qmake.exe"退出,退出代码2。3Errorwhilebuilding/deployingprojectConsole(kit:DesktopQt5.14.2MSVC201764bit)4......