EMACS & 程序 编程点滴...

天下难事必作于易,天下大事必作于细

Lastupdated: 2010-01-24

嵌入式开发

TOP基本原理

TOP硬件

TOP内存

TOPROM (Read Only Memory)
  • MROM(Mask ROM)
是制造商为了要大量生产,事先制作一颗有原始数据的ROM或EPROM当作样本,然后再大量生产与样本一样的 ROM,这一种做为
大量生产的ROM样本就是MASK ROM,而烧录在MASK ROM中的资料永远无法做修改。
  • PROM(Programmable ROM)
可擦写ROM
  • EPROM(Erasable Programmable ROM、Electrical PROM)
可编程ROM的一种。按擦写方式可分为,紫外线可擦写方式(UV-EPROM),电可擦写方式(EEPROM)。Flash内存(Flash ROM)就是 EEPROM 的一种。
即使只更新1比特的数据,也需要删除所有的数据(Flash Memory:以block单位更新/消除)
TOPRAM (Random Access Memory)
  • SRAM (Static RAM)
一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。
优点: 速度快,不必配合内存刷新电路,可提高整体的工作效率。
缺点: 集成度低,功耗较大,相同的容量体积较大,而且价格较高,少量用于关键性系统以提高效率。
SRAM使用的系统 : CPU与主存之间的高速缓存。CPU内部的L1/L2或外部的L2高速缓存。
  • DRAM (Dynamic RAM)
动态随机存储器。DRAM使用电容存储,所以必须隔一段时间刷新(refresh)一次,如果存储单元没有被刷新,存储的信息就会丢失。
动态是指存储阵列需要不断的刷新来保证数据不丢失;
随机是指数据不是线性依次存储,而是自由指定地址进行数据读写。
  • SDRAM (Synchronous Dynamic RAM)
同步动态随机存取存储器。同步是指Memory工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准。
SDRAM从发展到现在已经经历了四代,分别是:第一代SDR SDRAM,第二代DDR SDRAM,第三代DDR2 SDRAM,第四代DDR3SDRAM.
  • FeRAM (Ferroelectric RAM)
构造与DRAM相似。速度是Flash内存的10倍以上(与DRAM相当)。消费电力比DRAM或者是Flash内存小。

TOP总线

  • 串口(シリアル)
USB, IEEE1394, 串口SCSI, PCI Express
面向长距离通信

按传输方式分为同步式和非同步式(又称调步同步式),同步式需要数据线和时钟线,非同步式需要数据线上的开始,数据,结束信号。
  • 并口(パラレル)
SCSI-1, SCSI-2, SCSI-3, ATA, PCI, ISA
面向大容量,高速,短距离通信

8根数据传输用信号线,通信时利用脉冲信号
速度
SCSI 4M Byte/s
USB 12M Byte/s
USB 2.0 480M Byte/s
IEEE1394 100M Byte/s
系统总线 800~1600M Byte/s
总线控制
  • 总线判优控制(bus arbiter, バスアーピタ) : 根据接续在同一总线上,复数的CPU或者DMA控制器的使用要求,决定总线使用权的回路。
  • 从动总线控制(bus slave,バススレーブ) : 与总线接驳的装置被动地开始数据传输控制。
  • 主动总线控制(bus master,バスマスタ) : 与总线接驳的装置主动地开始数据传输控制。

TOPDMA

传送模式
  • 字节传送模式(シングル転送モード)
每次传输一个字节,每一次传输后,数据线的所有权返还给MPU
传输效率不好,但是实时性好(及时响应中断信号)
  • 块传送模式(连续传输模式)
每次传输指定的数据大小,传输过程中,占有数据线
传输效率好,但是实时性不好
  • Demand传送模式,burst传送模式(デマンド転送モード,バースト転送モード)
与连续传送模式有相同的传输,但是中间可以被中断(数据线的使用权可以随时归还)
以每个传输字节为单位检查DMA请求信号,如果有则传输下面的字节,没有则归还数据线使用权

TOP高速缓存

  • Write through : 写Cache的同时也写主内存
  • Write back : 只写Cache,只有当Cache中没有命中的数据需要换页的时候,先将Cache的内容写回内存,在加载新的
