嵌入式软件编程模式

2023-05-16

文章目录

    • 嵌入式软件编程模式
      • 基于周期调用的运行模式
      • 基于中断的前后台运行模式
      • 基于事件队列的运行模式
      • 带时间信息的事件队列运行模式
      • 周期任务运行框架

整理自:《AI嵌入式系统:算法优化与实现》
本章介绍嵌入式软件编程模式和通用软件优化方案。嵌入式软件编程模式关注的是底层支撑软件的架构,包括内存和CPU运行时间的分配方案,它服务于上层机器学习软件。
嵌入式软件编程模式和传统的计算机编程模式在概念上有所不同,一般计算机软件编程模式侧重软件开发过程中的代码复用和架构标准化技术,以模块化和层次化的形式构建软件对象,而这一章所讨论的嵌入式编程模式是为了满足多任务的实时响应,在有限内存和有限运算能力的嵌入式CPU上高效地完成运算任务。本章讨论的内容除了编程模式外,还包括通用的嵌入式软件优化方案,它们和嵌入式软件编程模式相结合,保障了机器学习算法在嵌入式平台上高效运行。这一章的内容除了可用于提高机器学习应用软件效率外,也能够应用于其他具有类似特性的嵌入式软件。

嵌入式软件编程模式

嵌人式系统和应用紧密结合,不同应用有不同的软件运行要求。下面将讨论几种常见的嵌入式系统编程模式,每种模式有对应的应用场合,可以单独使用或者混合使用。这里讨论的编程模式主要针对没有操作系统的嵌入式软件运行环境,在这种情况下,CPU的全部算力可以分配到和应用相关的计算,不需要额外执行IO资源状态、内存清理、调度等软件操作系统的管理任务,因此运行效率和内存使用效率会更高,但付出的代价是需要手动管理任务并发、IO状态检查、资源共享等,对开发者有更高的要求。

下面首先给出常见的嵌入式系统运行模式示意图,如图2-1所示。
图中系统的功能是从传感器获得外部数据,进行分析运算后输出控制命令,运行期间还需要接收用户输入。
这一架构模型反映了大多数嵌入式系统的运行模式。比如,在语音识别应用中,嵌入式系统周期性地从ADC读入语音的波形数据,经过处理后识别用户语音指令,并根据识别结果输出控制命令。对于运行机器人视频避障软件的嵌入式系统,车软件需要通过摄像头周期性地获得视频数据,分析视频内容,识别障碍和目的地并输出机器人移动控制命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c6cRmA1X-1664682027348)(C:\Users\10521\AppData\Roaming\Typora\typora-user-images\image-20221002104706287.png)]

上面描述的嵌人式系统运行模式涉及了多个需要并行执行的任务,每个任务有不同的运行周期性和处理优先级要求。表2-1给出了一个例子,其中嵌人式系统中需要同时运行4个任务,分别是传感器采样数据读取、数据计算及控制输出、用户输人命令检查、状态显示更新。它们的执行周期如表2-1所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x95suWYv-1664682027349)(C:\Users\10521\AppData\Roaming\Typora\typora-user-images\image-20221002104815876.png)]

这几个任务中,读入传感器数据的时间优先级最高,根据采样率所规定的时间间隔运行,不能错过数据;计算及控制输出同样有实时性要求,但它的执行频率低于数据采样;用户命令的检查和状态显示更新的优先级最低,只要满足人们对信息的感知速度即可。
上面几个任务的时间要求和运行频率要求也各不相同。设计时,需要根据优先级制定软件执行方案。当使用实时操作系统时,可以使用比如“单调速率调度算法”(Rate Monotonic Scheduling,RMS)等方案实现以上多任务并发执行,如图2-2示。我们后面讨论的几种编程模式能够不依赖于操作系统实现,允许开发者根据应用特点实现更灵活的定制化多任务执行模式。

在这里插入图片描述

基于周期调用的运行模式

周期运行模式的一种实现方式如代码清单2-1所示,该代码实现了表2-1给出的嵌入式系统的几个任务周期执行。其中while循环内部的几个任务按执行顺序排列,并且每轮while循环根据周期要求对各个任务执行1次或者多次。

在这里插入图片描述

