嵌入式系统应用实例分析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

任务的数 据结构
与操作系 统无关的 数据结构
任务设计| 电脑自动打铃器设计与实现
任务的数据结构设计
1. 与操作系统有关的数据结构 一个任务要想在操作系统的管理下工作,必须首先被创建。在 μC/OS-II中,任务的创建函数原型如下:
INT8U OSTaskCreateExt( void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio, INT16U id, OS_STK *pbos, INT32U stk_size, void *pext, INT16U opt);
E
E/d
E
E/d
E
E/d
E
E/d
E
E/d
E
E/d
E
E/d
E
E/d
程序设计| 电脑自动打铃器设计与实现
消耗机时
将关系密切的若干功能组合成为一个任务,达到功能聚合的效果 首先,以 将消耗机时较多的数据处理功能划分出来,封装为低优先级任务 将运行周期相同的功能组合成为一个任务,从而免除时间事件分发机制 将由相同事件触发的若干功能组合成为一个任务,从而免除事件分发机制 CPU为中心,将与各种输入/输出设备(或端口)相关的功能分别划 发现“关键”功能,将其最“关键”部分“剥离”出来,用一个独立任务 发现“紧迫”功能,将其最“紧迫”部分“剥离”出来,用一个独立的高优 将若干按固定顺序执行的功能组合成为一个任务,从而免除同步接力通信的 ( 先级任务 麻烦 或ISR)完成,剩余部分用另外一个任务实现,两者之间通过通信机制沟通 (或ISR)完成,剩余部分用另外一个任务实现,两者之间通过通信 分为独立的任务 机制沟通 对于既“关键”又“紧迫”的功能,按“紧迫”功能处理
程序设计
电脑自动打铃器设计与实现
1 2 3
人机界面设计 主函数 键盘任务
4 5 6
显示任务 输出控制任务 RTC中断
程序设计| 电脑自动打铃器设计与实现
人机界面设计
对于一个具有人机界面的应用系统来说,首先应该考虑的是人 机界面如何设计。 8位数码管显示力度有限,只能通过按键分屏显示,显示界面 定义如下: 时钟模式:12时 59分 59秒 星期一 0
任务函数指针 任务参数指针,一般设为 (void *)0 任务堆栈栈顶指针 任务优先级 任务ID,一般设为prio 任务堆栈栈底指针 任务堆栈大小
任务附加数据指针,一般设为(void *)0
创建任务选项
任务设计| 电脑自动打铃器设计与实现
任务的数据结构设计
在电脑自动打铃器应用中,我们设计了3个任务(键盘任务、显示任 务和输出控制任务),与操作系统有关的数据结构定义如下:
星期
1
时十位
2
时个位
5
分十位
9
分个位
5
秒十位
9
秒个位
程序设计| 电脑自动打铃器设计与实现
人机界面设计
对于一个具有人机界面的应用系统来说,首先应该考虑的是人 机界面如何设计。 8位数码管显示力度有限,只能通过按键分屏显示,显示界面 定义如下: 时钟模式:2007年 12月 12日 2
固定
0
固定
0
年十位
7
年个位
1
月十位
2
月个位
1
日十位
2
日个位
程序设计| 电脑自动打铃器设计与实现
人机界面设计
对于一个具有人机界面的应用系统来说,首先应该考虑的是人 机界面如何设计。 8位数码管显示力度有限,只能通过按键分屏显示,显示界面 定义如下:
闹钟模式:A表示闹钟,0表示第一个闹钟,闹钟时间08:30:00
A
固定
硬件设计| 电脑自动打铃器设计与实现
LED3 +3.3V LED4
输出控制电路
R20 470 R21
P0.9
P0.10
LED5
470 R22 P0.11
LED6
470 R23 470 P0.12
图示为输出控制模拟电路,在实际应用中,可能需要控制继电器等。
任务设计
电脑自动打铃器设计与实现
1 2 3
2. 与操作系统无关的数据结构 电脑自动打铃器具有时钟和闹钟功能,那么我们首先就要构造这两 个数据结构,定义如下:
定义时钟和闹钟全局变量 时钟结构定义 闹钟结构定义 struct time alarm {{ #define MAX_ALARM 4 // 最大闹钟个数 unsigned char ucHour; // 时 TIME GtimeCurrentTime; unsigned char ucMin; // 时钟全局变量 // 分 unsigned char ucSec; // ALARM GalarmRingTime[MAX_ALARM]; // 秒 闹钟全局变量 ucWeek; 星期 unsigned char ucEnable; // 闹钟使能控制 unsigned struct { short usYear; // 年 unsigned unsigned char short ucMon; usLevel; // 输出电平控制 月 unsigned unsigned char short ucDay; usTime; // 输出时间控制 日 }; } c[4]; // 4路输出控制 typedef struct time }; TIME; typedef TIME struct alarm *PTIME; ALARM; typedef ALARM *PALARM;
百度文库
#define TASKCTRL_ID
6
//定义控制任务的ID
//定义控制任务的优先级 //定义控制任务堆栈的大小
#define TASKCTRL_PRIO TASKCTRL_ID #define TASKCTRL_STACK_SIZE 512
任务设计| 电脑自动打铃器设计与实现
任务的数据结构设计
键盘任务 释放I2C资源 申请I2C资源 信号量 释放I2C资源 申请I2C资源
显示任务
任务设计| 电脑自动打铃器设计与实现
多任务之间的信息传递
1. 全局变量 在任务的数据结构设计中,我们设计了时钟和闹钟两个数据结构, 并定义了时钟和闹钟两个全局变量。键盘任务,显示任务和RTC中断通 过它们传递信息。
任务的划分 任务的优先级设计 任务的数据结构设计
4 5
多任务之间的同步与互斥 多任务之间的信息传递
任务设计| 电脑自动打铃器设计与实现
任务的划分
对一个嵌入式应用系统进行“任务划分”,是实时操作系统应 用软件设计的关键,任务划分是否合理将直接影响软件设计的质量。 任务划分原则如下:
固定顺序执行 运行周期相同 相同事件触发 关系密切 任务划分 以CPU为中心 “关键”功 能 “紧迫”功能
0
索引
0
时十位
8
时个位
3
分十位
0
分个位
0
秒十位
0
秒个位
程序设计| 电脑自动打铃器设计与实现
人机界面设计
对于一个具有人机界面的应用系统来说,首先应该考虑的是人 机界面如何设计。 8位数码管显示力度有限,只能通过按键分屏显示,显示界面 定义如下:
闹钟模式:闹钟使能控制(E使能,d禁能),从左至右,第一个是总开 关,接着是星期6~0(分别对应星期日~星期一)的开关。
任务设计| 电脑自动打铃器设计与实现
任务的优先级设计
电 脑 自 动 打 铃 器
1
键盘任务
人机接口,实时性低
2 3
4
显示任务 输出控制任务
控制接口,实时性高
RTC中断
任务设计| 电脑自动打铃器设计与实现
任务的优先级设计
电 脑 自 动 打 铃 器
1
键盘任务 显示任务 输出控制任务
优先级:12 优先级:13 优先级:6
键盘任务 设置时钟和闹钟 更新时钟 检测闹钟 RTC中断
全局变量(时钟和闹钟)
显示时钟和闹钟 显示任务
任务设计| 电脑自动打铃器设计与实现
2. 消息邮箱
多任务之间的信息传递
RTC中断检测闹钟,闹钟到就向输出控制任务发送控制信息, 在本设计实例中使用消息邮箱。
RTC中断 发送控制消息 消息邮箱 接收控制消息 输出控制任务
设计要求| 电脑自动打铃器设计与实现
系统框图
Vcc
输出控制
LPC2000
SDA SCL ZLG7290 INT
键盘输入
数码管显示
LPC2000系列ARM具有RTC功能,RTC掉电后仍可使用电池继 续运行,从而保证了系统掉电后时钟的准确性。ZLG7290是一款键 盘和LED驱动芯片,最多支持64个按键和8个共阴极数码管。
电脑自动打铃器设计与实现
绪论
电脑自动打铃器设计与实现
通过对 ARM7TDMI 体系结构、 LPC2000 系列 ARM 、 μC/OS-II 微小内核分析与程序设计基础的深入学习之后,我们已经对嵌入 式系统有了比较清晰的了解。本章将结合一个具体的实例--电 脑自动打铃器来阐述嵌入式应用系统的工程设计方法。
目 录
1 2 3 4
设计要求 硬件设计 任务设计 程序设计
设计要求
电脑自动打铃器设计与实现
1 2
系统功能 系统框图
设计要求| 电脑自动打铃器设计与实现
系统功能
具有实时时钟功能,能显示时分秒,年月日星期(采用8位数码管显示) 具有 键盘 输入功能 可以设置若干个闹钟,以及闹钟的禁止与使能
可设置每个闹钟发生时的输出动作(一共四路输出,可独立设置每路输出 的时间和电平状态)
2 3
4
RTC中断
任务设计| 电脑自动打铃器设计与实现
任务的数据结构设计
对于一个任务,除了它的代码(任务函数)外,还有相关的信息。 为保存这些信息,必须为任务设计对应的若干数据结构。任务需要配 备的数据结构分为两类:一类是与操作系统有关的数据结构;另外一 类是与操作系统无关的数据结构。 与操作系 统有关的 数据结构
任务设计| 电脑自动打铃器设计与实现
任务的划分
电脑自动打铃器任务划分如下:
RTC中断
输出控制任务
电脑打铃器
显示任务
键盘任务
电脑自动打铃器具有实时时钟功能,需要一个 电脑自动打铃器需要有显示功能,用来显示时钟和闹钟,因此需 电脑自动打铃器需要一个输出控制任务,用来控制闹钟时间到后 电脑自动打铃器具有键盘输入功能,用于设置时钟和闹钟,因此 RTC中断。 要一个显示任务。 各路的输出。 需要一个键盘任务。
键盘扫描任务 发送键值消息 消息邮箱 接收键值消息 键盘处理任务
任务设计| 电脑自动打铃器设计与实现
多任务之间的同步与互斥
2. 资源互斥 在电脑自动打铃器的设计中,ZLG7290是通过I2C总线与LPC2000 连接的,I2C总线是键盘任务和显示任务的共享资源,必须遵循资源互 斥的原则进行访问,二者之间使用信号量进行资源互斥。
任务设计| 电脑自动打铃器设计与实现
多任务之间的同步与互斥
1. 行为同步 为了说明问题,我们在这里将键盘任务拆分成为两个任务,一个 是键盘扫描任务,另一个是键盘处理任务,二者之间使用消息邮箱进 行同步。 键盘扫描任务 扫描到按键,就 向消息邮箱发送 键值消息; 键盘处理任务 应及时处理键值 消息,二者之间 是同步接力的关 系。
#define TASKKEY_ID 12 //定义键盘任务的 ID OS_STK TaskKeyStk[TASKKEY_STACK_SIZE]; //定义键盘任务的堆栈 #define TASKKEY_PRIO TASKKEY_ID //定义键盘任务的优先级 OS_STK TaskDispStk[TASKDISP_STACK_SIZE]; //定义显示任务的堆栈 #define TASKKEY_STACK_SIZE 512 //定义键盘任务堆栈的大小 OS_STK TaskCtrlStk[TASKCTRL_STACK_SIZE]; //定义控制任务的堆栈 #define TASKDISP_ID 13 void TaskKey(void *pdata); #define TASKDISP_PRIO void TaskDisp(void *pdata);TASKDISP_ID #define TASKDISP_STACK_SIZE 512 void TaskCtrl(void *pdata); //定义显示任务的 ID //键盘任务声明 //定义显示任务的优先级 //显示任务声明 //定义显示任务堆栈的大小 //控制任务声明
硬件设计
电脑自动打铃器设计与实现
1 2
键盘显示电路 输出控制电路
硬件设计| 电脑自动打铃器设计与实现
键盘显示电路
本设计实例基于SmartARM2200A工控开发平台实现。SmartARM2200A 工控开发平台提供I2C0接口,可以和PACK板“Panel Module ZYPM7290”连 接,组成键盘显示电路,硬件电路及连接方法请参考配套教材。
相关文档
最新文档