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

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

3天内不再提示

嵌入式开发软件中回调函数的使用

strongerHuang 来源:最后一个bug 作者:最后一个bug 2022-04-29 08:57 次阅读

嵌入式开发软件中回调函数是经常接触的一种软件设计方法,像我们的事件处理机制基本上都会使用到回调函数。

那么就抽了点时间来聊聊他们:

什么是回调函数?

C语言中,回调函数其实与函数指针的调用在语法上并没有太大的差异,而为什么叫回调函数主要还是从功能上给它起的名字,即这个函数会被"返回来调用"。

而这里所谓的“返回”就涉及到一个方向性问题,从哪里来到哪里去。而在软件中通常就是与“分层设计思想”挂钩的。

在软件设计领域分层设计方式是非常广泛的,在嵌入式中最简单的分层就是两层"驱动层"和“应用层”。

4bcec1ec-c754-11ec-bce3-dac502259ad0.png

当函数功能上进行分层以后不应该直接在底层驱动中直接调用应用层函数等,比如应用程序通过调用驱动层接口获得物理量数据,我们常规的做法大部分都是不断的轮询相应的API接口返回数据,这样可能会导致不断的IO操作,效率相对比较低下。

那么应用程序是否可以化主动为被动呢,一直舔狗实在是太累了?既然你现在不想搭理我,那等你准备好了,再来告诉我吧,到时候调用我给你的函数就可以了,这个函数已经放在了传给你的函数指针里了,那么这里应用程序所给的函数就是回调函数。

比如我们经常会在应用程序中查询按键是否被按下,然后得编写一大堆的时序等等,还与应用逻辑耦合在一起。

其实按键是是如何检测被按下的过程对于应用程序它并关心,底层程序查询确定好状态给应用程序一个是否按下的通知或者状态即可。

此时底层按键检测程序要通知应用程序,就可以通过相应的回调函数来通知应用层并处理即可。

如果还有点难理解,可以看看stm32使用hal库,你会发现在中断中有大量的回调函数指针被调用,其实回调函数的效果与中断服务函数的执行效果是类似的,hal库中使用回调函数的方式把中断的相关事件服务处理交给了用户自身来注册。

把中断看成一种事件类型,那么回调函数的使用其实就类似于一种事件驱动机制。

同步与异步调用

首先要理清楚这两种方式需要理解什么是同步和异步。

同步调用表示当调用一个底层接口,必须回调函数被执行完毕,不然该接口会一直处于堵塞状态没办法返回结果,且程序无法往下执行。

异步调用表示当调用一个底层接口以后,不需要等待回调函数执行完毕,便可以直接返回继续做下面的事情,最终底层准备好以后便会执行回调函数处理应用层事务,所以我们也称这种回调函数为异步回调函数。

而异步调用的好处在于调用函数不需要阻塞可以继续执行,从而大大提高程序运行效率,但由于异步回调函数在时间上是无序的,导致当我们需要异步调用函数能够顺序执行时便会存在难度,使得业务逻辑比较复杂,难以理解。

为了保证回调的有序性,就需要以上一次回调的结果作为本次异步调用的条件,导致代码一层嵌套一层非常的冗长,类似于ifelse里面再嵌套ifelse之势,所以也很多人称这种方式为 Callback hell(回调地狱)。

为了改善这种结构,通常会采用协程的概念去处理异步回调来规避该问题。对于异步调用常与多线程进行结合,在另外一个线程中执行异步操作,然后调用回调函数返回结果并继续处理。

原文标题:嵌入式软件中回调函数同步与异步调用

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

审核编辑:汤梓红

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

    关注

    5082

    文章

    19111

    浏览量

    304876
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136714
  • 回调函数
    +关注

    关注

    0

    文章

    87

    浏览量

    11554

原文标题:嵌入式软件中回调函数同步与异步调用

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