whi1e循环内的代码对应所需要的任务的一个运行周期,如图2-2所示。但在实际情况中,由于每个模块运行时间存在差异,因此往往得到疏密不均匀的“周期”运行效果,如图2-3所示。这使得系统对传感器输入数据的“采样率”不再固定,并且对用户的输入响应间隔也时快时慢,系统运行缺少“确定性”。改进措施如下:

1)将运行时间过长的任务进行状态分割。

2)将采样固定在时间格点上运行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BVlmeQo4-1664682027351)(C:\Users\10521\AppData\Roaming\Typora\typora-user-images\image-20221002105212087.png)]

下面详细介绍这两种改进方案。
运行时间长的任务拆分

任务拆分是将一个长时间任务分成几个阶段实现,每次循环执行时仅完成其中一个阶段的任务。例如,假设“状态显示更新”任务由于具有LCD特性而运行很慢,我们将其分成几部分,比如假设原始的操作可以分成三部分,如代码清单2-2所示。
在这里插入图片描述

在这里插入图片描述

该函数内部有static类型状态变量state,它的取值在函数一次调用完成到下一次调用期间是保持不变的。我们第一次调用该函数时,由于state=STAGEO,因此执行“更新测量数据曲线图”;第二次调用时,由于state=STAGE1,因此执行“更新数据计算结果”;第三次调用时,由于state=STAGE2,因此执行“更新用户输人内容”;三次调用后,state回到STAGEO,下次调用再次执行“更新测量数据曲线图”,并重复上面的过程,如图2-4所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j3UDSSU7-1664682027352)(C:\Users\10521\AppData\Roaming\Typora\typora-user-images\image-20221002105517569.png)]

通过上面的例子可以看到,我们能够将需要一次运行时间长的函数拆分成多个阶段实现,使得周期执行循环中,执行该函数的时间降低到各个阶段的执行时间。该模式适用于可以分解为多个执行阶段的函数,并且各个执行阶段相对独立,相邻执行阶段的运行时间可以不连续。

时间格点采样
对于传感器数据读取,当相邻两次调用读取数据的函数的间隔小于采样间隔时,通过代码清单2-4给出的伪代码实现采样时间调整,以确保每次数据读取在特定的时间格点上执行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hx44jg7p-1664682027352)(C:\Users\10521\AppData\Roaming\Typora\typora-user-images\image-20221002105623571.png)]

确定当前时间是否在采样时间格点上,如果不在,则延退等待固定时间。
值得注意的是,在很多情况下,采样时间间隔可以通过外部数据采样硬件确定,用户程序通过FIFO读取数据,当数据尚未到达时,FIFO为空,这使得我们可以基于FIFO是否为空来判断时间格点上的数据采样是否完成,如代码清单2-5所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KMBDs9g3-1664682027352)(C:\Users\10521\AppData\Roaming\Typora\typora-user-images\image-20221002105801738.png)]

上述模式只有当两次执行传感器采样数据读取”的间隔小于采样间隔时才有效,女如果大于采样间隔,则会导致采样点“遗漏如图2-5所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s9rHijdO-1664682027352)(C:\Users\10521\AppData\Roaming\Typora\typora-user-images\image-20221002105834697.png)]

图2-5中虚线是采样时间格点,在中间由于“计算机控制输出”任务运行时间过长,出现过一次采样缺失现象。下面将讨论另外几种编程模式以避免这一问题。

基于中断的前后台运行模式

前面基于循环调用的编程模式难以确保各个任务的等时间周期运行,并且把实时性要求高的任务和实时性要求低的任务混在一起,难以同时兼顾不同任务实时性要求的差异。为了能够确保特定任务的实时性,我们通常使用基于中断的前后台编程模式,如图2-6所示。
其中,时钟中断服务程序负责从外部传感器得到数据输入,由于时钟中断信号具有严格的周期性,因此可以确保数据间隔的稳定,并且由于中断服务程序随时能够打断前台的数据处理、用户输入、显示输出程序执行,因此不受它们的运行速度影响。
使用前后台编程模式时,需要考虑中断服务程序的运行效率,对于前面介绍的固定时间间隔的数据采样任务,要求中断服务程序能够在采样间隔内完成,因此需要尽可能地提高运行效率,在中断服务程序中只保留必不可少的代码,尽可能将那些对实时性要求不高的数据操作放到前台应用程序中执行。比如来自传感器的数据经过了压缩和纠错编码,在中断服务程序运行期间执行数据解压缩和纠错可能导致运行时间过长,进而导致错过下一个采样的时间点,为避免这一现象出现,可以将这些运行时间长但又没有必要在中断服务程序内完成的任务转移到“数据计算及控制输出”函数中执行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fPtHyGBA-1664682027353)(C:\Users\10521\AppData\Roaming\Typora\typora-user-images\image-20221002110256358.png)]

