freertos程序死机原因

STM32用FreeRTOS串口中断接收卡死问题 解决STM32用FreeRTOS串口中断接收卡死问题 阅读详情
AI摘要

本文探讨了实时操作系统(RTOS)中遇到的任务栈溢出和堆溢出问题,分析了导致这两种情况的原因,并提供了相应的调试方法。栈溢出主要由于任务函数过大或局部变量数组过占空间,而堆溢出则可能源于全局变量或大内存分配。解决策略包括减小任务规模、使用固定大小数组和常量优化,以及调整堆栈大小。通过示例代码展示了如何定位并修复栈溢出问题。

一、开机死机原因

1.一般是某任务栈溢出所致
栈溢出一般有两个原因:

1).此任务函数的代码量太大,或调用了某个比较大的函数。
2).此任务的函数内有比较大的局部变量的数组

调试方法:

1、先关闭所有任务再逐个打开,确定哪个任务导致的死机
2、先看看有没有较大的数据,再用水印函数看看函数的剩余栈。
uxTaskGetStackHighWaterMark(Task_sendModebuHandle )
创建任务的使用说明
一般栈要开的大一些 大于500,正常printf()函数打印时会占用很大ram(打印全局变量时会占用400左右,打印常量时很少 40)

举例:打开此任务函数时死机,原因是 uint8_t buff[1050]太大栈溢出所致

  osThreadDef(Task_sendModebu, sevSendModebus, osPriorityLow, 0, 256);
  Task_sendModebuHandle = osThreadCreate(osThread(Task_sendModebu), NULL);
void sevSendModebus(void const *argument){
	osEvent osSendBusEvent;
	uint8_t buff[1050]={0,};
    printf_pub_var("sevSendModebus(void const * argument) 初始化结束 \r\n");
	while(1){	  
			osSendBusEvent = osMessageGet(allSendBusQHandle, portMAX_DELAY);
			if(osEventMessage==osSendBusEvent.status){//判断是否为有效消息				dataPro(buff); 
		  }
	}
}	

2.一般是堆溢出所致

1.解决方法:全局变量数组或者任务开的太大了,申请melloc大内存 解决办法:
任务调小一点或固定值的数组+const;

 ram(堆)要是不够用,可以把一些常量数组值前+const(有些单片机会把常量放进flash而不是ram)

2:调试方法 (查看栈的使用情况)
xPortGetFreeHeapSize()
API函数在调用该函数时返回堆中的空闲字节数。它可以用来优化堆大小。例如,如果在创建了所有内核对象之后,xPortGetFreeHeapSize()返回2000,那么configTOTAL_HEAP_SIZE的值可以减少2000。当使用heap_3时,xPortGetFreeHeapSize()不可用。

xPortGetMinimumEverFreeHeapSize()
API函数返回自FreeRTOS应用程序开始执行以来堆中存在的最小未分配字节数。xPortGetMinimumEverFreeHeapSize()仅在使用heap_4或heap_5时可用

3.还有一种情况是系统栈溢出所致
系统栈是指 中断函数和中断嵌套所占用的栈大小。

这是最麻烦的一种死机难调试的情况(没有查看系统栈使用情况的接口)。
测试办法:
1:直接把系统栈变大看是否变好
2:在ram 系统栈的范围开机前先赋值 动态看被改变的地址确定系统栈最大使用多少空间

详细说明
在这里插入图片描述

FreeRTOS:卡在configASSERT( ( pxQueue ) )问题的解决 FreeRTOS卡在configASSERT( ( pxQueue ) )问题的解决 阅读详情

相关推荐

关于FreeRTOS函数xSemaphoreGiveFromISR卡死的问题

这个问题可以简单归结为STM32CubeMX生成代码的先后逻辑顺序问题。在使用的时候要注意:在中断处理函数里面进行信号量等与OS相关的代码要先判断一下OS是否已经初始化完毕了,因为可能会出现在OS初始化完成之前会进入一些中断处理函数导致卡死。

suiji2442的博客 1680

【STM32】FreeRTOS踩坑

