当前位置: 首页 > news >正文

FreeRTOS实时系统 在任务中增加数组等相关操作 导致单片机起不来或者挂掉

在调试串口任务中增加如下代码,发现可以用keil进行仿真,但是烧录程序后,调试串口没有打印,状态灯也不闪烁,单片机完全起不来

博主就纳了闷了,究竟是什么原因,这段代码可是公司永流传的老代码了,我移植过来的可不敢出现问题

初步定位是该任务的运行空间少了,立马查看代码

xTaskCreate( Debug_Uart_Task, (const char*)"UART", 64, ( void * ) NULL, tskUART_PRIORITY, ( TaskHandle_t * ) NULL );

由原函数可知给的堆栈空间为64 * 2 = 128个字节

BaseType_t xTaskCreate(	TaskFunction_t pxTaskCode,const char * const pcName,const uint16_t usStackDepth,void * const pvParameters,UBaseType_t uxPriority,TaskHandle_t * const pxCreatedTask ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */{

才给了区区128个字节,这有点少了,毕竟我增加了很多功能,于是我从64增加到120。烧录打印,板卡单片机还是起不来。既然起不来,那就改回去,减少变量。

死去的调试记忆在攻击我!!!

再次怀疑为FreeRTOS整个堆空间少了,查看代码

尝试加大FreeRTOS整个堆空间,增加0x300,更改后如下

#define configTOTAL_HEAP_SIZE					((size_t)(19*512 + 0x468))     //系统所有总的堆大小

整个单片机的存储空间是固定的,增加了FreeRTOS的堆空间,就要同步减少单片机的栈空间

更改后如下图

再次烧录后单片机可以正常启动。

你以为到这完了,调试过程中总是会出现各种状况。。。

单片机在运行过程中,使用串口指令调试,会使得程序进入错误中断(HardFault_Handler),单片机挂掉,当然这种必现的bug还算比较好找原因的

在仿真调试的时候,初步认为程序没有问题,不太可能导致这样的情况发生,毕竟我在别的项目用这套代码运行的好好的

对比我定位是串口任务运行空间过少导致的,毕竟我这才给了64

xTaskCreate( Debug_Uart_Task, (const char*)"UART", 64, ( void * ) NULL, tskUART_PRIORITY, ( TaskHandle_t * ) NULL );

加大了运行空间后,程序正常运行。

如此调试告一段落

相关文章:

  • 四舍五入问题
  • 【ARM Cache 与 MMU 系列文章 7.6 -- ARMv8 MMU 配置 寄存器使用介绍】
  • HTML静态网页成品作业(HTML+CSS)—— 节日端午节介绍网页(5个页面)
  • GAT1399协议分析(8)--批量图像查询
  • 嵌入式学习——Linux高级编程复习(目录IO、软硬连接、makefile)——day38
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • npm安装依赖过慢
  • kafka的leader和follower
  • Java 的循环
  • Java | Leetcode Java题解之第128题最长连续序列
  • 计算文件md5
  • 智能避障小车设计
  • 0109__strip(1) command
  • STM32F103C8T6基于HAL库完成uC/OS-III多任务程序
  • 面试高频问题----5
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • js数组之filter
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Map集合、散列表、红黑树介绍
  • Rancher如何对接Ceph-RBD块存储
  • sessionStorage和localStorage
  • 初探 Vue 生命周期和钩子函数
  • 第2章 网络文档
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 浏览器缓存机制分析
  • 如何编写一个可升级的智能合约
  • 深度解析利用ES6进行Promise封装总结
  • 鱼骨图 - 如何绘制?
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 浅谈sql中的in与not in,exists与not exists的区别
  • # Redis 入门到精通(九)-- 主从复制(1)
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #NOIP 2014#Day.2 T3 解方程
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (14)Hive调优——合并小文件
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (TOJ2804)Even? Odd?
  • (WSI分类)WSI分类文献小综述 2024
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (力扣)1314.矩阵区域和
  • (十一)图像的罗伯特梯度锐化
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转载)Linux 多线程条件变量同步
  • .CSS-hover 的解释
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET/C# 使窗口永不获得焦点
  • .net分布式压力测试工具(Beetle.DT)
  • /etc/fstab和/etc/mtab的区别
  • []FET-430SIM508 研究日志 11.3.31
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [20150707]外部表与rowid.txt