开发环境:Window10 + MDK + STM32F407 + FreeRTos
操作方法:CAN 发送中断中发送信号量通知线程数据发送完成。
/** * @brief This function handles CAN1 TX request. * @param None * @retval None */ void CAN1_TX_IRQHandler(void) { static portBASE_TYPE xHigherPriorityTaskWoken; xHigherPriorityTaskWoken = pdFALSE; if (CAN_GetITStatus(CAN1, CAN_IT_TME)) { // 给CAN发送任务发送信号量 xSemaphoreGiveFromISR(CAN_TxSemaphore, &xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPriorityTaskWoken); // 切换上下文,否者实时性变差 // 清除中断标志 CAN_ClearITPendingBit(CAN1, CAN_IT_TME); } }
1、中断中需要切换上下文,否者系统响应的实时性有影响:
portYIELD_FROM_ISR(xHigherPriorityTaskWoken); // 切换上下文,否者实时性变差
(1)信号量不切换上下文,系统响应时间700+微秒
(2)信号量发送后执行切换上下文操作,实时性增强,仅仅30微秒