完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
正如我之前提到的,我正在尝试在 XMC700 系列设备上用 C++ 为 CAN 总线创建一个抽象层。
我想在 RTOS 和其他设备系列中使用此应用程序,我习惯于创建一个 RTOS 线程来查询硬件 CAN 接收缓冲区并将它们放入 RTOS 队列。 我面临的挑战是,唯一的 CAN 接收示例使用中断驱动的回调,这需要全局范围的命名函数。 这是非常具有挑战性的,因为我可以直接链接到类函数的名称,而无需将该函数声明为静态函数,从而消除了在芯片上不同CAN总线设备之间重用代码的许多好处。 有没有办法或示例来编写一个函数来检查 CAN 硬件的接收缓冲区并以更符合 RTOS 的轮询方式提取任何新消息? |
|
相关推荐
1个回答
|
|
首先,确保你的CAN硬件驱动程序提供了一个函数来检查接收缓冲区中是否有新消息。这个函数可以是阻塞的或非阻塞的,具体取决于你的需求和RTOS的要求。以下是一个示例函数,用于检查接收缓冲区中是否有新消息并将其放入队列中:
```cpp void checkCANBuffer() { // 检查CAN接收缓冲区是否有新消息 if (canReceiveBufferNotEmpty()) { // 读取CAN接收缓冲区中的消息 CANMessage message = canReadMessage(); // 将消息放入RTOS队列中 xQueueSendToBack(canMessageQueue, &message, portMAX_DELAY); } } ``` 上述示例中,`canReceiveBufferNotEmpty()` 和 `canReadMessage()` 是你需要自己实现的函数,用于检查和读取CAN接收缓冲区中的消息。`canMessageQueue` 是一个RTOS队列,用于存储CAN消息。 然后,你可以在一个RTOS线程中周期性地调用 `checkCANBuffer()` 函数来检查CAN接收缓冲区中是否有新消息并将其放入队列中。以下是一个使用FreeRTOS的示例: ```cpp void canThread(void *parameters) { while (true) { // 检查CAN接收缓冲区并处理新消息 checkCANBuffer(); // 休眠一段时间,然后继续循环 vTaskDelay(pdMS_TO_TICKS(10)); } } ``` 在上述示例中,`canThread()` 是一个RTOS线程函数,其中调用了 `checkCANBuffer()` 函数来处理CAN消息。线程以每10毫秒的间隔运行。 通过这种方式,你可以在RTOS环境中创建一个线程来检查CAN接收缓冲区并以更符合RTOS的轮询方式提取任何新消息,而不需要使用中断驱动的回调。这样,你可以更好地在不同设备系列之间重用代码,并使用类成员函数进行处理。注意要处理好多个线程之间的并发访问和同步问题,以确保数据的正确性和一致性。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十五章 摄像头实验
632 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
671 浏览 0 评论
772 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
1340 浏览 0 评论
1166 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12057 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 21:45 , Processed in 0.639894 second(s), Total 75, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号