使用前后台编程模式的一个极端示例是将所有操作移入中断服务程序。硬件提供不同重复间隔和优先级的时钟中断,这样主程序会很简单,只有一个无限循环,而所有的工作由中断服务程序完成,如图2-7所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rekpNHyC-1664682027353)(C:\Users\10521\AppData\Roaming\Typora\typora-user-images\image-20221002110335037.png)]

基于中断服务程序实现所有操作的方案中需要编程者处理数据访问冲突问题,比如传感器数据读取中断服务程序有可能打断“数据计算及控制输出”中断服务程序,“改”还未处理完的数据,这就需要可靠的数据交换机制,以确保不同的代码能够安全地访问共享数据交换空间。比如通过图2-8所示的缓冲器交换数据。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v4s8TcdM-1664682027353)(C:\Users\10521\AppData\Roaming\Typora\typora-user-images\image-20221002110441471.png)]

“写指针”,而“数据计算及控制输出”程序负责从环形缓冲器读取数据,每次读完数据就修改缓冲器的“读指针”,避免对相同的共享数据区同时读写。

基于事件队列的运行模式

这一运行模式是基于中断的前后台运行模式的进一步改进。中断服务程序可以是传感器数据读取程序,也可以是用户指令输入检测程序。后台程序由一系列中断服务程序构成,负责读取数据供前台程序处理,还负责根据输入内容生成“事件”,将待处理事件加上数据序则不断检查事件队列,找到其中待处理的事件数据包,提取并执行,如图2-9所示。
事件队列可以以链表形式或者环形缓冲器形式实现,由于它是由中断服务程序和前台处理程序共享的,因此在编程时需要避免访问冲突。
基于事件列表运行模式的一种扩充是在系统中构建多个事件队列,每个事件队列具有对应的优先级,前台程序根据事件队列的优先级优先处理高优先级的事件,这样能够使对实时性要求高的事件(比如数据计算)能够及时得到处理,如图2-10所示。
这一编程模式在实际应用中要求程序员考虑“低优先级事件积压”问题,即高优先级事件不断出现,导致低优先级事件长时间得不到处理、处理延退过长的问题。需要程序员采取特定措施防止低优先级事件长时间得不到处理,一个解决方案是规定一个低优先级事件队列长度门限,当积压的低优先级事件数量超过门限时,临时提升该队列的处理优先级,避免低优先级事件队列内事件被过度积压。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jsvdc1TQ-1664682027353)(C:\Users\10521\AppData\Roaming\Typora\typora-user-images\image-20221002110636135.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jTEoOFos-1664682027354)(C:\Users\10521\AppData\Roaming\Typora\typora-user-images\image-20221002110703040.png)]

带时间信息的事件队列运行模式

对于需要在特定时间执行指定动作的应用,比如有特定时序要求的硬件设备控制和网络通信协议等,可以使用带时间信息的事件队列的设计模式(见图2-11)。这一设计模式和带优先级的事件队列运行模式相似,差别是这里的每个事件队列的优先级被执行时间所取代,系统根据当前时间检查事件队列,对于时间匹配的事件队列,执行队列中的所有事件,执行完删除该队列。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ACvfTfVB-1664682027354)(C:\Users\10521\AppData\Roaming\Typora\typora-user-images\image-20221002111104158.png)]

事件队列可以由当前正在执行的事件生成,也可以由中断服务程序生成。代码清单2-6中显示了这一模式的运行过程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jHFzA5zK-1664682027354)(C:\Users\10521\AppData\Roaming\Typora\typora-user-images\image-20221002111132477.png)]

