软考中级嵌入式——第六章 嵌入式软件程序设计
本文摘要:嵌入式系统开发是一个软硬件协同设计的过程,涉及硬件设计、驱动开发、操作系统移植和应用程序开发等步骤。开发特点包括使用交叉编译工具、仿真调试和资源受限环境。程序设计语言方面,介绍了C/C++等语言的数据类型、控制结构和存储管理机制,重点阐述了C语言的预处理指令、变量作用域和函数调用过程。面向对象编程部分讲解了封装、继承和多态三大特性。全文系统性地介绍了嵌入式开发的关键技术和方法论。
1.嵌入式系统开发与设计
1.1嵌入式应用开发概述
1.1.1嵌入式应用开发的过程:
-
一个嵌入式应用项目的开发过程是一个硬件设计和软件设计的综合过程,一般而言要经历以下几个步骤:
-
硬件的设计与实现
-
设备驱动软件的设计与实现
-
嵌入式操作系统的选择、移植,以及API接口函数的设计
-
支撑软件的设计与调试
-
应用程序的设计与调试
-
系统联调,样机交付
-
1.1.2应用程序的生成与加载:

1.1.3嵌入式应用开发的特点:
-
需要交叉编译工具
-
通过仿真手段进行调试
-
开发板是中间目标机
-
可利用的资源有限
-
需要与硬件打交道
1.1.4嵌入式软件开发的挑战:
-
软硬件协同设计
-
嵌入式操作系统
-
代码优化
-
有限的I/O功能
1.2嵌入式软件开发环境
-
嵌入式系统开发最大特点:软硬件综合开发。
-
嵌入式产品是软硬件的结合体
-
软件针对硬件开发、固化,不能进行任意修改
-
-
嵌入式软件开发模式通常是包括三种:
-
本机开发
-
交叉开发
-
模拟开发
-
1.3嵌入式软件开发概述
1.3.1嵌入式软件开发流程
-
嵌入式平台选型:软件、硬件
-
软件设计
-
特性设计
-
编码
-
测试
-
下载和运行
2.嵌入式程序设计
2.1程序设计语言
2.1.1各种程序语言的特点
-
Fortran语言(科学计算,执行效率高)
-
Pascal语言(为教学而开发的,表达能力强,Delphi)
-
C语言(指针操作能力强,高效)
-
Lisp语言(函数式程序语言,符号处理,人工智能)
-
C++语言(面向对象,高效)
-
Java语言(面向对象,中间代码,跨平台)
-
C#语言(面向对象,中间代码,.Net)
-
Prolog语言(逻辑推理,简洁性,表达能力,数据库和专家系统)
-
Python语言(一种脚本语言)
2.1.2程序语言的数据成分
-
数据是程序操作的对象,具有以下属性:
-
数据名称:由用户通过标识符命名
-
数据类型:说明数据占用内存大小和存放形式
-
基本类型:整型、字符型、实型、布尔类型
-
特殊类型:空类型(void)
-
用户定义类型:枚举类型
-
构造类型:数组、结构、联合
-
指针类型:type*
-
抽象类型:类类型
-
-
存储类别:说明数据在内存中的位置和生存期
-
作用域:说明可以使用数据的代码范围
-
生存期:说明数据占用内存的时间范围
-
-
程序设计语言的基本成分包括:数据、运算、控制和传输
2.1.3程序语言的运算成分
-
指明允许使用的运算符号及运算规则,运算符号要规定优先级和结合性,大多数高级程序语言的基本运算包括:
-
算术运算
-
关系运算
-
逻辑运算
-
位运算
-
2.1.4程序语言的控制成分
三种基本逻辑结构:
-
顺序结构:是一种线性有序结构,由一系列依次执行的语句或模块构成
-
循环结构:是由一个或几个模块构成,程序运行时重复执行,直到满足某一条件为止
-
选择结构:是根据条件成立与否选择执行路径的结构
2.1.5程序语言的传输成分
传值/传址:
-
传值调用:实际上重新复制了一个副本给形参,不改变调用函数实参变量的内容(有去无回)
-
传址调用:将实参地址给形参,将改变调用函数实参变量的内容(有去有回)
表达式:
-
前缀表达式(+ab)
-
中缀表达式(a+b)
-
后缀表达式(ab-)逆波兰式

2.1.6高级程序设计语言
-
解释程序:也称解释器 源程序,或者中间代码,边解释边执行,需要源码和解释器一起才能运行
-
编译程序:也称编译器 目标语言程序
-
基本概念:语句、语法、语义、语用
-
编译器的工作阶段:
-

