0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

函数的具体实现

FPGA之家 来源:FPGA之家 作者:FPGA之家 2022-07-03 11:33 次阅读

嵌入式软件开发中,一个项目往往需要多人协作完成。

比如A需要完成项目的整体逻辑功能,而整个逻辑功能包含许多具体的小功能,但A又没有时间或能力来实现这些小功能,这时可以让B来协助实现函数内部的功能。

通常的思路是,B写好某个函数后,A直接通过B声明的函数调用即可。但这会有一些问题,例如B写好函数之后,A只能使用B声明的函数名来使用,假如B声明的函数名的命名规则很不符合A的口味,A用起来就很不爽,哈哈。那这样怎么办呢?聪明的A可以自己再声明一个自己喜欢的函数名,并通过函数指针传递的功能来获得B的功能。

下面来讲一下具体实现:

1 声明函数指针-A负责

比如A需要一个求和功能的函数,但他没时间写,他可以自己先声明一个函数指针:

//a中声明一个指针函数,其函数内部的功能需要另一个人b来完成 int (*mysum)(int, int)=0;

这个看起来和普通的函数声明很像,都有函数名,返回值类型与参数类型,但该函数名前有一个星号,表示它是函数指针,另外其函数实体可以先初始化为0。

2 函数指针赋值-A负责

这一步相当于函数指针初始化,也相当于函数注册,就是将A声明的函数指针,通过指针赋值的方式,来获得B实现的函数功能,相当于是给B写的函数套上一层A的壳:

//初始化指针函数,传入 b写的函数的函数名,//通过函数指针赋值,main中声明的函数,就可以使用b写的函数功能了 int init_mysum_func(int(*func_handle)(int,int)){            mysum = func_handle;            return 0;}
3 函数的具体实现-B负责

B这个人只要按照A声明的函数指针的格式(返回值与参数类型一致,函数名可以随意)完成函数内部功能即可,这里以简单的求和为例,在b.h文件中,B实现的功能如下:

int sum_by_b(int a, int b){    returna+b;}
4 项目整理逻辑-A负责

项目逻辑很简单,就是求1+2的值,这时A在使用自己声明的mysum之前,初始化(注册)一下该函数(将B写的函数“sum_by_b”套上A写的壳“mysum”),然后就可以使用了,使用实例如下:

int main(){    int res = 0;
    init_mysum_func(sum_by_b);//初始化指针函数, 将 b完成的函数功能赋予a声明的函数 
    res = mysum(1,2);//使用a声明的求和函数进行求和,其内部实现其实的b完成的 
    printf("mysum(1,2) = %d",res);
    return 0;}

测试结果:

mysum(1,2) = 3--------------------------------Process exited after 0.007424 seconds with return value 0请按任意键继续. . .

原文标题:嵌入式中的合作开发——函数指针

文章出处:【微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

审核编辑:彭静

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    3281

    浏览量

    60677
  • 嵌入式软件
    +关注

    关注

    3

    文章

    187

    浏览量

    26183
  • 函数指针
    +关注

    关注

    2

    文章

    47

    浏览量

    3660
收藏 人收藏

    评论

    相关推荐

    有关头文件写法或者函数声明调用的小技巧分享

    函数具体实现{ unsigned char aaa; aaa=11
    发表于 09-27 23:15

    关于C++中的函数重载机制

    函数参数的类型,并不会改变函数具体实现方式.
    发表于 10-01 17:18

    关于STM32外部中断不能进入问题

    具体实现过程不够明白。 还有就是我们参考的资料有时候不够完整,造成了不必要的浪费时间, 因此当用库函数不行的时候就用寄存器来试试吧。来几张图,给后来者参考一下。主函数部分中断设置优先级设置,顺便说说这个函数的头文件在misc.h里面,不知者还真找不到,我也是没法加进去试试才知道了。
    发表于 07-26 10:24

    怎么使具体实现代码不可见实现函数的封装?

    实现函数的封装,即能让别人调用,但是看不到具体实现代码。举个例子,一个开源项目,要把代码公布出去,但是代码中有些比较敏感的部分不想让别人看到,比如通信协议神马的,可以将这部分封装起来。具体如何实现呢?
    发表于 03-12 22:18

    例程看不到TL6748.h里每个函数具体实现

    函数具体实现呢。
    发表于 04-16 09:18

    HAL库函数具体实现原理

    函数具体实现原理。本文主要参考文献:正点原子.STM32F429 开发
    发表于 08-10 06:24

    STM32单片机是如何去实现LED灯反转的呢

    实现二、重要函数具体实现main.c#include "LED/LED.h"#include "
    发表于 11-26 07:13

    STM32串口具体函数该如何去实现

    具体函数该如何去实现呢?
    发表于 12-06 07:49

    串口打印中的printf函数的使用

    函数的人有这样的一个函数可以被调用( .h文件中)定义:函数具体实现的地方( .c文件中)二、三、串口打印中的printf函数的使用
    发表于 01-05 06:56

    FreeRTOS的任务创建过程

    函数分析任务创建函数为xTaskCreate(),函数具体实现如下:BaseType_t xTaskCreate(TaskFunction_t pxTaskCode,const
    发表于 02-08 06:10

    ARM cortex-a内核处理器过程具体实现

    函数具体实现的机器码了嘛~也就是说编译顺序,和运行顺序是不一样的。下面是cortex-a内核处理器过程,一目了然。而stm32等cortex-m内核处理器,起始运行流程不太一样,中断向量表给的是函数地址,而不是pc主动去装载指定的地址。原作者:标biao
    发表于 05-20 16:36

    记录总结一下基于RK3128平台的LCD驱动调试步骤

    函数指针接口函数, 供 lcd_mipi.c 调用, 函数具体实现  在
    发表于 09-23 16:28

    STM32单片机实现LED灯反转

    实现二、重要函数具体实现main.c#include "LED/LED.h"#include "
    发表于 11-19 10:21 65次下载
    STM32单片机<b>实现</b>LED灯反转

    FreeRTOS笔记(四):任务创建/删除,挂起/解挂详解

    函数分析任务创建函数为xTaskCreate(),函数具体实现如下:BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, const
    发表于 12-04 19:36 15次下载
    FreeRTOS笔记(四):任务创建/删除,挂起/解挂详解

    fprintf函数具体使用方法

    函数具体使用方法实例如下,fprintf函数可以将数据按指定格式写入到文本文件中。
    发表于 12-21 16:18 3.1w次阅读