【备战软考(嵌入式系统设计师)】09 - 嵌入式软件设计基础

嵌入式软件开发原理

嵌入式软件开发和我们传统的软件开发不一样。

就拿我们的QT开发,我们敲完代码之后直接编译运行exe看看效果,不行就改改再次编译运行,如果可以就打包exe文件相关的配置文件对吧,一套下来行云流水一气呵成。

但是我们编写STM32的运行程序的时候就会稍微麻烦一些,我们先敲代码,编译完之后拿着hex文件烧录进板子里,不行就改改再编译,再拿着新的hex文件烧录(Keil中可以进行仿真,但我不太会用,平时也不用,但是我们得知道是可以仿真调试的)。

因此在嵌入式软件开发中,我们一般是使用宿主机和目标机的模式进行系统开发,并且借助开发工具进行目标开发。

宿主机是PC机中构建的开发环境,目标机是嵌入式系统的实际运行环境或者是能够代替实际运行环境的仿真系统。

嵌入式软件开发方式一般是在宿主机上完成编码和交叉编译工作,与目标机建立连接之后将程序下载到目标机中进行交叉调试和运行。

交叉编译就是在一个平台生成在另一个平台上执行的代码。是因为我们的PC拥有非常丰富的系统资源,而嵌入式系统中的系统资源不足以支持我们进行直接的编译,因此我们常用的是交叉编译的方法。

在我们编译的时候,编译过程是这样的:词法分析,语法分析,语义分析,中间代码生成和代码优化

最后还有一点要说的就是gdb,有时候软考刷题的时候会考到这个。

gdb是一个程序调试工具,主要功能有:执行程序,显示数据,断点,变量检查赋值,单步执行,函数调用等。

根据上面说的gdb的功能,我们知道应该选择D,gdb无法帮我们检测代码中的语法错误。

C语言编程基础

C语言博大精深,我这说不明白,我就挑一点软考选择题中考的概率比较大的部分简单说一说。

C语言程序从main函数开始,以main函数结束结尾。

结构体(struct)占用的大小是所有成员大小的总和,联合体(union)的大小是所有成员中最大的那个的大小

宏定义是直接替换掉原文的。我们来看看下面这段代码。

#define f1(x)    x*x
#define f2(2)    (x*x)int i = 100 / f1(10) ;
int j = 100 / f2(10) ;

想一想 i 和 j 各是什么值。

i 是100,而 j 是1。

因为宏定义是直接替换原文的,因此替换完之后定义 i 和 j 的代码是变成下面这样的。

int i = 100 / 10*10 ;
int j = 100 / (10*10) ;

在宏定义中加个括号,结果都会不一样,并且因为宏定义是直接替换原文的,因此一般宏定义中是不加分号的。

指针的大小就是当前机器的字长,比如说用的是8位单片机,那么不管这个指针指向什么类型的变量,它的大小都是8bit。如果是32位则是32bit。

使用指针来做函数的参数,是可以在函数内修改传入的指针指向的数据的值的。

数据结构与算法

数据结构与算法同样博大精深,无法速成,建议是去力扣刷几道题,自然而然就明白了。推荐刷一下LeetCode75这个专题的题目,在公众号之前的文章中有文章讲解,我b站同名账号有相应的算法题讲解视频。

这边就稍微提一提软考高频考点。

线性表

线性表按照存储方式可以分为顺序表和链表。

顺序表需要一段连续的内存空间来存放,因此表中相邻的元素在物理地址上也是相邻的,C语言中的数组就是顺序表,有时候会让我们计算数组中某元素的物理地址,我们就根据这个原理来计算的,不过计算的时候要看清楚数组存放是按行排的还是按列排的。

链表就比较随意了,因为它们是靠指针来连接的,所以在物理空间中不必相邻。

从上面二者结构上的差异我们也可以看得出,顺序表中要插入、删除数据的比较麻烦的,需要移动相邻的元素,而线性表只需要修改元素中的前序指针和后序指针即可。

但是在查找数据上看,顺序表显然更快,因为它的元素都是连在一起的,而链表的元素可以分布得很零散,不好找。

队列和栈

队列就是先进先出。

栈就是先进后出,也就是越后面进的,出的越早。

树只有两种,一种是二叉树,另一种不是二叉树。

每个节点最多只有两个子树的就是二叉树。

常见的树都是二叉树,不过二叉树也分为很多种。

一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。并且满二叉树的叶子节点数是2^(k-1)。

若设二叉树的深度为k,除第k层外,其它各层 (1~k-1) 的结点数都达到最大个数(即1~k-1层为一个满二叉树),第k层所有的结点都连续集中在最左边,这就是完全二叉树

平衡二叉树要么是一棵空树,要么保证左右子树的高度之差不大于 1,并且子树也必须是一棵平衡二叉树。


图也分为两种,有向图和无向图,有箭头指向的就是有向图,没有箭头的就是无向图。

