EMACS & 程序 编程点滴...
嵌入式开发
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是进行一字节对齐
- 不能对packed的对象进行对齐
- 所有对象的读写访问都进行非对齐访问
- float及包含float的结构联合及未用__packed的对象将不能字节对齐
- __packed对局部整形变量无影响
- 强制由unpacked对象向packed对象转化是未定义,整形指针可以合法定义为packed。
1
__packed int* p; //__packed int 则没有意义
- 对齐或非对齐读写访问带来问题
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] */ //这样可以很清楚的看到非对齐访问是如何产生错误的 //以及如何消除非对齐访问带来问题 //也可以看到非对齐访问和对齐访问的指令差异导致效率问题 } |




