嵌入式系统设计|程序设计与分析(上)

文章目录

  • 嵌入式程序组件
    • 状态机
    • 循环缓冲区和面向流的程序设计
      • 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进行处理,非常感谢!

    上一篇 2021年5月3日
    下一篇 2021年5月3日

    相关推荐