在福建省体彩网中使用回调

每周,我都会收到大量有关如何设计嵌入式系统的问题的电子邮件。一个似乎比其他问题更常见的问题是如何编写可配置的驱动程序,该驱动程序使用带有福建省体彩网的回调。如果开发人员正在编写将在多个应用程序中重用的驱动程序,则通常将福建省体彩网编译到该驱动程序中,因此使福建省体彩网处理程序灵活的唯一方法是使用回调,但这样做到底是怎么做的?在今天的帖子中,我们将深入探讨如何执行此操作。

(图片来源: 可重用固件开发)

 

UART硬件抽象层(HAL)示例

为了理解回调和福建省体彩网我们需要做什么,看一个例子很有用。假设我们有一个UART或USART,可在多个应用程序中重复使用。我们为基本功能定义了一个硬件抽象层,以便我们可以将驱动程序代码与应用程序代码分离。该界面可能类似于以下内容:

void Uart_Init(UartConfig_t const * const Config);
void Uart_BaudRateSet(UartChannel_t const Channel, UartConfig_t const * const Config);
uint8_t Uart_CharGet(UartChannel_t const Channel);
void Uart_CharPut(UartChannel_t const Channel, char const Ch);
uint8_t Uart_IsDataPresent(UartChannel_t const Channel);
void Uart_RegisterWrite(uint32_t const Address, uint32_t const Value);
uint32_t Uart_RegisterRead(uint32_t const Address);
void Uart_CallbackRegister(UartCallback_t const Function, void (*CallbackFunction)(void));

请注意,该接口具有可用于注册回调函数的方法。此注册使开发人员可以使用其回调函数,并将其分配给需要将其分配给此类UART接收或发送福建省体彩网的福建省体彩网。

 

建立福建省体彩网码

在UART驱动程序中,可能定义了几个不同的福建省体彩网。例如,一个福建省体彩网处理程序可能是:

void Uart0_ISR(void);

通常,我们用以下应用程序代码填充此福建省体彩网:

void Uart0_ISR(void)
{
    HAL_UART_Transmit(&huart2, (uint8_t *)aRxBuffer, 1, 0xFFFF);

    CBUF_Push(RxDataBuffer, aRxBuffer[0]);

    HAL_UART_Receive_IT(&huart2, (uint8_t *)aRxBuffer, 1);
}

虽然此代码是特定于应用程序的,但我们希望分配福建省体彩网在运行时的功能。

 

相反,我们可以如下设置福建省体彩网处理程序:

void Uart0_ISR(void)
{
    if(UART0_ISR->function != NULL)
    {
        (*UART0_ISR->function)();
    }   
}

这里的想法是,我们将使用函数指针来指定在福建省体彩网触发时应执行哪个函数。如果没有分配福建省体彩网,即函数指针分配为NULL,那么我们什么也不做。如果分配了函数指针,则我们执行函数。

 

分配功能指针

使用以下HAL函数在运行时设置分配给函数指针的函数:

void Uart_CallbackRegister(UartCallback_t const Function, void (*CallbackFunction)(void));

我们可以使用以下示例为应用程序定义一个回调函数:

void MyIsrFunction (void)
{
    HAL_UART_Transmit(&huart2, (uint8_t *)aRxBuffer, 1, 0xFFFF);
    CBUF_Push(RxDataBuffer, aRxBuffer[0]);
    HAL_UART_Receive_IT(&huart2, (uint8_t *)aRxBuffer, 1);
}

然后,系统初始化代码进行以下调用,以将函数分配给在福建省体彩网服务处理程序中执行的函数指针:

Uart_CallbackRegister(UART0_ISR, MyIsrFunction);

 

删除动态回调分配

拥有一个可以调用以更改福建省体彩网执行的功能的API似乎很危险,或者可能是一个安全漏洞。分配API的另一种方法是改为使用配置表在编译时初始化函数指针。您会注意到,Uart_Init函数具有以下形式:

void Uart_Init(UartConfig_t const * const Config);

配置表可用于分配执行的功能。这里的优点是多重的,例如:

  • 该函数在编译时分配
  • 通过const表进行分配
  • 可以进行功能指针分配,使其驻留在ROM和RAM中,这将使其在运行时不可更改

当然,可以通过几种不同的方法来完成此操作,但是这样做的想法是使驱动程序代码恒定,不变,甚至可以作为预编译的库提供。这样,应用程序代码仍然可以轻松更改福建省体彩网行为,而不必查看实现细节。

 

结论

正如我们在今天的帖子中所看到的,回调可用于轻松创建灵活且可扩展的福建省体彩网服务例程。我们已经看到,开发人员可以使用多种方法以这种方式使用回调。我的个人偏爱是静态分配回调,以使其在运行时无法更改,但是动态分配对执行期间可能需要更改福建省体彩网行为的应用程序很有用。

7 thoughts 上 “在福建省体彩网中使用回调”

  1. 嗨,Jacob,我在驱动程序中广泛使用了类似的回调方法,但是我将HAL层构造为仅注册客户端回调以在任务级别执行。该技术假定您具有从ISR发出信号或发消息通知工作人员任务的基本方法,但这可以具有非常严格的可预测ISR功能。这是因为情监侦’接收端唯一的工作是读取一个字节并将其馈送到缓冲区(通常是环形缓冲区)中,并向相关的串行任务发出信号以处理缓冲区。这也支持多个客户端回调(回调列表),对于串行驱动程序,我将端口信息保存在静态数组中,并且可以将串行流路由进出不同的端口。这仅在客户端驱动程序代码可以容忍更慢的计时并且不能’对实时性有严格的要求(例如测量字节间的时序),但这是通常的情况。
    感谢您的文章。

  2. 嘿,雅各!

    我认为线下的代码框“相反,我们可以如下设置福建省体彩网处理程序:”是不正确的。它似乎是先前ISR代码的重复。相反,我认为应该在其中调用回调函数。

    干杯!

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.