图中每个节点都有一些属性,比如说度,度又分为出度和入度,每有一个箭头指向该节点,那么这个节点的入度+1,每有一个箭头从该节点指出,那么该节点的出度+1。

但是无向图没有箭头,也就没有出度入度,取而代之的就是单纯的度,每有一根线连着节点,那么该节点的度+1。

算法复杂度

算法复杂度分为时间复杂度和空间复杂度。

时间复杂度是指执行算法所需的计算工作量,空间复杂度是指执行算法所需要的内存空间。

如何计算这个东西,我也说不太明白,就是凭感觉选出来的(你们不要学我),我们让文心一言来解答一下。

时间复杂度

时间复杂度通常用大O表示法(Big O notation)来描述。大O表示法关注的是算法执行时间随输入规模增长的上限。

要计算时间复杂度,你需要考虑算法中各个基本操作的执行次数,并找出这些次数与输入规模(如数组的大小、列表的长度等)之间的关系。以下是一些常见的时间复杂度示例:

  • O(1):算法的执行时间不随输入规模的增长而增长,即常量时间复杂度。
  • O(n):算法的执行时间与输入规模成线性关系。
  • O(n^2):算法的执行时间与输入规模的平方成正比。
  • O(log n):算法的执行时间与输入规模的对数成正比。
  • O(n log n):算法的执行时间同时受到输入规模的线性对数影响。

为了计算时间复杂度,你需要:

  1. 找出算法中的基本操作(如赋值、比较、循环等)。
  2. 计算每个基本操作在算法执行过程中被执行的次数。
  3. 用输入规模(如n)来表示这些次数。
  4. 找出次数随输入规模增长的主要项(通常忽略常数系数和低阶项)。
  5. 用大O表示法来表示这个主要项。

空间复杂度

空间复杂度同样可以用大O表示法来描述。它关注的是算法执行过程中所需额外空间随输入规模增长的趋势。

要计算空间复杂度,你需要考虑算法在执行过程中除了输入数据外还需要使用多少额外的存储空间。这包括变量、数组、链表、栈、队列等数据结构所占用的空间。以下是一些常见的空间复杂度示例:

  • O(1):算法所需的额外空间不随输入规模的增长而增长,即常量空间复杂度。
  • O(n):算法所需的额外空间与输入规模成线性关系。

为了计算空间复杂度,你需要:

  1. 找出算法执行过程中所使用的所有额外数据结构。
  2. 计算每个数据结构所需的存储空间。
  3. 用输入规模(如n)来表示这些存储空间。
  4. 找出存储空间随输入规模增长的主要项(同样忽略常数系数和低阶项)。
  5. 用大O表示法来表示这个主要项。

注意:在计算空间复杂度时,通常只考虑算法在执行过程中所需的额外空间,而不包括输入数据本身所占用的空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3017633.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Kansformer?变形金刚来自过去的新敌人

​1.前言 多层感知器(MLPs),也被称为全连接前馈神经网络,是当今深度学习模型的基础组成部分。 MLPs在机器学习中扮演着至关重要的角色,因为它们是用于近似非线性函数的默认模型,这得益于通用近似定理所保证的表达能力。然而,MLPs真的是我们能构建的最佳非线性回归器吗?尽管ML…

免费在线录屏、无需注册、免费可用、无限制

免费在线工具 https://orcc.online/ 在线录屏 https://orcc.online/recorder pdf在线免费转word文档 https://orcc.online/pdf 时间戳转换 https://orcc.online/timestamp Base64 编码解码 https://orcc.online/base64 URL 编码解码 https://orcc.online/url Hash(MD5/SHA…

5.7 线程

进程:解耦稳定,内容之间是不相关的,通信不便利,理论上进程的软硬件的切换时间以及创建开销非常大。--------》资源共享线程实现 线程的问题:本质就是不解耦,一个出问题别的就很有可能出问题,同…

关于获取邮件授权码

以网易邮箱为例: 第一步:登录之后点击设置 第二步:点击POP3/SMTP/IMAP 第三步:开启SMTP服务 开启哪个都可以 第四步: 扫描二维码开启服务 第五步: 使用手机扫面二维码发送短信 第六步: 得到授权码 将授权码写入配置文件

04-28 周日 FastAPI Post请求同时传递文件和普通参数

04-28 周日 FastAPI Post请求同时传递文件和普通参数 时间版本修改人描述04-28 周日V0.1宋全恒新建文档2024年5月6日14:20:05V1.0宋全恒完成文档的传递 简介 由于在重构FastBuild的时候,为了支持TLS是否启用,在接口中需要同时传递文件参数和其他参数&am…

matlab 基于拉依达检验法(3σ准则) 实现多类别多参数的批量异常样本检验 V2.0

简介 拉依达检验法(3σ准则)是一种统计学方法,用于检测数据中的异常值。这种方法基于正态分布的特性来确定数据点是否可能是异常值。以下是关于拉依达检验法(3σ准则)的详细介绍: 基本原理: 拉…