-
词法错误:非法字符,关键字或标识符拼写错误
-
语法错误:语法结构出错,如缺少分号,if...end if 不匹配
-
语义错误:死循环,0除数,其他逻辑错误等 (静态语义错误、动态语义错误)
-
符号表管理:符号表是编译器中用于记录标识符信息的数据结构,在词法、语法、语义、代码生成等阶段被频繁访问和修改。
-
-
解释程序基本原理:
-
解释程序是另一种语言处理程序,在词法、语法、语义分析方面与编译程序的工作原理基本相同。
-
但在运行用户程序时,它直接执行源程序或源程序的内部形式。因此,解释程序与编译程序最大的区别就是不产生源程序的目标程序
-
解释程序通常可以分为两部分
-
分析部分:包括通常的词法分析、语法分析、语义分析程序,经分析后把源程序翻译成中间代码
-
解释部分:用来对第一部分产生的中间代码进行解释执行
-
-
2.2面向过程的语言(C语言基本概念)
-
预处理指令
-
#define
-
#include
-
#ifdef #ifndef
-
#if #else #elif #endif
-
#error:当遇到标准错误时,输出错误消息
-
#pragma :使用标准化方法,向编译器发布特殊的命令到编译器中
-
预定义宏:
-
__DATE__ 编译日期(如 "Jan 1 2023")
-
__TIME__ 编译时间(如 "12:00:00")
-
__FILE__ 当前源文件的文件名(字符串字面量)。
-
__FUNC__ 当前函数的名字(字符串字面量)
-
__LINE__ 当前源代码行号(整数)
-
__STDC__ 若编译器遵循 ANSI C,则为 1
-
__STDC_HOSTED__
-
-
-
数据类型:
-
变量
-
常量(字面量和const常量)
-
void类型(特殊类型)
-
数组、结构体、共用体、位域(构造类型)
-
枚举类型(自定义类型)
-
-
存储管理:当一个函数调用时,他的内部机理是什么,执行了哪些步骤?
-

-
栈:由编译器自动分配和释放,存放函数参数、局部变量等
-
堆:程序员动态申请的内存,手动分配和释放
-
bss:存放未初始化的全局变量和静态变量
-
data:数据段,存放已初始化的全局变量和静态变量
-
rodata:只读数据段,存放字符串常量、const修饰的全局变量等
-
text:代码段,存放代码
-
int z;
void main()
{
int x,y;
x = 1;
y = 2;
Z = x+y;
}
//函数调用过程:
//1.程序开始运行时,main函数被装入到内存中,代码存放在内存的代码区域
//2.全局变量区域分配了一个存储单元给变量z,并初始化为0
//3.接下来,系统调用主函数main去运行
//4.当这个函数调用发生时,系统就会在栈中给它分配一块内存空间(栈帧),
// 存放main函数内部定义的局部变量x,y
//5.PC跳转代主函数的第一条语句,开始执行 程序计数器(Program Counter,PC)
//6.函数执行完毕后,首先释放栈帧,x和y所占用的空间被释放,不能再访问
//7.整个程序结束,全局变量z释放,不能再访问
-
变量的存储与作用域:
int global_static;//全局变量,固定地址,其他源文件可见
static int file_static;//静态全局变量,固定地址,但只在本文件中可见
int foo(int auto_program)//函数参数,位于栈帧中,动态创建,动态释放
{
static int func_static;//静态局部变量,固定地址,只在本函数中可见
int auto_i,auto_a[10];//普通局部变量,位于栈帧中,只在本函数中可见
double *auto_d = malloc(sizeof(double)*5); //动态申请的内存空间,位于堆当中
return auto_i;
}
C语言提供以下存储类别说明符:auto、register、static、extern(以及C11的_Thread_local)。每个变量都属于其中一种。
| 存储类别 | 常用位置 | 生命周期 | 链接属性 | 默认初始化 | 典型用途 |
| auto | 函数内部(块内) | 自动存储期(进入块时分配,退出时销毁) | 无链接(仅块内可见) | 垃圾值 | 局部变量(默认就是auto) |
| register | 函数内部 | 自动存储期 | 无链接 | 垃圾值 | 请求将变量放在寄存器中(已过时,现代编译器更智能) |
| static(局部) | 函数内部 | 静态存储期(程序启动时分配,结束前一直存在) | 无链接 | 零初始化 | 保留函数调用间的状态,只初始化一次 |
| static(全局) | 函数外部(文件作用域) | 静态存储期 | 内部链接(仅本文件可见) | 零初始化 | 限制全局变量的作用域到当前文件 |
| extern | 任意位置(通常文件作用域) | 静态存储期(变量在其他文件中定义) | 外部链接(整个程序可见) | 不初始化(仅声明) | 跨文件访问全局变量或函数 |
2.3面向对象的语言(C++语言基本概念)
-
面向对象的三大核心特征:封装、继承、多态
-
封装:将数据(属性)和操作数据的方法(行为)绑定在一起,并隐藏内部实现细节,仅通过公共接口访问。(提高安全性、降低耦合、便于维护。)
-
继承:一个类可以基于另一个类(父类/基类)来定义,自动获得父类的属性和方法,并可以扩展或修改。(代码复用、建立类层次结构。)
-
多态:同一操作作用于不同对象时,可以有不同的解释和执行结果。通常通过方法重写和接口实现实现。(增强灵活性、可扩展性。)
-

-

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)