函数调用在嵌入式架构设计中的应用

Posted strongerHuang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数调用在嵌入式架构设计中的应用相关的知识,希望对你有一定的参考价值。

关注+星标公众,不错过精彩内容

来源 | 大橙子疯嵌入式

函数调用很好理解,即使刚学没多久的朋友也知道函数调用是怎么实现的,即调用一个已经封装好的函数,实现某个特定的功能。

把一个或者多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口,然后在其他地方调用即可

函数调用方式

函数调用难道还能怎么调用?不就封装好直接调用吗???

函数调用方式分为两种:直接调用和间接调用

直接调用
直接调用就是我们平常使用的方式,下面的方式就属于直接调用了。

int SumFun(int a, int b)

    return a + b;


int main()

    // 直接调用定义好的函数
    int sum = SumFun(5, 6);
    printf("sum=%d", sum);
    return 0;

间接调用
间接调用在初学时很难使用到,这是通过函数指针的方式实现的。

函数指针本质是一个指针变量,是一个指向函数的指针(函数本身也是有地址的,指向的是函数入口);
指针函数本质是一个函数,其返回值为指针。

函数指针的用法如下:

typedef int (*FunctionCB)(int, int);

int SumFun(int a, int b)

    return a + b;


int main()

    // 将定义好的函数赋值给函数指针
    FunctionCB pfnSum = SumFun;

    // 通过函数指针间接调用
    int sum = pfnSum(5, 6);
    printf("sum=%d", sum);
    return 0;

什么场景使用

函数指针在软件架构分层设计中十分重要,因为分层设计中有一个设计原则,那就是下层函数不能直接调用上层函数,那么可以通过函数指针的方式实现;一般称上层通过函数指针赋值给下层的函数为回调函数。

什么情况会存在需要下层程序需要调用上层程序的呢?
比如串口数据接收,虽然可以通过查询的方式接收,但是远不及通过串口中断的方式接收及时,当接收完成时,需要立即通知上层读取数据进行处理,而不是等待上层程序查询读取。

如何实现呢?
比如硬件抽象层/驱动层中的串口模块实现函数

/************* UART.c 文件 ****************/
static UartRecvCB sg_pfnUartRecv;

// 设置数据帧接收处理回调函数
void UART_SetRecvCallback(UartRecvCB pfnUartRecv)

    sg_pfnUartRecv = pfnUartRecv;


void UART_Task(void)

    if (RecvEnd)
    
        // 数据一帧接收完成立即调用
        if (sg_pfnUartRecv != NULL)
        
            sg_pfnUartRecv(UartRecvBuf, UartRecvLength);
        
    


/************* UART.h 文件 ****************/
typedef void (*UartRecvCB)(const char *, int);

extern void UART_SetRecvCallback(UartRecvCB pfnUartRecv);
extern void UART_Task(void);

应用层代码中实现回调函数,并调用下层函数。

// 回调函数:串口数据处理
void OnUartRecvProcess(const char *pBuf, int length)

    // 处理串口数据
    printf("Recv: %s", pBuf);


int main()

    UART_SetRecvCallback(OnUartRecvProcess);

    while(1)
    
        if (TimeFlag)
        
            UART_Task();
        
    

上述示例中通过函数指针的方式间接调用了应用层的函数,而且并不违背分层设计原则。
如果看代码不能立即理解的话,可以尝试通过下图理解:


声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

------------ END ------------


●专栏《嵌入式工具

●专栏《嵌入式开发》

●专栏《Keil教程》

●嵌入式专栏精选教程

关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。


点击“阅读原文”查看更多分享。

以上是关于函数调用在嵌入式架构设计中的应用的主要内容,如果未能解决你的问题,请参考以下文章

三层架构与MVC

基于.NET平台的分层架构实战——依赖注入机制及IoC的设计与实现[转]

架构模式?设计模式?

回调函数的注册机制为什么会在嵌入式固件开发中应用如此广泛?

SoC嵌入式软件架构设计之六:API设计方法

DDD领域驱动设计实战-分层架构及代码目录结构