1.在FreeRTOS内核启动前(即osKernelStart()函数前),千万不能使用osDelay()来延时,否则会发生硬件错误 int main(void) { ... /* Init scheduler */ osKernelInitialize(); /* Call init function for freertos objects (in freertos.c) */ MX_FREERTOS_Init(); /* Start scheduler */ osKer

徐腾腾的博客 4108

STM32F103死机排查:别急着调FreeRTOS,先看看芯片是不是假货

在嵌入式开发中,STM32F103与FreeRTOS的组合应用广泛,但芯片“死机”问题常困扰开发者。芯片正常启动是操作系统运行的前提,而电源稳定性、复位电路、调试接口状态以及芯片本身的可信度都会影响启动流程。通过读取芯片Device ID和96位唯一UID,可有效识别翻新或仿冒芯片;结合SWD调试、串口ISP等工具,能快速定位HardFault或程序跑飞根源。本文从硬件排查顺序切入,介绍区分正品与假芯片的实操方法,并给出FreeRTOS移植的避坑建议,帮助工程师在类似“玄学故障”中节省时间。

weixin_34060741的博客 412

freeRTOS出现任务卡死的情况。

最近在做一个产品二代升级的项目,代码是上一任工程师留下的,很多BUG,而且融合了HAL库和LL库,以及github上下载的GSM源码,很不好用。 我这边是将2G模块换成了4G,且添加了单独的BLE模块。因此只在源码的基础上,去除2G和BLE代码部分,添加新的4G和BLE代码。 整个freeRTOS工程项目创建了4个task任务。 我是先修改了BLE任务,修改完毕后运行正常;然后一步一步添加新的4G任务代码。发现只添加4G初始化代码,4个任务都正常,但是添加业务功能代码的时候,4个任务都卡死了(一运行就

szy_sin的博客 1万+

FreeRTOS中断里用vTaskDelay()就死机?手把手教你STM32F407中断优先级与FromISR函数避坑

本文深入解析FreeRTOS在STM32F407中断中使用vTaskDelay()导致死机的问题,揭示中断优先级配置与FromISR函数的关键作用。通过对比普通API与FromISR API的设计差异,提供中断安全调用的最佳实践和调试技巧,帮助开发者避免常见陷阱,确保RTOS系统的稳定运行。

weixin_42525005的博客 188

中断里调用malloc导致系统偶发死机:根因、排查与替代方案

在嵌入式开发中,内存管理是系统稳定性的基石。标准C库的malloc通过修改堆链表状态来分配内存,这一过程并非天生可重入。当中断服务程序(ISR)与主循环在同一时刻调用malloc时,堆管理器的临界区冲突会导致内存链表损坏,从而引发难以复现的偶发死机。理解中断上下文与任务上下文的本质差异,是排查此类问题的关键——它揭示了为何malloc在绝大多数嵌入式环境下都不具备中断安全性。合理运用环形缓冲区、内存池以及中断标志位等设计模式,能够在不牺牲性能的前提下彻底消除这一隐患。本文结合基于ARM Cortex-M的裸

weixin_30313409的博客 271

python 串口接收进程死机_FreeRTOS 启动进程调度后,程序卡死的部分原因分析。...

现象:1,RTOS 使用时 系统卡启动文件 B .处。 原因分析:该种情况是由于定义开启了中断,但是未开启中断处理服务。程序执行到中断响应式无对应的程序响应解决办法:分析启动头文件,未针对RTOS特别定义中断 分析成分徐程序中开启动了 串口1中断但未能查找到对应的USART1_IRQHandler中断服务程序。但在RTOS的串口使用中,定义了 vUARTI...

weixin_39926749的博客 911

FreeRTOS死机排查:从栈溢出到优先级反转的嵌入式系统稳定性实战

在嵌入式实时操作系统中,任务调度与资源管理是核心机制。FreeRTOS作为广泛应用的开源RTOS,其稳定性直接影响整个系统的可靠性。系统死机通常源于对内核机制的理解偏差或使用不当,例如任务栈溢出会破坏关键数据结构,而中断服务程序(ISR)中误用非安全API则可能导致调度器崩溃。从技术价值看,掌握这些排查方法能显著提升嵌入式产品的健壮性。在实际应用场景中,无论是工业控制、物联网设备还是消费电子,系统死机都会导致功能失效。本文聚焦FreeRTOS环境,深入解析栈溢出、内存访问越界、优先级反转等典型问题,并提供从

weixin_34151004的博客 454

串口服务器通讯中断不流畅,在FreeRTOS下串口中断不正常工作,一中断就死机为何?...

CPU: UC3A0512AVR32Studio 2.1.1 + Tool 2.1.6中断处理程序如下:问题描述:系统跑FreeRTOS系统,开几个任务. 运行正常. 但串口有数据进来的时候立即死机! 为何?请专家指点!#define WT_USART 为 USART1串口中断初始化:void usart_task_init(void){static const gpio_map_t USART_...

weixin_32638607的博客 2025

基于51单片机+SYN6288语音播报

51单片机控制SYN6288语音播报资料SYN6288模块原理图语音合成命令接线如何接线实现原理程序代码main.csyn6288.cuart.cdelay.c基于 51单片机的其他项目基于51单片机+遥控灯基于51单片机+LCD1602显示基于51单片机+红外遥控解码+LCD1602显示基于51单片机+DHT11温湿度+LCD1602显示基于51单片机+DS18B20温度测温器+LCD1602显示尾声 资料 我用的是绿深电子技术的模块,资料也挺齐全的。也有相关例程。 SYN6288模块原理图 语音合成

weixin_47457689的博客 3万+

【Pytorch教程】:卷积神经网络 CNN

Pytorch教程目录 Torch and Numpy 变量 (Variable) 激励函数 关系拟合(回归) 区分类型 (分类) 快速搭建法 批训练 加速神经网络训练 Optimizer优化器 卷积神经网络 CNN 目录Pytorch教程目录什么是卷积神经网络 CNN卷积 和 神经网络池化(pooling)流行的 CNN 结构CNN 卷积神经网络MNIST手写数据CNN模型训练可视化训练全部代码 什么是卷积神经网络 CNN 卷积 和 神经网络 卷积神经网络是如何运作的呢, 举一个识别图片的例子, 我们知

nanke_4869的博客 8092

STM32H7串口中断里调FreeRTOS API就死机?一个中断优先级配置帮你搞定

本文深入解析了STM32H7在串口中断中调用FreeRTOS API导致死机的问题,指出中断优先级配置不当是根本原因。通过详细讲解NVIC优先级分组和FreeRTOS的中断屏蔽机制,提供了具体的配置方案和调试技巧,帮助开发者快速解决这一常见问题。

weixin_30379531的博客 440

基于STM32F103标准库与DMA的实时音频FFT频谱显示系统设计

本文详细介绍了基于STM32F103芯片与DMA技术实现实时音频FFT频谱显示系统的设计方法。通过标准库驱动和FFT算法处理音频信号,结合OLED显示屏实时绘制音乐频谱,涵盖硬件选型、核心原理、开发环境搭建及性能优化等关键步骤,为数字信号处理应用提供实用参考。

yellow的专栏 777

如何判断CPU是否正在执行中断函数?

1.这是一个有许多经验的攻城狮都遇到过的坑,本文教你正确绕过这个坑;2.教大家了解__get_CONTROL的用法,及xQueueSend和xQueueSendFromI...

strongerHuang 2826

【ESP32】SPI SRAM memory test fail。External RAM failed memory test!

log日志报错如下:这两条报错信息表明外部 SPI SRAM(静态随机存取存储器)的内存测试失败。

weixin_56217406的博客 1024

深入浅出DNS系列(一)- DNS杂谈

黄丝玛:班达山,你好,我记性不好,你告诉我搜狐、新浪的网站IP地址好吗? 班达山:你问问DNS先生吧,他专门干这买卖的

jiangsd198的博客 4129

stm32 freetos堆空间和启动文件堆空间

最近在做公司的一个项目,遇到堆空间不足导致单片机卡死的问题。板子是stm32f407ve,ram192K,用的freetos+json+mqtt。 1.第一次修改堆分布 startup.s 堆空间默认0x200(512byte) freetos内部总堆空间cubmx默认为15360byte,json里面用到申请内存的函数为malloc和free,直接跑mqtt+json,单片机会运行mqtt这个线程时因堆空间申请不足而无法收到上报的相关数据,其他线程运行正常。 2.第二次修改堆分布 startup.s

wang123qweasd的博客 473

Windows 11安装 SQLServer 2008 R2 失败问题处理

Windows 11安装SQL Server 2008 R2失败解决方案 由于Windows 11移除了对PowerShell 2.0的支持,导致SQL Server 2008 R2安装失败。经过多次尝试,最终通过**方案六(修改注册表模拟PowerShell 2.0环境)**成功安装。其他可行方案包括: 使用SP3集成版安装包 通过命令行跳过检查(/SUPPRESSPOWERShellCHECK参数) 创建特殊配置文件 替代方案建议: 使用Docker容器运行 在虚拟机中安装 升级到新版SQL Serve

oDengWei的博客 7187

FreeRTOS死机原因

1、中断回调函数中没有使用中断级API (xxFromISR) 函数 xSemaphoreGiveFromISR(uart_busy,&HighterTask);----正确 xSemaphoreGive(uart_busy);-----错误 2、比configMAX_SYSCALL_INTERRUPT_PRIORITY优先级高的中断函数中使用了FreeRTOS的函数 3、临界代码保护...

liangbin414的博客 1万+

Sigrity System Explorer Transient Analysis模式进行瞬态仿真分析操作指导-单端信号

Sigrity System Explorer Transient Analysis模式可以用于瞬态仿真分析,通过搭建简易拓扑用于前仿真分析通道的时域性能,下面搭建一个简易的单端拓扑进行说明,以下图为例,准备好发送接收端的IBIS模型, (ibis_se.ibs,本例发送接收端都使用相同的IBIS模型),以及传输线的S参数模型(welement_se.sp)最上方的图形界面是传输线的模型,本例是一个上下都有参考平面的带状线,右侧的梯形是蚀刻角度,根据W1和W2以及铜厚来确定。

weixin_54787054的博客 419

cadence中利用sva进行FPV实战(可直接使用)

在cadence中使用fpv进行formal验证

youzjuer的博客 749

FreeRTOS+STM32F103中断中发送任务通知单片机死机问题

最近在调试FreeRTOS系统遇到了一个比较奇怪的问题,在STM32F103最小系统上调试任务通知模拟事件标志组功能时,中断一触发,单片机就会死机。通过查询方式发生任务通知没任何问题,一旦用按键触发外部中断,在中断中发送任务通知时,单片机就死机。在编译时程序无任何报错。 相关代码如下: #include "sys.h" #include "delay.h" #include "usart.h" #...

HXYDJ的博客 3776

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

STM32F40X系列单片机死机原因

STM32F40X系列单片机死机有两个主要原因:堆栈溢出或者死循环。

m0_51385756的博客 1601

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

freeRTOS中使用cJSON死机的问题

cJSON默认使用 malloc 和 free 来申请和释放内存,如果在裸机中没有任何问题,但是现在使用了freeRTOS,那么就不能使用 malloc 和 free 来申请和示范内存,需要使用操作系统提供的函数来进行操作。在freeRTOS中使用cJSON来处理PC通过串口发送的信息,但是在串口接收处理任务中调用cJSON处理的函数后会出现死机的问题。添加上面代码后确实可以正常的进行解析和读取内部的key,但是在执行一次后又会死机!创建任务时指定了线程的堆栈大小,如果堆栈较小,则会导致程序异常。

渡渡鸟的博客 1114

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

STM32在FREEOS进行IAP跳转死机

现象: STM32使用串口IAP进行跳转,发现APP程序用freeos编写的时候,程序跳转完成后就死机了。 IAP程序在跳转前都关闭了中断和复位了使用的外设。已经验证跳转到裸机程序没有问题。 FREEOS的程序在main函数开始就进行了开启中断和复位向量表。 int main(void) { /* USER CODE BEGIN 1 / __enable_irq(); SCB->VTOR = FLASH_BASE | 0X00004000; / USER CODE END 1 */ /…略… 方案:

qq_39649731的博客 7897

FreeRTOS中断调用API消息队列发送函数导致系统死机(memcpy函数卡死)

另一种中断中调用FreeRTOS的消息队列发送函数卡死情况,与网上案例不同

qq_27132149的博客 4655
上一篇: linux检测程序内存泄露
下一篇: stm32串口接受数据 中间数据丢失 flash操作
非洲神猴
博客等级 码龄9年 146粉丝 53原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非洲神猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值