TLB
换页(ページアウト)的算法 :
LRU : Least Recently Used 最近最久未使用算法
LFU : Least Frequently Used 最不经常使用页置换算法,要求在页置换时置换引用计数最小的页
NUR/NRU : Not Used Recently/Not Recently Used 页面淘汰算法,又名近似的LRU置换算法
          换页优先级为 : 无参照/变更 > 有变更 > 有参照 > 有参照/变更

TOPA/D转换器(コンバータ)

  • 二重积分型 : 抗干扰性能强,精度高,速度慢
  • 逐次比较型 : 比并列方式慢,但是便宜
  • Flash方式 : 高速,分解能低
  (低速)二重积分型 ⇒ 逐次比较型 ⇒ 【并列比较】Flash方式(高速)

TOPDC马达的控制(PWM控制)

PWM(Pulse Width Modulation)控制——脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。 以控制马达的转速。

TOP传感器

  • 红外线传感器 : 利用电磁波的传感器,用来测量高温
  • 测温电阻 : 利用温度的变化影响电阻值的特性,用来实现工业上的高精度计测
  • 热电对 : 用两种不同金属实现闭合回路,由于温度差在其接触面处会生成热电流
  • 热变电阻(サーミスタ) : 利用温度变化来影响半导体的性质,控制电路电阻值
  • 光量检出传感器(シリコンフォトダイオード,フォトトランジスタ)
  • 原点检出传感器(フォトインタラプタ) : 用于 步进电机(Stepper motor, ステッピングモーター)
  • 磁力传感器 (ホール素子)
  • 旋转角检测(アブソリュートエンコーダ)
  • 直线运动驱动器(ソレノイド): 利用电磁力使铁芯运动的驱动器,比如驱动磁盘磁头的装置
  • 电动驱动器(电机,電動アクチュエータ)
  • 压力传感器(圧電素子)

TOP静电&电磁干扰

  • 干扰对策 : 框体外侧使用导电性越强越好;信号线用 单芯屏蔽电缆(shielded cable,シールドケーブル);电源线尽量粗;减少输入信号使用 光电耦合器(Photocoupler,フォトカプラ)。

TOPPLL控制电路

PLL(Phase Locked Loop): 为锁相回路或锁相环,用来统一整合时脉讯号,使内存能正确的存取资料。PLL用于振荡器中的反馈技术。

许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步,利用锁相环路就可以实现这个目的。锁相环路是一种反馈控制电路,简称锁相环(PLL,Phase-Locked Loop)。锁相环的特点是:利用外部输入的参考信号控制环路内部振荡信号的频率和相位。因锁相环可以实现输出信号频率对输入信号频率的自动跟踪,所以锁相环通常用于闭环跟踪电路。锁相环在工作的过程中,当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,这就是锁相环名称的由来。锁相环通常由鉴相器(PD,Phase Detector)、环路滤波器(LF,Loop Filter)和压控振荡器(VCO,Voltage Controlled Oscillator)三部分组成,锁相环组成的原理框图如图8-4-1所示。锁相环中的鉴相器又称为相位比较器,它的作用是检测输入信号和输出信号的相位差,并将检测出的相位差信号转换成uD(t)电压信号输出,该信号经低通滤波器滤波后形成压控振荡器的控制电压uC(t),对振荡器输出信号的频率实施控制。

PLL控制电路

TOP软件

TOPRTOS特征

  • 抢占式调度 :高优先级抢占调度算法原则是高级ready状态的任务可以抢占正在运行的低级任务,中断可以抢占任何任务。算法使高优先级任务和中断处理可以得到及时处理,以保证系统的实时性。并且不同优先级的任务间采用抢占式调度,相同优先级任务则通过时间片轮转,保证同级任务平等获得cpu时间。
PC系统(Linux或windows)是按时间调度的。操作系统有时会中断高优先级的任务,来为低优先级任务提供cpu时间。
中断结束的时候,并不一定被线程调度。
  • 可抢占内核 : RTOS中,内核操作可被抢占
  • 一般RTOS是宏内核(linux)的,基于消息传递的微内核RTOS则提供了更好的容错性和动态升级能力

