基于STM32F103C8T6移植Free-RTOS中程序运行至HardFault_Handler的问题(二)

MCU : STM32F103C8T6

编译器:Keil5

前言: 打算学习一下Free-RTOS,手里有一块STM32F103C8T6的板子,就想着先拿来练手,移植上去先学起来,并且打算在CSDN上记录一下一路遇到的坑,萌新第一次写博客,如果有什么意见或者不对的地方欢迎大家留言。

经历千辛万苦,程序终于0 Warning 0 Error,写了一个简单的串口收发,下载进去一测试,发现程序不运行,软件调试,程序进入到了HardFault_Handler中断服务函数中,根据网上的调试方法我现实在HardFault_Handler加入断点。

void HardFault_Handler(void)
{
  if (CoreDebug->DHCSR & 1) {  //check C_DEBUGEN == 1 -> Debugger Connected  
      __breakpoint(0);  // halt program execution here         
  }  
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

找到程序卡死在奇奇怪怪的地方,这里也记录一下所查到的在移植Free-RTOS中可能进入HardFault_Handler的情况。

1.FreeRTOSConfig.h中 没有配置与RTOS有关的中断的宏定义

#define xPortPendSVHandler 	PendSV_Handler
#define vPortSVCHandler 	SVC_Handler
#define xPortSysTickHandler SysTick_Handler

2.系统总堆栈设置的太小,以致于任务分配内存时出错

#define configTOTAL_HEAP_SIZE		((size_t)(10 * 1024))	/* 系统总堆栈大小	*/

3.外设中断分组应该配置为NVIC_PriorityGroup_4

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

这是我遇到的坑~

当找到问题根源的时候感觉好坑啊 真的事跟着上面改来改去,他就是一直进中断,而且加入断点分步调试,初始任务创建成功,在初始任务中,在创建一个任务,立马就跳入HardFault_Handler中断,当时一直想的是创建的几个任务堆栈给的太小了?
系统总堆栈又给的太小了?改来改去还是没有效果,最后一气破罐子破摔,只创建了两个任务,一个是启动任务,一个是串口发送任务,堆栈都给到很大,下载调试,竟然通过了,才意识到
初始启动任务的任务堆栈不能创建的太小 看来不能秉着勤俭节约的心态写代码~该给的还是要给的。。。

	#define START_STK_SIZE		64							//初始任务的任务堆栈大小 4byte为一个单位

我记得也看到过一个文章说这方面的问题,就是在FreeRTOS中,如果你只创建的一个任务,而这个任务的堆栈已经溢出,是不会报错的,而且如果你只有一个任务的话,它还可以一直的正常运行,但是只要你创建的第二个任务,他就会直接跳入HardFault_Handler当中。

你可能感兴趣的:(基于STM32F103C8T6移植Free-RTOS中程序运行至HardFault_Handler的问题(二))