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

Habitat-v0.1.7安装全网最详细教程(解决habitat-sim下载时网络问题)

Habitat-v0.1.7安装全网最详细教程(解决habitat-sim下载时网络问题)

shannanshouyin的博客 1328

从仿真到真机:如何将XTDrone的VINS-Fusion+RTABMap建图方案部署到真实无人机上?

本文详细介绍了如何将XTDrone的VINS-Fusion+RTABMap建图方案从仿真环境迁移到真实无人机上。内容涵盖硬件选型、传感器配置、VINS-Fusion调优、RTABMap性能优化以及系统集成等关键步骤,特别针对三维稠密重建在真实环境中的挑战提供了实用解决方案。

weixin_29056781的博客 243

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

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

weixin_30379531的博客 440

set_data_check专题[使用,report_timing,setup/hold检查]

set_data_check用于约束『数据-对-数据』的『建立保持』时间检查,通常被称为非时序约束 ( non-sequential constraints ), 理论上set_data_check 可以设在任意的两个data pin 上,其中一个pin 称为 constrained pin 类似于寄存器的data pin, 另一个pin 称为related pin 类似于寄存器的clock pin.

cy413026的博客 1万+

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

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

strongerHuang 2826

Rocky Linux 9 离线环境Docker部署实战:从依赖打包到服务启动

本文提供了一份详尽的Rocky Linux 9离线环境Docker部署实战指南。针对无法访问外网的生产或内网服务器,文章详细讲解了如何在联网跳板机上下载Docker二进制包及所有系统依赖RPM包,并完成打包。随后,手把手指导在离线服务器上进行依赖安装、二进制文件部署、systemd服务配置、SELinux与防火墙调优,最终实现Docker服务的成功启动与验证。

weixin_28363123的博客 139

【rk3566/3568】Android 11移植gms

【rk3566/3568】Android 11移植gms 1、前言 测试功能时,想去Google play store去下个应用测试,发现通过网页搜索总是下载不到正确的谷歌服务框架;于是就不得不去搞一个内置的gms。 2、移植 1、需要下载Android 11对应的gms的包 opengapps 2、看下文件目录 直接移植core里面的文件,GAPPs Optional按需添加 3、在vendor下创建google目录 ...

lin_ff的博客 7647

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

Qt之QMqtt 发送图片数据

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议;MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛;在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT);其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用;

Ilson_的博客 1437

FreeRTOS死机原因

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

liangbin414的博客 1万+

CAPL学习之路-关键字

在capl中,关键字具有特殊的含义和用途,因此,不得将关键字用作变量或函数的名称 声明数据类型的关键字 可以用不同的关键字,声明或引用不同类型的数据 byte 声明一个字节的变量 word 声明两个字节的变量 dword 声明四个字节的变量 int 声明两个字节的整数 long 声明四个字节的变量 qword 声明八个字节的变量 char 声明一个字符串 float 声明一个浮点数,8个字节 double 声明一个浮点数,8个字节 定义一个结构体或枚举类型 struct struct Data { .

jasonj333 6108

从码农到生态建造者:我的一人公司运作方案

华哥·OPC 运营方案 v1.0 - 第一次迭代 🚀,搭建闭环生态系统,赋能 AI 时代的超级个体,更好的做自己,同时照亮别人。

AaronZZH 的博客 996

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

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

HXYDJ的博客 3776

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

STM32F40X系列单片机死机原因

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

m0_51385756的博客 1601

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

数学建模模型总结

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

freeRTOS中使用cJSON死机的问题

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

渡渡鸟的博客 1114

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

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

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、付费专栏及课程。

余额充值