TOP设备驱动

按照实现方法分为
  • 系统调用型 : 在内核空间运行,例如 windows。程序接口固定。
  • 应用程序任务型 : 在用户空间运行,一些小规模RTOS。中断处理也在程序中定义。

TOP中断

  • CISC : 使用vector table,每个中断号执行各自的程序
  • RISC : 将不同的中断分组,不同种类的中断执行不同的程序。中断号由特定的寄存器通知。
同步中断的场合,中断结束为止,调用进程一直处于等待状态。
非同步中断的场合,中断结束后,利用事件通知调用进程中断结束。

TOP调试

TOP硬件调试
逻辑分析仪(logic analyzer, ロジックアナライザ)
探针与MPU的端子连接,测定各种总线上信号的读写周期。
TOP软件/硬件调试
ICE调试的特征(インサーキットエミュレータ)
  • 可代替目标设备(模拟目标设备的MPU—内部有与目标设备相同的MPU,内存)
  • 不使用其他资源
  • ROM/RAM内集成硬件中断(ブレーク)功能
  • 实时跟踪(トレース)/触发(トリガ)
  • 连接MPU的IC接口
JTAG调试的特征
  • 不能代替目标设备
  • 使用MPU的设备资源
  • ROM/RAM内集成硬件中断(ブレーク)功能
  • 由MPU的外部可以产生让MPU停止的信号
  • 对应JTAG的设备与HOST之间通过5根信号线(TAP)连接,HOST输入测试信号并解析输出信号来检测目标设备的状态
软件调试(モニタデバッガ)的特征
  • RAM内配置软件中断
  • 需要设备资源
  • 不能更改/参照CPU内部的特殊寄存器
  • 实时性差,不能实现实时跟踪/触发

TOP嵌入式系统开发方法

并行模式(concurrent,コンカレント)
  • 软件与硬件并行的开发
  • Co-design(コデザイン): 协调设计
  • Co-verification(コベリフィケーション): 协调验证
マスククロック方式
停止不必要回路的时钟供给,以达到省电,节能的效果
Watchdog Timer(ウォッチドッグタイマー)
计算机硬件计时器,用来检测软件例外

TOP软件测试方法

黑箱测试
黑箱测试(又称为功能测试)是把程序或系统看成一个黑盒子,完全不考虑其内部结构和处理过程。
  • 同值分割 : 同值分割又称为等价划分,它的含义是针对输入条件,将所有可能的输入数据(有效的和无效的)分为若干等价类,对每一个等价类只取一组数据作为测试数据,使得选取的测试数据具有代表性。
  • 界限分割(边界分析) : 选取刚好等于、稍小于和稍大于等价类边界值的数据作为测试数据,而不是选取每个等价类内的典型值或任意值作为测试数据。
  • 因果图法 : 主要标识出输入数据(原因)和输出数据(结果)之间的关系,调查其有效组合的测试分支。适合于被测程序具有多种输入条件,程序的输出又依赖于输入条件的各种组合的情况。
利用因果图导出测试用例的步骤:
1. 列出原因(输入条件)和结果(输出条件);
2. 标识出原因和结果之间的关系(一一对应、选择关系、 并列关系、否定关系),画出因果图;
3. 把因果图转化成判定表;
4. 对判定表的每一列写成一个测试用例。
黑盒测试策略
1. 首先用边界值分析法设计测试用例
2. 必要时用等价分类法补充测试用例
3. 必要时再用错误推测法补充测试用例
4. 如果在程序的说明中含有输入条件的组合,宜在一开始就采用因果法,然后再按上述步骤进行
Bottom Up Test(ボトムアップテスト)
在由多个模块组成的系统程序中,从底层模块向上层模块的测试手法。测试底层的过程中,上层模块可以用“驱动(Driver)”代替。
Top Down Test(トップダウンテスト)
在由多个模块组成的系统程序中,从上层模块向底层模块的测试手法。测试上层的过程中,底层模块可以用“存根(stub)”代替。

