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 );

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

如此调试告一段落

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值