硬汉大哥,我这里又出现了问题,在任务中调用xTimerReset函数,会进入configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
port.c 789行
在网上查资料,不是很明白问题在哪里。
网上查的资料1
网上查的资料2
根据网上查看的优先级
[C] 纯文本查看 复制代码 /* 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()是定时器的创建
[C] 纯文本查看 复制代码 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中调用回调函数
[C] 纯文本查看 复制代码 /* 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里面,实现发送后开始计时
[C] 纯文本查看 复制代码 /* 读状态 */
void Reclose_ReadStatus(void)
{
uint8_t i = 0;
uint16_t tempCRC;
Reclose_TxData[i++] = 0x01; /* 从机地址 */
Reclose_TxData[i++] = 0x03; /* 功能码 */
Reclose_TxData[i++] = 0x00; /* 寄存器地址高 */
Reclose_TxData[i++] = 0x02; /* 寄存器地址低 */
Reclose_TxData[i++] = 0x00; /* 寄存器数量高 */
Reclose_TxData[i++] = 0x01; /* 寄存器数量低 */
tempCRC = do_crc(Reclose_TxData,i); /* 计算CRC */
Reclose_TxData[i++] = ((uint8_t *)&tempCRC)[0]; /* CRC */
Reclose_TxData[i++] = ((uint8_t *)&tempCRC)[1]; /* CRC */
RECLOSE_Uart_SendString(Reclose_TxData , i);
/* 发送完定时 */
xTimerReset(RecloseRecvTimer_Handler, 20);
}
定时器的优先级还是与之前一致
定时器优先级
|