周期任务运行框架

可以参考这两篇文章:

周期任务框架在裸机、RTOS上的实现

软件定时器管理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式软件编程模式 的相关文章

  • jupyter notebook打开其他盘

    转载于 xff1a https blog csdn net qq 41238579 article details 101016253 1 juter notebook 默认打开系统盘 2 更换显示盘 1 xff09 打开cmd 2 xff
  • 网监后台管理系统设计思路

    本次做的是网监系统saas服务平台的后台管理系统 xff0c 不涉及复杂功能逻辑 就是从菜单 模板 系 统 组织架构 角色 用户的设计思路 产品需求 xff1a 在各个省市网监系统的数量不断增长 xff0c 且系统逻辑和功能模块大致相同 x
  • 基于模型的系统工程(MBSE)

    文章目录 了解MBSE xff0c 这一篇文章就够了MBSE是什么 有什么用 怎么学习 xff1f 1 MBSE是什么 xff1f 2 MBSE有什么用 xff1f 3 MBSE的方法有哪些 xff1f 4 MBSE怎么学习 xff1f 要
  • 基于模型设计和机载软件

    采用基于模型设计应对机载软件设计中的挑战 已剪辑自 https www jianshu com p a8fb02ce366d 采用基于模型设计应对机载软件设计中的挑战 Model Based Design for Airborne Soft
  • MBSE与MBD的融合

    已剪辑自 https www jianshu com p 9efae90ca0f7 基于模型的设计 xff0c 是美国迈斯沃克公司 xff08 MathWorks xff0c MATLAB软件的开发商 xff09 提出并推广的复杂系统设计方
  • 基于模型的系统工程(MBSE)与设计(MBD)的关系思考

    已剪辑自 http www clii com cn lhrh hyxx 201905 t20190522 3934609 html 导读 xff1a 如何将关于功能知识表达的建议与任何系统工程建模语言的任何部分结合起来 xff0c 确定地
  • 从MBD到MBE的战略转型路径

    已剪辑自 https zhuanlan zhihu com p 58927567 导读 xff1a 企业的不断成功 xff0c 源于在每个关键机遇期做出正确的抉择 对于在国民经济中发挥重要作用的中国制造业企业来说 xff0c 如何面向未来
  • SysML教程

    已剪辑自 https www jianshu com p 6ba96913abcc SysML是一种支持复杂系统分析 规范 设计 验证和确认的通用图形化建模语言 这些系统可能包括硬件设备 软件数据 人员 规程 设施 xff0c 以及其他人造
  • 程序运行原理:程序是如何运行又是如何崩溃的?

    已剪辑自 https time geekbang org column article 166581 软件的核心载体是程序代码 xff0c 软件开发的主要工作产出也是代码 xff0c 但是代码被存储在磁盘上本身没有任何价值 xff0c 软件
  • 分布式系统

    简介 在一个分布式系统中 xff0c 一组独立的计算机展现给用户的是一个统一的整体 xff0c 就好像是一个系统似的 系统拥有多种通用的物理和逻辑资源 xff0c 可以动态的分配任务 xff0c 分散的物理和逻辑资源通过计算机网络实现信息交
  • #如何写好技术文档——来自Google十多年的文档经验

    文章目录 文档的重要性为什么大多数人都不喜欢写文档 xff1f 如何产出高质量文档像管理代码一样管理文档明确你的读者是谁清晰的分类参考文档设计文档引导类文档概念性文档Landing pages 落地页 文档Review 写文档的哲学5W法则
  • 如何写好技术文档?

    文章目录 01为什么需要写文档 xff1f 02写文档的重要性03像管理代码一样管理文档04文档类型05文档Review06文档写作的哲学07结论 已剪辑自 https cloud tencent com developer article
  • 数据库系统原理1

    第一章 数据库管理技术发展的不同阶段形成不同的特点 数据描述经历了三个阶段对应于三个数据模型 第二章 数据库系统的生命周期 xff0c 书中可能和我们学习软工的时候有些出入 xff0c 其实就是不同时间有不同的理解 xff0c 横看成岭侧成
  • ssh 登录时常出现的几种错误以及解决方法(Linux)

    ssh 登录时常出现的几种错误以及解决方法 xff08 Linux xff09 参考网址 xff1a https blog csdn net GX 1 11 real article details 80423409 前言 ssh是Linu
  • 程序员既要写好代码,又要写好文档

    转载于 xff1a https developer aliyun com article 196898 作为一个长期混迹于CSDN社区的人 xff0c 我对很多拥有高访问量的博主钦佩不已 xff0c 特别是在参加了CSDN在举办 2014
  • 一步一步教你如何写开发文档

    已剪辑自 https icocos github io 2017 01 02 E4 B8 80 E6 AD A5 E4 B8 80 E6 AD A5 E6 95 99 E4 BD A0 E5 A6 82 E4 BD 95 E5 86 99
  • 如何写好项目文档

    已剪辑自 https blog csdn net houzhizhen article details 105622282 引子 有太多的程序员 xff08 包括很多资深的程序员 xff09 不会写文档有太多的项目没有 xff08 完整的
  • 怎样才能写好项目文档?

    已剪辑自 http learn lianglianglee com E4 B8 93 E6 A0 8F E8 BD AF E4 BB B6 E5 B7 A5 E7 A8 8B E4 B9 8B E7 BE 8E 16 20 E6 80 8E
  • 技术文档写作基础-写作新手必看

    文章目录 1 搞清楚主谓宾2 不滥用代词 过渡词和标点符号2 1 不滥用代词和过渡词2 2 不滥用标点符号 3 多用强势动词 xff0c 少用形容词和副词3 1 强势动词和主动语句3 2 少用形容词和副词 4 正确使用术语5 正确使用段落5
  • 软件工程及其文档汇总

    文章目录 软件文档作用和分类作用分类 管理和维护软件工程的文档有哪些 xff1f 软件工程各类开发文档的作用软件工程各文档模板系统定义文档需求规格说明书概要设计说明书用例文档详细设计说明书测试计划测试分析报告 xff1a 软件文档 软件文档

