C语言日积月累(一)

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

滚动至顶部