嵌入式系统与技术-远程和操作系统.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第六章 进程和操作系统 主要内容 引言:实时系统与RTOS 任务与进程 任务间通信 任务调度策略 6.1 引言:实时系统与RTOS 嵌入式软件层次模型 实时系统(RTS) 对输入数据进行处理并获得结果,这个结果本质上与产生数据的事件是同时产生的; 系统在需要时才发生,不是因为系统运行到了这里; 实时系统模型 单线程模型:只有一个main()主函数,一个执行流; 多线程模型:多个轮转或状态机,同个时间都有执行的可能; 轮转模型 有限状态机 多任务模型 多任务原因 任务:逻辑上进行的是完全不同的操作,而且也以不同的速率完成; 可变数据速率 异步输入 可变数据速率 异步输入 键盘按钮 要求对每种事件作出迅速有效的反应,但这些事件之间时序上又没有稳定的关系; 多速率系统 系统包含若干项周期性地执行,并且各自以不同的速率工作; 比例:最小公倍数周期 变速率 汽车引擎:点火、尾气控制; 嵌入式软件体系结构 轮转结构 带中断的轮转结构 函数队列结构 实时操作系统结构 轮转结构 void main() { while (true) { if (//设备1需要服务) //处理设备1服务 if (//设备2需要服务) //处理设备2服务 … if (//设备n需要服务) //处理设备n服务 } } 轮转结构 特点:简单,没有中断,没有共享数据,不考虑延迟 设备少, 没有特别耗时任务, 没有紧迫的响应需求 缺点: 存在比最坏情况完成一个循环要短的响应时间 冗长的处理时间使响应时间加长 结构脆弱,难以扩展 带中断的轮转结构 bool fDevice1 = false; bool fDevice2 = false; … bool fDeviceN = false; void interrupt vHandleDevice1(){ fDevice1 = true;} void interrupt vHandleDevice2(){ fDevice2 = true;} … void interrupt vHandleDeviceN(){ fDeviceN = true;} 带中断的轮转结构 void main(){ while (true){ if (fDevice1){ fDevice1 = false; //处理设备1数据} if (fDevice2){ fDevice2 = false; //处理设备2数据} … if (fDeviceN){ fDeviceN = false; //处理设备N数据} } } 带中断的轮转结构 特点: 中断程序可以获得很快响应 带优先级的中断使得可以控制不同任务 缺点: 共享数据 中断轮转示例-通信桥接器 通信桥接器 把数据从链路A转发到B,从链路B到A 每当通信链路上到达一个字符,引发一个中断,必须快速响应 CPU一个时刻只能往I/O硬件上写一个字符 一些例程,从队列中读出或向队列中写入字符,它们可以被中断程序和任务代码调用 加密与解密程序一次对一个字符加密 通信桥接器 #define QUEUE_SIZE 100 typedef struct{ char chQueue[QUEUE_SIZE]; int iHead,iTail; } QUEUE; static QUEUE qDataFromLinkA; static QUEUE qDataFromLinkB; static QUEUE qDataToLinkA; static QUEUE qDataToLinkB; static BOOL fLinkAReadyToSend = TRUE; static BOOL fLinkBReadyToSend = TRUE; 通信桥接器 void interrupt vGotCharacterOnLinkA() { char ch; ch = //从通信链路A中读取字符 vQueueAdd(qDataFromLinkA, ch); } void interrupt vGotCharacterOnLinkB() { char ch; ch = //从通信链路B中读取字符 vQueueAdd(qDataFromLinkB, ch); } 通信桥接器 void vSendCharacterOnLinkA() { fLInkAReadyToSend = TRUE; } void vSendCharacterOnLinkB() { fLinkBReadyToSend = TRUE; } 通信桥接器 void main(){ char ch; //初始化 vQueueInitialize(qDataFromLink

文档评论(0)

新起点 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档