【问题标题】:Driver with callback function带回调函数的驱动程序
【发布时间】:2016-12-19 14:43:16
【问题描述】:

我一直在研究一些嵌入式软件。这个软件分 分为两个主要部分。第一个是应用软件和 第二个是一些系统软件。系统软件包括 一组驱动程序和 RTOS。我一直在开发应用程序部分 我一直在使用准备好的驱动程序。司机中还有 CAN 通信的驱动程序。其中一项功能具有以下功能 界面

result_t can_set_receive_callback (can_receive_callback_t cb);

除了这个函数之外,还有以下指针的定义 功能

typedef void (*can_receive_callback_t) (can_message_t msg);

我对如何使用驱动功能有疑问。我知道 我必须使用以下接口定义一些功能

void my_function (can_message_t m);

我也知道上面定义的函数就是所谓的回调函数。 但是不知道为什么要定义回调函数。

为什么不能简单地调用驱动函数而不传递函数指针作为参数?

这是否意味着我定义的回调函数“说”了如何处理收到的消息?驱动程序开发人员不知道的信息是什么?

我的意思是接收消息是 由准备好的中断服务程序处理,但没有提到 函数看起来像一个 ISR。

任何人都可以向我推荐一些好的文件吗? 描述了这种类型的司机工作?非常感谢。

【问题讨论】:

  • API 希望您将函数指针传递给您定义的函数。假设您的函数将在您收到 CAN 消息后立即执行。它将由驱动程序调用,而不是由程序员调用,因此称为“回调”。这不是标准化程序,而是您的特定驱动程序所独有的。您必须阅读有关驱动程序的文档以了解使用方法。或者如果没有文档,理解代码。

标签: c embedded driver can-bus isr


【解决方案1】:

OSI model说司机应该在物理层面上管理通信。

因此驱动程序执行通信设备激活、配置、读取、写入等操作来管理硬件以在您的总线 (CAN) 上进行通信。

数据链路层负责管理总线上发送和接收数据的“协议”。

所以驱动开发者要求数据链路层开发者设置当物理层触发特定事件时将调用的函数(回调)。

换句话说,在您的具体情况下,您必须设置一个回调,根据您的协议及其特性(结构、时间等...)管理接收到的数据

【讨论】:

  • 感谢LP们的回答。我想象以以下方式接收消息。首先,邮箱中有一条新消息。基于此事件调用适当的 ISR。 ISR 设置了一些由驱动程序函数定期测试的标志。一旦驱动函数检测到标志的状态变化,它就会重置标志,从邮箱中检索消息并调用回调函数。有准备好的代码进一步处理消息。这样对吗?谢谢。
  • 它应该可以工作,但请注意调用的函数会阻塞调用者函数。此外,据我了解,您还应该注意标志设置和重置:必须是原子或并发访问管理。
  • 感谢您的帮助,LP。
猜你喜欢
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
相关资源
最近更新 更多