代码随想录第四十六天|单词拆分

题目链接:. - 力扣(LeetCode)

2.4V转3.8V/3.9V供电升压方案:为水表提供稳定电力

随着科技的不断发展,水表等智能设备在我们的生活中扮演着越来越重要的角色。为了让水表得以正常工作,稳定的电力供应是至关重要的。在这篇文章中,我们将探讨一种2.4V转3.8V/3.9V供电方案,以确保为水表提供稳定的电力。 为了实现2…

每日两题 / 138. 随机链表的复制 148. 排序链表(LeetCode热题100)

138. 随机链表的复制 - 力扣(LeetCode) 用哈希表记录原链表中的节点是否被复制过 遍历原链表并通过哈希表维护新链表 /* // Definition for a Node. class Node { public:int val;Node* next;Node* random;Node(int _val) {val _val;next NULL;rand…

STM32F407VET6 学习笔记1:GPIO引脚认识分类与开发板原理图

今日学习STM32F407VET6 ,首先从基本原理图、引脚方面开始做个初步理解并整理: 这里使用的学习开发板是在嘉立创购买的 立创梁山派天空星,芯片是 STM32F407VET6 主要对这个芯片的引脚做一些归纳认识、对开发学习板原理图设计进行认识理解:最…

23 JavaScript学习:验证API

JavaScript验证API 举例&#xff1a; <input id"id1" type"number" min"100" max"300" required> <button onclick"myFunction()">验证</button><p id"demo"></p><script>f…

HarmonyOS实战开发-如何实现Web组件中网页长截图。

介绍 本案例实现了Web组件中网页长截图的方案。支持截图后展示大小浮窗预览、保存图片到相册、手势左滑关闭等功能。 效果图预览 实现思路 本解决方案通过循环滚动Web组件&#xff0c;每次滚动截取当前状态后拼接到离屏画布&#xff0c;最后一次性转为PixelMap图片并显示在全…

Arduino PlatformIO避坑记

实在受不了Arduino IDE上古时期的界面风格&#xff0c;最要命的是编译速度慢到极点&#xff0c;好在有PlatformIO。VS搭配PlatformIO&#xff0c;有微软加持&#xff0c;界面自然是妥妥的了&#xff0c;编译速度提升也肉眼可见。 至于PlatformIO的安装过程&#xff0c;网上教程…

Day 24 数据库管理及数据类型

数据库管理及数据类型 一&#xff1a;数据类型 1.数值类型 整数类型 ​ 整数类型&#xff1a;TINYINT SMALLINT MEDIUMINT INT BIGINT ​ 作用&#xff1a;用于存储用户的年龄、游戏的Level、经验值等 浮点数类型 ​ 浮点数类型&#xff1a;FLOAT DOUBLE ​ 作用&#xf…

超疏水TiO₂纳米纤维网膜的良好性能

超疏水TiO₂纳米纤维网膜是一种具有特殊性能的材料&#xff0c;它结合了TiO₂的光催化性能和超疏水表面的自清洁、防腐、防污等特性。这种材料在防水、自清洁、油水分离等领域具有广阔的应用前景。 制备超疏水TiO₂纳米纤维网膜的过程中&#xff0c;通过精确控制纺丝溶液的成分…

vue3专栏项目 -- 项目介绍以及准备工作

这是vue3TS的项目&#xff0c;是一个类似知乎的网站&#xff0c;可以展示专栏和文章的详情&#xff0c;可以登录、注册用户&#xff0c;可以创建、删除、修改文章&#xff0c;可以上传图片等等。 这个项目全部采用Composition API 编写&#xff0c;并且使用了TypeScript&#…

PyQt5中重要的概念:信号与槽

PyQt中信号与槽概念定义如下&#xff08;网络上引用的&#xff09;&#xff1a; 信号&#xff08;signal&#xff09;和槽&#xff08;slot&#xff09;是Qt的核心机制&#xff0c;也是在PyQt编程中对象之间进行通信的机制。在创建事件循环之后&#xff0c;通过建立信号和槽的…

3W 1.5KVDC 3KVDC 隔离宽范围输入,单、双输出 DC/DC 电源模块——TP2L-3W 系列

TP2L-3W系列是一款高性能、超小型的电源模块&#xff0c;宽范围2:1,4:1输入&#xff0c;输出有稳压和连续短路保护功能&#xff0c;隔离电压为1.5KVDC、3KVDC工作温度范围为–40℃到85℃。特别适合对输出电压的精度有严格要求的地方&#xff0c;外部遥控功能对您的设计又多一项…

AIGC绘画辅助网站

Midjourney风格样式 Midjourney Style Classifier | Andrei Kovalevs Midlibrary

Python-VBA函数之旅-property函数

目录 一、property函数的常见应用场景 二、property函数使用注意事项 三、如何用好property函数&#xff1f; 1、property函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、prop…