TOP系统控制

  • 顺序控制(シーケンス制御) : 按照预先定义好的顺序来控制执行
  • 模糊控制(Fuzzy Control, ファジー制御) : 定量化不明确的值,来达到系统控制。例如,模糊洗衣机、模糊冰箱、模糊相机等,专家系统、智能控制中也大量运用模糊计算。
  • 反馈控制(feedback control, フィードバック制御) : 管理人员分析以前的工作的执行结果,将它与控制标准相比较,发现偏差所在并找出原因,拟定纠正措施以防止偏差发展或继续存在,就是反馈控制。
  • 前馈控制(feed-forward control, フィードフォワード制御) : 是指通过观察情况、收集整理信息、掌握规律、预测趋势,正确预计未来可能出现的问题,提前采取措施,将可能发生的偏差消除在萌芽状态中,为避免在未来不同发展阶段可能出现的问题而事先采取的措施。 前馈控制发生在实际工作开始之前,是未来导向的。质量控制培训项目、预测、预算、实时的计算机系统都属于前馈控制。前馈控制是管理层最渴望采取的控制类型,因为它能避免预期出现的问题,而不比当问题出现时再补救。它是为了弥补反馈控制的缺点而产生的。
  • 伺服控制(servo control, サーボ制御) : 用来精确地跟随或复现某个过程的反馈控制系统。又称随动系统。在很多情况下,伺服系统专指被控制量(系统的输出量)是机械位移或位移速度、加速度的反馈控制系统,其作用是使输出的机械位移(或转角)准确地跟踪输入的位移(或转角)。伺服系统的结构组成和其他形式的反馈控制系统没有原则上的区别。
反馈控制,前馈控制,伺服控制的特性之一是不需要变更硬件,只需更改软件特性就可对应各种伺服控制特征。

TOP嵌入式Linux

TOP线程调度

执行线程调度的时机
  • 中断程序结束时
  • 系统调用结束时
  • 系统空闲时间
  • 固定时钟

linux内核使用 非抢占式 的线程调度方式。但是为了在嵌入式领域中实现有效的实时性,有以下几种改善方式 :

  • 改善驱动程序,内核中断的禁止时间(割り込みマスク時間)
  • 采用混合构造的内核(ハイブリッド構造,RTLinux)
  • 内核优化(采用抢占式内核,MontaVista Linux)
※ linux 2.6 开始内核已经支持抢占式线程调度。如果需要中断结束后执行线程调度,须在 thread_info 结构中设置 : TIF_NEED_RESCHED

抢占式 linux 线程调度

TOP嵌入式 Linux 与 ITRON 的区别

ITRON
  • 任务以内核模式运行
  • 没有MMU,直接访问内存
  • 按优先级方式执行任务调度
  • 任务刚生成时为休止状态,这之后被其他任务唤醒为执行状态
  • 用于中断的系统调用与通常任务中使用的系统调用不同

ITRON 中断处理

Linux
  • 为了达到实时处理的要求,采用实时线程调度方法(抢占式线程调度)
  • 管理以内核模式运行的任务
  • 结合RTOS的混合架构

Linux 中断处理

linux中进程通过系统调用访问设备,如果设备等待中断的情况下,调用sleep系统调用。中断结束后,通过wake_up()来唤醒。

TOP实时系统下的并行编程

TOP线程控制模型

  • 工作群模型(work crew model)
线程池模式。web服务器,邮件服务器等经常应用。(并行地执行相同的任务)
  • 管理者/工人模型(boss/worker model)
主线程接收事件命令,分配给工作线程完成,主线程不被阻塞。(可能阻塞或较长时间完成的任务由工作线程完成)
  • 流水线模型
任务以串行的方式对数据进行处理

TOP优先度逆转问题

有以下优先级的线程:

B>C>A

由于加锁,低优先级线程A占用某一资源时,CPU切换到高优先级B后,B要访问相同的资源。这时,B被A阻塞。而其中介于A,B之间的线程C会抢占A的CPU,使C先于B执行。即优先级倒置。

TOP解决方法

