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

SIwave学习记录:电热耦合仿真

SIwave电热耦合仿真

m0_68174736的博客 2336

基于人脸识别的课堂考勤系统 tkinter+openpyxl+face_recognition

基于face_recognition库实现人脸考勤系统功能。利用Python的tkinter模块来设计考勤系统的图形化界面,此外结合openpyxl模块,实现将学生的信息和考勤打卡数据保存到表格中,方便查看和调用。该系统具备“刷脸打卡”、“新学生注册”等功能。............

lyx4949的博客 6966

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

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

weixin_30379531的博客 440

从零构建AXI接口的DDR3控制器:MIG IP核实战指南

本文详细介绍了如何从零构建AXI接口的DDR3控制器,重点解析MIG IP核的配置流程和优化策略。通过实战案例和仿真验证,帮助开发者掌握FPGA中DDR3控制器的AXI接口设计,提升高速数据传输效率。适用于图像处理、网络加速等高性能应用场景。

weixin_28256233的博客 451

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

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

strongerHuang 2826

Python实现课程时间表

用Python实现课程表功能

life is like a play 2042

Vue和Vue-Element-Admin(六):集成中的CORS(跨域资源共享)问题

在vue-element-admin登录集成时候碰到跨域资源共享问题,CORS(Cross-origin resource sharing)是浏览器的技术规范,浏览器可以发起跨域请求但Javascript脚本不能,传统的ajax只能获取在同域名下的资源,但Html5允许ajax发起跨域请求,解决方案有:JSONP、Flash、IFrame、CORS。 一、CORS(跨域资源共享)问题 针对vue-element-admin的登录模块的后端接口完成后,前端调用时候出现报错,因为前端的端口是9527而后.

叶子叶来 9615

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

PPF函数可视化生产可能性边界线(R语言)

假设产品A的生产函数为A = 2 * R1 + R2,产品B的生产函数为B = R1 + 2 * R2,其中A和B分别表示产品A和产品B的产量,R1和R2表示资源1和资源2的分配数量。首先,让我们定义两种产品:产品A和产品B,它们的生产分别需要不同的资源和技术。现在我们已经计算了每种分配比例下的产品A和产品B的产量,接下来我们可以绘制生产可能性边界线。运行完整的代码后,我们将得到一个图形,显示了生产可能性边界线,该线代表经济体在给定资源和技术条件下所能生产的所有产品组合。

2301_79326559的博客 874

FreeRTOS死机原因

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

liangbin414的博客 1万+

黑猫带你学eMMC协议第29篇:eMMC设备锁详解(CMD42)

通过cmd42命令,可以给emmc设置密码,并且锁定emmc。这时候就不能对emmc的user分区进行读写数据访问了。设备锁在V4.3版本后的emmc里面,就只能保护user area分区,因此,被锁定的emmc,依旧可以正常访问BOOT\RPMB\GPP分区。emmc内部有128 bit PWD寄存器,用来存放密码,以及有8bit PWD_LEN寄存器,用来密码长度。这两个寄存器非易失性,掉电也不会丢失。

黑猫奥利奥的博客 3237

AI Agent开发第82课-手把手教你把paddleocr-vl做成mcp使其在DIFY里运行

本文详解如何将国产顶尖多模态 OCR 模型 PaddleOCR-VL 封装为标准 MCP(Model Calling Protocol)服务,并通过自研的 HTTP-based MCP Client 接入 Dify 1.10,实现 AI Agent 在对话中自动识别并调用 OCR 能力。该方案已在某头部保险公司真实业务流程中落地,使用了当前最先进的“Agentic AI 原生”设计思想。

打造全国最全的AI Agent开发知识领域的博客 1626

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

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

HXYDJ的博客 3776

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

STM32F40X系列单片机死机原因

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

m0_51385756的博客 1601

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

freeRTOS中使用cJSON死机的问题

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

渡渡鸟的博客 1114

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

余额充值