文章目录
- 嵌入式程序组件
-
- 状态机
- 循环缓冲区和面向流的程序设计
-
- FIR滤波器
-
- C编写的数字滤波器
- II型IIR 滤波器
- 队列和生产者 / 消费者系统
- 程序的模型
-
- 数据流图(DFG,Data flow graph)
- 控制/数据流图(CDFG)
- 汇编、连接和装载
-
- 汇编程序
- 连接
- 装载
- 目标代码设计
- 编译技术
-
- 编译一个算术表达式
- 为一个条件结构创建代码
- 数据结构
- 编译器优化
-
- 表达式简化
- 过程内联
- 循环的转换
-
- 循环展开
- 循环合并(loop fusion)
- 循环分块(loop tiling)
- 死代码删除
- 寄存器的分配
- 操作调度(operator scheduling)
- 预约表(reservation table)
- 软件流水(software pipelining)
- 模板匹配(template matching)
嵌入式程序组件
考虑三种广泛应用于嵌入式软件的结构或组件的代码,这三种结构或组件分别是:状态机,循环缓冲器,队列。
状态机
- 状态机通过状态来表示系统的内部特性,
- 应用:
- 面向控制的代码;
- 响应式系统;
- 非周期性采样作为输入
C语言实现的一个软件状态机——座位安全带控制器
- 需求:有人坐到座椅上,在规定时间内若没有系好安全带,就启动蜂鸣器。
- 输入:
- seat: 是否有人坐;
- belt: 是否系安全带;
- timer: 定长计时器;
- 输出:蜂鸣器。
- 状态:state: 机器当前状态
C语言实现的循环缓冲区
- 变量pos保存当前采样位置,向缓冲区添加值时,变量位置移动
- pos指向数组末尾时返回0。
- 为了使第一个数据元素进入circ[0],设置pos指到数组末尾,再添加第一个元素前,它的值会变为0。
FIR滤波器
用循环缓冲区保存x值 缓冲区头部从高值向低值移动 b值不变:使用标准数组来保存
- 改变 circ_init() 函数初始化 pos = 0 。circ_get() 函数不需要改变
- FIR滤波器函数代码如下:
II型IIR 滤波器
- p1,p2是两个算法处理块
- 数据从单行缓存区的队列中发送到处理块中
- 数据q12是p1产生的数据,p2消费的数据
程序的模型
- 源代码不是一种很好的表示形式
- 源代码多样性:C语言、汇编语言
- 有很多隐含的信息
- 基本程序模型:控制/数据流图(CDFG)
数据流图(DFG,Data flow graph)
- 数据流图是
- 基本语句块:
- 无条件代码段
- 只有一个入口和出口
- 可操作的最大序列
- 数据流图在基本语句块中定义了操作的部分顺序
数据流节点:一个完整的表示基本语句块的数据流图
- 封装一个数据流图
- 在节点中完成写操作
![]()
CDFG是一种,可以对一个数据流CDFG进行扩展来展现完整的数据流图
- CDFG例子:选择分支
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!