优先级继承
低优先级线程A保持资源后被高优先级B线程抢占,将A线程的优先级升级到B线程的优先级(以使A,B之间可以相互转换)。之后切换到A线程后,释放资源,并恢复到原先的优先级。(需要保证阻塞时,中等优先级的线程不被调用)
优先级上限
临界资源与一个极限优先级相关联(当前系统的最高优先级+1)。线程进入临界区后,该线程将获得该资源的极限优先级,直到线程退出临界区,恢复为原先的优先级。

TOP线程间通信

无数据交换的线程间相互作用
  • 利用信号实现线程同步
  • 事件,旗语实现无数据交换的线程协作
线程同步,异步数据交换
  • 数据池
  • 隧道(Queue, RingBuffer)
线程同步,数据同步

用“邮箱”(MailBox) 实现

  • 数据接收顺序是 送信的顺序 或者是 优先级顺序
  • 需要两个队列(queue) 分别是 授信等待Queue 消息Queue
  • 低优先级 线程送信, 高优先级 线程授信。通过系统调用完成送授信

MailBox

TOP处理器相关

TOPARM平台下的对齐

__align(num)

这个用于修改最高级别对象的字节边界。在汇编中使用LDRD或者STRD时就要用到此命令__align(8)进行修饰限制。来保证数据对象是相应对齐。这个修饰对象的命令最大是8个字节限制,可以让2字节的对象进行4字节对齐,但是不能让4字节的对象2字节对齐。__align是存储类修改,他只修饰最高级类型对象不能用于结构或者函数对象。

__packed
__packed是进行一字节对齐
  1. 不能对packed的对象进行对齐
  2. 所有对象的读写访问都进行非对齐访问
  3. float及包含float的结构联合及未用__packed的对象将不能字节对齐
  4. __packed对局部整形变量无影响
  5. 强制由unpacked对象向packed对象转化是未定义,整形指针可以合法定义为packed。
    1
    
         __packed int* p;  //__packed int 则没有意义
    
  6. 对齐或非对齐读写访问带来问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
__packed struct STRUCT_TEST
{
    char a;
    int b;
    char c;
};    //定义如上结构此时b的起始地址一定是不对齐的
      //在栈中访问b可能有问题,因为栈上数据肯定是对齐访问

//将下面变量定义成全局静态不在栈上
static char* p;
static struct STRUCT_TEST a;
void Main()
{
    __packed int* q;  //此时定义成__packed来修饰当前q指向为非对齐的数据地址下面的访问则可以

    p = (char*)&a;
    q = (int*)(p+1);
    *q = 0x87654321;

    /*
    得到赋值的汇编指令很清楚

    ldr      r5,0x20001590 ; = #0x12345678
    [0xe1a00005]   mov      r0,r5
    [0xeb0000b0]   bl       __rt_uwrite4  //在此处调用一个写4byte的操作函数

    [0xe5c10000]   strb     r0,[r1,#0]   //函数进行4次strb操作然后返回保证了数据正确的访问
    [0xe1a02420]   mov      r2,r0,lsr #8
    [0xe5c12001]   strb     r2,[r1,#1]
    [0xe1a02820]   mov      r2,r0,lsr #16
    [0xe5c12002]   strb     r2,[r1,#2]
    [0xe1a02c20]   mov      r2,r0,lsr #24
    [0xe5c12003]   strb     r2,[r1,#3]
    [0xe1a0f00e]   mov      pc,r14

    编译器会在使用__packed的情况下,自动对其中的4字节/2字节访问添加特殊代码,以保证其结果的正确。
    */

    /*
    如果q没有加__packed修饰则汇编出来指令是这样直接会导致奇地址处访问失败
    [0xe59f2018]   ldr      r2,0x20001594 ; = #0x87654321
    [0xe5812000]   str      r2,[r1,#0]
    */

    //这样可以很清楚的看到非对齐访问是如何产生错误的
    //以及如何消除非对齐访问带来问题
    //也可以看到非对齐访问和对齐访问的指令差异导致效率问题
}
© www.yifeiyang.net
net tracking

                                                                                                 stats