项目移植FreeRTOS实际问题记录--未创立创立二值信号量就调用导致HardFault_Handler触发


 int main(void)
 {              
    u8 t = 0;
    u8 len;    
  uint16_t time = 0,time1 = 0,time2;      
    char outputStr[] = "TC1:TCACTCUR?\r";  
    delay_init();             //延时函数初始化    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);// 设置中断优先级分组2         
   //溢出时间为1s     
     
    uart_init(9600);     //串口初始化为9600
    uart2_init(57600);     //串口初始化为115200
    uart3_init(115200);     //串口初始化为115200 
     // YXIAN_init 是与业贤串口通信,但是但是二值量还没创建
     /*是的,在 ISR 里对一个尚未创建(仍是 NULL)的 Semaphore 句柄调用 xSemaphoreGiveFromISR(),会直接解引用空指针 → 触发 HardFault。
在 Cortex-M 上,空指针解引用会立即跳转到 HardFault_Handler,所以你会看到“硬件异常”。
*/
    YXIAN_init();  /*该函数会调用串口2与设备通信,在接受返回数据时会触发串口中断,内部存在一个二值信号量的释放,但是二值信号量此时还没被创立*/
    stmflash_init( );//初始化下位机地址 读取寄存器里的值

printf("重启成功\r\n");

    xTaskCreate(start_task,"start_task",START_STK_SIZE,NULL,START_TASK_PRIO,&StartTask_Handler);/*创建起始任务*/
    vTaskStartScheduler();     /*开启多任务调度*/       

    while(1)
    {     
     
    }
}    

void USART2_IRQHandler(void)  // 串口2中断服务程序
{
         BaseType_t xHigherPriorityTaskWoken = pdFALSE;
    u8 Res;
#if SYSTEM_SUPPORT_OS  // 如果 SYSTEM_SUPPORT_OS 为真,则需要支持 OS
    OSIntEnter();
#endif

    if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  // 接收中断
    {   
            LED0 = !LED0;
        Res =USART_ReceiveData(USART2);
//printf("进入串口2的中断1\r\n");
        USART2_RX_BUF[USART2_RX_STA++] = Res;  // 读取接收到的数据
        if (Res == 0x0D) 
        {    
                    USART2_FLAS = 0x01;
            USART2_RX_len = USART2_RX_STA ; 
            USART_ClearITPendingBit(USART2, USART_IT_RXNE);
xSemaphoreGiveFromISR(YX_TO_STM32_USART2_Sem,
&xHigherPriorityTaskWoken); // 释放二值信号量 portYIELD_FROM_ISR(xHigherPriorityTaskWoken); // 如果唤醒任务优先级高,则立即切换 } if (USART2_RX_STA >= USART_REC_LEN) { USART2_RX_STA = 0; // 超过缓冲区长度,重置状态 } USART_ClearITPendingBit(USART2, USART_IT_RXNE); } if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) // 检查 ORE 标志 { USART_ClearFlag(USART2,USART_FLAG_ORE); USART_ReceiveData(USART2); USART2_RX_STA = 0; } #if SYSTEM_SUPPORT_OS OSIntExit(); #endif }
posted on 2025-08-26 11:06  Aliang2020  阅读(25)  评论(0)    收藏  举报