FreeRTOS中断里启动软件定时器,程序卡住
程序中需要接收串口数据,于是接收数据的思想是这样的。串口中断接收到字节,启动定时器定时,在定时时间内收到新字节,则重新计时,一直到定时器超时调用回调函数处理接收到的数据。(类似modbus)
但实际无法实现功能,仿真进去在如下图片处停住
定时器创建为单次模式,创建完后不启动,仿真进去已经确认是创建成功了的。
串口接收中断,接收到字节则启动定时器
中断优先级组已经配置为了GROUP4,串口中断配置为了10
有关软件定时器的配置
已经百度查过,都是一堆关于软件定时器的教程和说明,无法解决我的问题。
卡在第1个截图上,说明你的优先级配置是有问题的。那个函数就是就是验证你的NVIC分组和中断配置有效性的。
再看你的代码,这个中断配置有问题,FreeRTOS下的NVIC配置有效性的情况下,这个中断是不能配置到最高抢占优先级的。
可以了,谢谢硬汉哥,中断管理的知识我还是要系统的认识学习一下。 硬汉大哥,在任务中调用xTimerReset()又出现了问题 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);
}
定时器的优先级还是与之前一致
慕容薯条 发表于 2023-11-24 21:20
硬汉大哥,我这里又出现了问题,在任务中调用xTimerReset函数,会进入configASSERT( ucCurrentPriority > ...
之前研究过这个没,研究下。
第12章 FreeRTOS中断优先级配置(重要)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=21094 eric2013 发表于 2023-11-25 08:48
之前研究过这个没,研究下。
第12章 FreeRTOS中断优先级配置(重要)
看起来我这个不是中断配置的问题,是用jlink仿真偶尔才会出现的问题。
页:
[1]