随机推荐

  • 中断和异常,C/C++语言异常,实时操作系统对中断和异常的处理

    文章目录 一 中断和异常是什么1 中断和异常的定义2 中断处理的过程3 常见中断和异常 二 C C 43 43 软件异常的常见原因分析与总结1 概述2 引发软件异常的常见原因2 1 变量未初始化2 2 死循环2 3 内存越界2 4 内存泄漏
  • 编程中什么情况下需要加 volatile?

    文章目录 一 CPU访问变量 1 给变量赋值 2 读变量的值 二 编译器优化 1 上面程序执行过程有什么缺点 xff1f 2 为什么要优化 xff1f 三 volatile到底有什么用 xff1f 用在什么场合 xff1f 1 在执行b 6
  • ImageJ实用教程汇总

    https zhuanlan zhihu com p 60999196
  • 第一性原理详解

    文章目录 百度百科其他解释补充解释 智库百科什么是第一性原理如何运用第一性原理第一性原理思考举例 什么是第一性原理 xff0c 它有什么重要意义 xff1f 详解马斯克的 第一性原理 01什么是 第一性原理 思维 xff1f 其实是一种演绎
  • Win8.1电脑声音可以外放但是插入耳机没有声音

    今天早上正准备学习英语 xff0c 发现耳机插入电脑没有声音 xff0c 于是开始找百度 xff0c 一步一步剥茧抽丝去查找问题来源 问题 xff1a 点击喇叭出现如下图片 xff1a 平常只有右半个图现在却有两个图标了 步骤 xff1a
  • 如何写好技术文档——来自Google十多年的文档经验

    已剪辑自 https zhuanlan zhihu com p 393553478 本文大部分内容翻译总结自 Software Engineering at Google 第10章节 Documentation 另外 xff0c 该书电子版
  • 如何编写好的软件设计文档

    文章目录 为什么要写设计文档 设计文档中应该包含哪些内容 标题和人员 概述背景 目标和非目标 里程碑 现状 建议方案 替代方案 可测试性 监控和报警 跨团队的影响力开放性问题详细的范围和时间表如何编写尽可能简单尽可能使用图和图表包含数字试着
  • 软件开发总结

    文章目录 结构化方法Jackson方法原型方法面向对象方法敏捷方法水晶法并列争求法自适应软件开发 xff08 ASD 软件设计的演变过程序言结构化程序设计面向对象程序设计设计模式设计原则领域驱动设计DCI架构模式领域专用语言微服务架构模式小
  • 软件开发中会使用到的图

    文章目录 软件开发中会用到的图一 背景二 图为了解决什么问题三 不同流程中适合运用的图四 实际的运用五 结语 软件工程中的各种图软件工程用的15种图数据关系流图怎么画 xff1f 这款软件教你轻松绘制关系流图数据关系流图的常见用途数据关系流
  • 软件耦合的分类及解决方法

    文章目录 什么是耦合 解耦高内聚与低耦合耦合内容耦合公共耦合外部耦合控制耦合标 xff08 印 xff09 记耦合数据耦合非直接耦合 内聚 什么是解耦公共耦合 c语言例子 小小的公共库 xff0c 大大的耦合 xff0c 你痛过吗 xff1
  • 机器学习在分子模拟中的应用

    文章目录 一 背景二 分子动力学模拟介绍简史基本步骤应用发展方向 三 AlphaFold 前言 Alphafold2做了什么改进 Alphafold2会议具体细节 xff1a Alphafold为什么强 xff1f 学术问题 xff1a 四
  • 一个重要的问题:怎么寻找自己的终身事业呢?

    已剪辑自 https mp weixin qq com s OJX2FZ TtdPxWg1V6gr6gA 前文写过我们每一个职场人都应该寻找自己的终身事业 xff0c 而不是机械地打工赚钱维持生活生存的薪资 一些读者看完后跑过来问 xff1
  • 腾讯技术总监的转行感悟

    已剪辑自 https mp weixin qq com s 3bJVRGf91bThnZo74g3Sw 今天分享一个新东方在线前同事写的文章 xff0c 说来也巧他的文章写的人恰好是我下属老杨 老杨也代表了技术人到中年的一种转型思路 xff
  • 30多岁的每一步都很重要

    人生有不同阶段 xff0c 每个阶段都挺重要 xff0c 但最重要的是30岁 40岁这个阶段 30岁之前我们很难找到终身奋斗目标 很难构建多元化财务收入 很难成为行业专家 我们甚至还是懵懵懂懂的状态 xff0c 沉迷于某个并不重要的人 并不
  • 重要的是改变命运,而非升职加薪

    已剪辑自 https mp weixin qq com s biz 61 MzA3MzA5MTU4NA 61 61 amp mid 61 2247505468 amp idx 61 1 amp sn 61 1373f053179462101
  • SQL Server 2012 导出数据及分离MDF、LDF

    最近在设计数据库时看到自己设计的数据库和师哥师姐给我们的不一样 xff0c 于是就查了一下把数据库导出写了下来 分离数据库步骤 这是师哥师姐给我们的数据库格式 xff0c 如下 xff1a 那么如何生成MDF和LDF格式的数据库呢 xff1
  • 怎么找到贵人?

    已剪辑自 https mp weixin qq com s biz 61 MzA3MzA5MTU4NA 61 61 amp mid 61 2247506375 amp idx 61 1 amp sn 61 6008cc68a5967d3db
  • 14种主流的RTOS 单片机操作系统~来学!

    已剪辑自 https mp weixin qq com s YQGaBlluBWFbk01K5qCu A 单片机编程时 xff0c 我们都知道有两种基本操作 xff1a 裸奔和操作系统 所谓裸奔 xff0c 就是一个大循环往复执行 今天要讲
  • 读《工作多年后,嵌入式工程师的区别在哪儿?》有感

    读 工作多年后 xff0c 嵌入式工程师的区别在哪儿 xff1f 有感 已剪辑自 https mp weixin qq com s N32aKmTSmAAQ7KzLveKZRg 面试了很多人之后 xff0c 我开始思考 xff0c 一个工作
  • 嵌入式软件编程模式

    文章目录 嵌入式软件编程模式基于周期调用的运行模式基于中断的前后台运行模式基于事件队列的运行模式带时间信息的事件队列运行模式周期任务运行框架 整理自 xff1a AI嵌入式系统 xff1a 算法优化与实现 本章介绍嵌入式软件编程模式和通用软