回调是对高级软件传递给函数的可执行代码的引用。这些回调有能力极大地提高嵌入式软件的可移植性和重用性,但是根据它们的定义,嵌入式开发人员需要使用函数指针,如果不小心使用,可能会非常危险。以下是在嵌入式系统中安全创建和使用回调的五个技巧,尤其是在中断中使用回调时。
技巧1——创建设置或注册方法—回调通常被视为传递到函数中的函数指针,但它们也可以在可移植系统中用于设置将由中断服务例程(ISR)调用的函数。当中断触发时,中断处理程序将包含一个应该执行的函数的引用。中断的可执行函数将在运行时设置。
技巧2——将回调初始化为空值或默认值—创建一个包含回调寄存器或设置函数的外设驱动程序接口是创建可移植中断的一个重要步骤,但是有一个问题:如果一个回调没有被注册,但是中断被激活并触发了,会发生什么呢?中断服务例程需要某种方式来判断回调函数是否已经注册,提供这种验证的最简单的方法是首先将回调函数指针初始化为NULL。在ISR中对NULL进行简单的检查将会阻止任何处理程序的执行。嵌入式开发人员使用NULL的一种替代方法是将指针初始化为一个通用的空中断处理程序。当一个未初始化的中断回调被触发时,默认的处理程序将会运行。
技巧3——使用前验证回调—将回调指针的初始值设置为 NULL 或通用处理程序允许中断验证是否已设置中断处理程序。但是,在使用函数指针时,首先验证内存中引用的位置不是 NULL 并且确实存在于系统中。
技巧4——使用回调向较低级别的固件添加功能—回调函数对于以通用和特定于应用程序的方式向低级驱动程序和应用程序代码添加功能非常有用。为了生产松耦合和高内聚的固件,开发人员可以通过使用回调将中断向量和对其他外围模块的引用传递到驱动程序中。回调允许嵌入式开发人员在设计时添加应用程序特定的功能,而不必不断修改驱动程序代码来获得所需的行为。回调可以用这种方式产生非常干净,可移植和可重用的固件和接口。
技巧5——创建抽象回调函数—回调函数通常需要接受未知数量的参数,它们可能返回数据,也可能不返回数据,这取决于应用程序的需要。然而,开发人员的目标是编写抽象的回调函数。对于与中断相关的回调,回调只是作为中断服务例程的一部分被调用,函数可以接受一个void参数并返回void。任何需要与应用程序共享的数据都将以与中断相同的方式处理。对于可能与错误处理或其他自定义功能相关的驱动程序回调,处理参数和返回值的最简单方法是传递一个指针并返回一个指针。
最后的想法
回调在嵌入式系统中有广泛的用途,尤其是在开发可移植和可重用的固件时。本文提供了五个例子,讲明嵌入式开发人员如何考虑和实现中断回调,但它们只是其中的一小部分。
发表评论 取消回复