收藏 人收藏

    评论

    相关推荐

    ARM嵌入式系统开发软件设计与优化

    ARM嵌入式系统开发软件设计与优化
    发表于 02-03 11:31

    嵌入式单片机开发软件CodeWarrior怎么下载?如何安装?

    嵌入式单片机开发软件CodeWarrior怎么下载?如何安装?
    发表于 10-09 09:04

    什么是嵌入式传统开发软件直接控制硬件

    什么是嵌入式传统开发软件直接控制硬件,比如51单片机开发,在开发软件的时候还要兼顾硬件知识,这样的开发模式主要有两点缺点.1:
    发表于 11-05 07:07

    嵌入式web服务器boa-0.94.13开发软件

    嵌入式web服务器boa-0.94.13开发软件
    发表于 03-11 09:48 26次下载

    Ubuntu嵌入式开发环境的建立

    嵌入式开发一般使用交叉开发环境,即上位机开发软件然后下载到在下位机运行。1.1. 上位机软件开发环境的构建我主要使用Ubuntu 8.04进行开发
    发表于 07-10 14:49 38次下载

    arm开发软件使用教程

    arm开发软件使用教程
    发表于 02-08 00:52 28次下载

    工业用SBCS嵌入式开发软件的选择技巧

    已经开发了许多开发工具和支持的硬件和软件产品,以帮助减少嵌入式开发风险,加快从小型消费设备到高性能工业控制和遥感设备等各种产品的上市时间。
    发表于 10-30 17:38 5次下载
    工业用SBCS<b class='flag-5'>嵌入式开发软件</b>的选择技巧

    嵌入式软件开发是什么该如何理解

    对于嵌入式开发软件来说,可以把嵌入式软件开发分成2个工作岗位。一个是应用开发,另一个是底层开发
    发表于 09-18 17:19 2.2w次阅读

    嵌入式系统仿真开发软件proteus8.9的安装教程资料免费下载

    本文档的主要内容详细介绍的是嵌入式系统仿真开发软件proteus8.9的安装教程资料免费下载。
    发表于 04-08 08:00 70次下载
    <b class='flag-5'>嵌入式</b>系统仿真<b class='flag-5'>开发软件</b>proteus8.9的安装教程资料免费下载

    嵌入式Linux内核驱动开发学习路线图

    嵌入式Linux内核驱动开发学习路线图(嵌入式开发软件工程师)-嵌入式Linux内核驱动开发学习路线图              
    发表于 07-30 13:51 12次下载
    <b class='flag-5'>嵌入式</b>Linux内核驱动<b class='flag-5'>开发</b>学习路线图

    嵌入式模拟题

    嵌入式模拟题(嵌入式开发软件)-嵌入式模拟题                   
    发表于 07-30 14:32 20次下载
    <b class='flag-5'>嵌入式</b>模拟题

    浅谈嵌入式开发

    ?①软件的移植性差。②软件开发人员必须懂硬件。③软件的功能性差,在这里指的是用户体验和功能差。4.嵌入式开发与传统开发的区别是什么呢?是否移
    发表于 10-20 14:50 2次下载
    浅谈<b class='flag-5'>嵌入式开发</b>

    嵌入式开发概述

    什么是嵌入式传统开发软件直接控制硬件,比如51单片机开发,在开发软件的时候还要兼顾硬件知识,这样的开发模式主要有两点缺点.1:
    发表于 11-02 19:21 15次下载
    <b class='flag-5'>嵌入式开发</b>概述

    嵌入式开发概述(20190325小结)

    一.嵌入式开发概述:嵌入式:在已有硬件上移植操作系统,解决软硬件耦合度高导致的问题。(打个比方:软件的实现是为了调用open()函数,那么嵌入式开发
    发表于 11-02 21:05 15次下载
    <b class='flag-5'>嵌入式开发</b>概述(20190325小结)

    ​​嵌入式函数的实现方法

    函数的命名规范没有固定的标准,但是根据通用惯例和编码规范,函数的命名应该能够反映
    发表于 03-04 14:49 713次阅读