1. FreeRTOS中断里发送数据到队列
- 在使用FreeRTOS时,从中断里向外发送数据到队列中需要使用
xQueueSendToBackFromISR
,例如如下函数:
can_receive_message_struct receive_message;
void CAN_Recv_ISR( void )
{
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
/* check the receive message */
can_message_receive( CAN0, CAN_FIFO0, &receive_message );
xQueueSendToBackFromISR( CAN_Recv_Queue_Handler, &receive_message, &xHigherPriorityTaskWoken );
// Now the buffer is empty we can switch context if necessary.
if( xHigherPriorityTaskWoken == pdTRUE )
{
//taskYIELD();
//这里需要改为中断中转换
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
}
这个函数是写在gd32f20x_it.c中的 void CAN0_RX0_IRQHandler(void)
函数里,所以当数据发送到队列中之后要使用portYIELD_FROM_ISR
函数来转换优先级。
2. CAN收发器的休眠与唤醒
- 控制板中使用的CAN收发器型号是SIT1050,从原理图中可以看出5引脚悬空,并没有使用休眠和唤醒。如果想使用该功能,需要将5引脚接入MCU的GPIO引脚进行控制。
3. CAN过滤器使用扩展帧过滤广播地址
- 控制板中使用的广播地址是
00000:广播信息,网络中所有节点都应该接受该目的ID的信息包
,下图中红框为广播地址加数据帧总共32位,最后3位分别是IDE(是否为扩展帧选择位,0代表标准帧)
,RTR(是远程帧还是数据帧,0代表数据帧)
,固定位0
,使用的CAN波特率为500Kbps。
当过滤器设置为32位的0xF8000007时对应的二进制是
为数字1的位就代表需要对红框中对应的位进行过滤,所以过滤器只会考虑前五位(接收广播地址)和后三位(保证为数据帧,扩展帧,固定位0)进行筛选。
4. FreeRTOS中将毫秒(ms)转换为ticks的函数
- pdMS_TO_TICKS 是 FreeRTOS 提供的一个宏,用于将时间(以毫秒为单位)转换为 FreeRTOS 中的系统节拍(ticks)。这是因为 FreeRTOS 的时间管理基于系统节拍,而不是直接使用时间单位(如毫秒、秒等)。
vTaskDelay( pdMS_TO_TICKS( 200 )); // Running Every 200ms