鸣蜩伍 2023-10-24 17:00 采纳率: 20%
浏览 48
已结题

程序运行过程中卡在HardFault_Handler中

程序在运行过程中卡在HardFault_Handler中

img

#define START_TASK_PRIO                  1 //¿ªÊ¼ÈÎÎñµÄÓÅÏȼ¶ÉèÖÃΪ×îµÍ
#define START_STK_SIZE                  64    
OS_STK START_TASK_STK[START_STK_SIZE];
void start_task(void *pdata);    

#define Main_TASK_PRIO                    0
#define Main_STK_SIZE                      6000
OS_STK Main_TASK_STK[Main_STK_SIZE];
void Main_task(void *pdata);


void start_task(void *pdata)
{
    OS_CPU_SR cpu_sr=0;    
    pdata = pdata; 
    OSStatInit();        
    OS_ENTER_CRITICAL();       
    OSTaskCreate(Main_task,(void *)0,(OS_STK*)&Main_TASK_STK[Main_STK_SIZE-1],Main_TASK_PRIO);
    OSTaskSuspend(START_TASK_PRIO);    
      OS_EXIT_CRITICAL();                
}



void Main_task(void *pdata)
{        
      while(1)
    { 
      still_task();
     still1();
still2();
still3();
still4();
still5();
still6();
    }
}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-24 18:11
    关注

    【以下回答由 GPT 生成】

    问题很明显,你的代码中存在一些潜在的问题,导致程序在运行过程中卡在HardFault_Handler中。下面是一些可能的解决方案:

    1. 错误的任务优先级分配: 你的开始任务的优先级设置为1,而主任务的优先级设置为0。在某些情况下,开始任务可能会在主任务之前执行完毕并退出,导致程序无法继续执行。建议将开始任务的优先级设置为较高的值,如2或更高,以确保主任务在开始任务之后执行。

    2. 堆栈溢出: 你为开始任务和主任务分配的堆栈大小可能不足以容纳任务执行期间所需的局部变量和函数调用。建议增加堆栈大小,例如将START_STK_SIZE增加到128,Main_STK_SIZE增加到8192,确保堆栈足够大以容纳任务的运行。

    3. 死循环: 在主任务中,你似乎没有提供任务切换的机制,导致主任务一直在执行still_task()等函数调用,而没有给其他任务运行的机会。这可能会导致系统无响应,最终卡在HardFault_Handler中。建议在主任务的循环中添加任务切换函数,例如OSTimeDly或OSDelay,以允许其他任务运行。

    下面是修改后的代码示例:

    #define START_TASK_PRIO 2 // 开始任务优先级设置为2
    #define START_STK_SIZE 128
    OS_STK START_TASK_STK[START_STK_SIZE];
    void start_task(void *pdata);    
    
    #define Main_TASK_PRIO 1 // 主任务优先级设置为1
    #define Main_STK_SIZE 8192
    OS_STK Main_TASK_STK[Main_STK_SIZE];
    void Main_task(void *pdata);
    
    void start_task(void *pdata)
    {
        OS_CPU_SR cpu_sr = 0;    
        pdata = pdata; 
        OSStatInit();        
        OS_ENTER_CRITICAL();       
        OSTaskCreate(Main_task,(void *)0,(OS_STK*)&Main_TASK_STK[Main_STK_SIZE-1],Main_TASK_PRIO);
        OSTaskSuspend(START_TASK_PRIO);    
        OS_EXIT_CRITICAL();                
    }
    
    void Main_task(void *pdata)
    {        
        while(1)
        { 
            still_task();
            still1();
            still2();
            still3();
            still4();
            still5();
            still6();
            OSTimeDly(1); // 添加任务切换函数,每次循环后允许其他任务运行
        }
    }
    

    请尝试使用上述修改后的代码重新构建和运行程序,查看是否可以解决卡在HardFault_Handler的问题。如果问题仍然存在,请检查其他可能导致问题的因素,例如硬件故障或外设驱动程序错误。如果你无法确定问题的根本原因,请进行进一步的调试和排查,或在STM32开发者论坛上寻求帮助。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月2日
  • 已采纳回答 10月25日
  • 创建了问题 10月24日