慕容薯条 发表于 2023-11-21 19:16:45

FreeRTOS中断里启动软件定时器,程序卡住

程序中需要接收串口数据,于是接收数据的思想是这样的。

串口中断接收到字节,启动定时器定时,在定时时间内收到新字节,则重新计时,一直到定时器超时调用回调函数处理接收到的数据。(类似modbus)
但实际无法实现功能,仿真进去在如下图片处停住


定时器创建为单次模式,创建完后不启动,仿真进去已经确认是创建成功了的。


串口接收中断,接收到字节则启动定时器


中断优先级组已经配置为了GROUP4,串口中断配置为了10



有关软件定时器的配置


已经百度查过,都是一堆关于软件定时器的教程和说明,无法解决我的问题。


eric2013 发表于 2023-11-22 08:07:24

卡在第1个截图上,说明你的优先级配置是有问题的。那个函数就是就是验证你的NVIC分组和中断配置有效性的。

再看你的代码,这个中断配置有问题,FreeRTOS下的NVIC配置有效性的情况下,这个中断是不能配置到最高抢占优先级的。



慕容薯条 发表于 2023-11-22 09:24:45

可以了,谢谢硬汉哥,中断管理的知识我还是要系统的认识学习一下。

慕容薯条 发表于 2023-11-24 21:05:25

硬汉大哥,在任务中调用xTimerReset()又出现了问题

慕容薯条 发表于 2023-11-24 21:20:33

eric2013 发表于 2023-11-22 08:07
卡在第1个截图上,说明你的优先级配置是有问题的。那个函数就是就是验证你的NVIC分组和中断配置有效性的。
...

硬汉大哥,我这里又出现了问题,在任务中调用xTimerReset函数,会进入configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );

在网上查资料,不是很明白问题在哪里。





    /* enter critical */
    taskENTER_CRITICAL();

    MultibuttonTimer_Create();
    CommToMCU2Timer_Create();
    RecloseRecvTimer_Create();
    NST1001Timer_Create();

    /* create led2 task */
    if(xTaskCreate((TaskFunction_t )led2_task_function,   
                  (const char*    )"LED2_task",   
                  (uint16_t       )512,
                  (void*          )NULL,
                  (UBaseType_t    )2,
                  (TaskHandle_t*)&led2_handler) != pdPASS)
    {

    }      
    else
    {
      //printf("LED2 task was created successfully.\r\n");
    }

RecloseRecvTimer_Create()是定时器的创建

void RecloseRecvTimer_Create(void)
{

    RecloseRecvTimer_Handler = xTimerCreate((const char *)"RecloseRecv_Timer_Callback",
                                          (TickType_t)20,         /* 5ms */
                                          (UBaseType_t)pdFALSE,    /* 单次模式 */
                                          (void*)5,
                                          (TimerCallbackFunction_t)RecloseRecv_Timer_Callback);

    if(RecloseRecvTimer_Handler != NULL)
    {

    }

}

在led2_task_function中调用回调函数
/* led2 task function */
void led2_task_function(void *pvParameters)
{
    TickType_t xLastWakeTime;
    xLastWakeTime = xTaskGetTickCount();

    uint32_t val;
    BaseType_t xReturn = pdTRUE;

    while(1)
    {
      LED1_Toggle();
      rtc_time_get();

      AdcSampleHandler.SampleStartFlag = 1;
      NST1001TimerGenenal_CallBack();
      Reclose_ReadStatus();       /* 读重合闸状态 */
      CommToMCU2_SendM01S01();    /* 读交流电压电流 */
      ModbusReg_Update();
      vTaskDelayUntil(&xLastWakeTime,2000);
   
    }
}

xTimerReset在函数Reclose_ReadStatus里面,实现发送后开始计时
/* 读状态 */
void Reclose_ReadStatus(void)
{
    uint8_t i = 0;
    uint16_t tempCRC;

    Reclose_TxData = 0x01;   /* 从机地址 */
    Reclose_TxData = 0x03;   /* 功能码 */
    Reclose_TxData = 0x00;   /* 寄存器地址高 */
    Reclose_TxData = 0x02;   /* 寄存器地址低 */
    Reclose_TxData = 0x00;   /* 寄存器数量高 */
    Reclose_TxData = 0x01;   /* 寄存器数量低 */

    tempCRC = do_crc(Reclose_TxData,i);/* 计算CRC */
    Reclose_TxData = ((uint8_t *)&tempCRC);   /* CRC */
    Reclose_TxData = ((uint8_t *)&tempCRC);   /* CRC */

    RECLOSE_Uart_SendString(Reclose_TxData , i);
    /* 发送完定时 */
    xTimerReset(RecloseRecvTimer_Handler, 20);
}

定时器的优先级还是与之前一致


eric2013 发表于 2023-11-25 08:48:08

慕容薯条 发表于 2023-11-24 21:20
硬汉大哥,我这里又出现了问题,在任务中调用xTimerReset函数,会进入configASSERT( ucCurrentPriority > ...

之前研究过这个没,研究下。

第12章 FreeRTOS中断优先级配置(重要)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=21094

慕容薯条 发表于 2023-11-28 09:17:11

eric2013 发表于 2023-11-25 08:48
之前研究过这个没,研究下。

第12章 FreeRTOS中断优先级配置(重要)


看起来我这个不是中断配置的问题,是用jlink仿真偶尔才会出现的问题。
页: [1]
查看完整版本: FreeRTOS中断里启动软件定时器,程序卡住