第7章 电脑自动打铃器设计和实现文档资料.ppt
绪论,电脑自动打铃器设计与实现,通过对ARM7TDMI体系结构、LPC2000系列ARM、C/OS-II微小内核分析与程序设计基础的深入学习之后,我们已经对嵌入式系统有了比较清晰的了解。本章将结合一个具体的实例电脑自动打铃器来阐述嵌入式应用系统的工程设计方法。,目 录,设计要求,任务设计,硬件设计,程序设计,电脑自动打铃器设计与实现,设计要求,系统功能,系统框图,设计要求|电脑自动打铃器设计与实现,系统功能,具有实时时钟功能,能显示时分秒,年月日星期(采用8位数码管显示)具有 键盘 输入功能 可以设置若干个闹钟,以及闹钟的禁止与使能可设置每个闹钟发生时的输出动作(一共四路输出,可独立设置每路输出的时间和电平状态),设计要求|电脑自动打铃器设计与实现,系统框图,LPC2000系列ARM具有RTC功能,RTC掉电后仍可使用电池继续运行,从而保证了系统掉电后时钟的准确性。ZLG7290是一款键盘和LED驱动芯片,最多支持64个按键和8个共阴极数码管。,电脑自动打铃器设计与实现,硬件设计,键盘显示电路,输出控制电路,硬件设计|电脑自动打铃器设计与实现,键盘显示电路,本设计实例基于SmartARM2200A工控开发平台实现。SmartARM2200A工控开发平台提供I2C0接口,可以和PACK板“Panel Module ZYPM7290”连接,组成键盘显示电路,硬件电路及连接方法请参考配套教材。,硬件设计|电脑自动打铃器设计与实现,输出控制电路,图示为输出控制模拟电路,在实际应用中,可能需要控制继电器等。,电脑自动打铃器设计与实现,任务设计,任务的划分,任务的数据结构设计,任务的优先级设计,多任务之间的同步与互斥,多任务之间的信息传递,任务设计|电脑自动打铃器设计与实现,任务的划分,对一个嵌入式应用系统进行“任务划分”,是实时操作系统应用软件设计的关键,任务划分是否合理将直接影响软件设计的质量。,以CPU为中心,“关键”功能,“紧迫”功能,消耗机时,关系密切,相同事件触发,运行周期相同,固定顺序执行,任务划分原则如下:,首先,以CPU为中心,将与各种输入/输出设备(或端口)相关的功能分别划分为独立的任务,发现“关键”功能,将其最“关键”部分“剥离”出来,用一个独立任务(或ISR)完成,剩余部分用另外一个任务实现,两者之间通过通信机制沟通,发现“紧迫”功能,将其最“紧迫”部分“剥离”出来,用一个独立的高优先级任务(或ISR)完成,剩余部分用另外一个任务实现,两者之间通过通信机制沟通,将消耗机时较多的数据处理功能划分出来,封装为低优先级任务,对于既“关键”又“紧迫”的功能,按“紧迫”功能处理,将关系密切的若干功能组合成为一个任务,达到功能聚合的效果,将由相同事件触发的若干功能组合成为一个任务,从而免除事件分发机制,将运行周期相同的功能组合成为一个任务,从而免除时间事件分发机制,将若干按固定顺序执行的功能组合成为一个任务,从而免除同步接力通信的麻烦,任务设计|电脑自动打铃器设计与实现,任务的划分,电脑自动打铃器任务划分如下:,电脑自动打铃器具有键盘输入功能,用于设置时钟和闹钟,因此需要一个键盘任务。,电脑自动打铃器需要有显示功能,用来显示时钟和闹钟,因此需要一个显示任务。,电脑自动打铃器需要一个输出控制任务,用来控制闹钟时间到后各路的输出。,电脑自动打铃器具有实时时钟功能,需要一个RTC中断。,任务设计|电脑自动打铃器设计与实现,任务的优先级设计,人机接口,实时性低,控制接口,实时性高,任务设计|电脑自动打铃器设计与实现,任务的优先级设计,优先级:6,优先级:12,优先级:13,任务设计|电脑自动打铃器设计与实现,任务的数据结构设计,对于一个任务,除了它的代码(任务函数)外,还有相关的信息。为保存这些信息,必须为任务设计对应的若干数据结构。任务需要配备的数据结构分为两类:一类是与操作系统有关的数据结构;另外一类是与操作系统无关的数据结构。,任务的数据结构,任务设计|电脑自动打铃器设计与实现,任务的数据结构设计,与操作系统有关的数据结构,一个任务要想在操作系统的管理下工作,必须首先被创建。在C/OS-II中,任务的创建函数原型如下:,任务设计|电脑自动打铃器设计与实现,任务的数据结构设计,在电脑自动打铃器应用中,我们设计了3个任务(键盘任务、显示任务和输出控制任务),与操作系统有关的数据结构定义如下:,#define TASKKEY_ID12/定义键盘任务的ID#define TASKKEY_PRIOTASKKEY_ID/定义键盘任务的优先级#define TASKKEY_STACK_SIZE512/定义键盘任务堆栈的大小#define TASKDISP_ID13/定义显示任务的ID#define TASKDISP_PRIOTASKDISP_ID/定义显示任务的优先级#define TASKDISP_STACK_SIZE512/定义显示任务堆栈的大小#define TASKCTRL_ID6/定义控制任务的ID#define TASKCTRL_PRIOTASKCTRL_ID/定义控制任务的优先级#define TASKCTRL_STACK_SIZE512/定义控制任务堆栈的大小,OS_STK TaskKeyStkTASKKEY_STACK_SIZE;/定义键盘任务的堆栈OS_STK TaskDispStkTASKDISP_STACK_SIZE;/定义显示任务的堆栈OS_STK TaskCtrlStkTASKCTRL_STACK_SIZE;/定义控制任务的堆栈void TaskKey(void*pdata);/键盘任务声明void TaskDisp(void*pdata);/显示任务声明void TaskCtrl(void*pdata);/控制任务声明,任务设计|电脑自动打铃器设计与实现,任务的数据结构设计,与操作系统无关的数据结构,电脑自动打铃器具有时钟和闹钟功能,那么我们首先就要构造这两个数据结构,定义如下:,时钟结构定义struct time unsigned charucHour;/时 unsigned charucMin;/分 unsigned charucSec;/秒 unsigned charucWeek;/星期 unsigned shortusYear;/年 unsigned charucMon;/月 unsigned charucDay;/日;typedef struct timeTIME;typedef TIME*PTIME;,闹钟结构定义struct alarm unsigned charucHour;/时 unsigned charucMin;/分 unsigned charucSec;/秒 unsigned charucEnable;/闹钟使能控制 struct unsigned shortusLevel;/输出电平控制 unsigned shortusTime;/输出时间控制 c4;/4路输出控制;typedef struct alarmALARM;typedef ALARM*PALARM;,定义时钟和闹钟全局变量#define MAX_ALARM 4/最大闹钟个数TIMEGtimeCurrentTime;/时钟全局变量ALARMGalarmRingTimeMAX_ALARM;/闹钟全局变量,任务设计|电脑自动打铃器设计与实现,多任务之间的同步与互斥,为了说明问题,我们在这里将键盘任务拆分成为两个任务,一个是键盘扫描任务,另一个是键盘处理任务,二者之间使用消息邮箱进行同步。,行为同步,发送键值消息,接收键值消息,键盘扫描任务扫描到按键,就向消息邮箱发送键值消息;键盘处理任务应及时处理键值消息,二者之间是同步接力的关系。,任务设计|电脑自动打铃器设计与实现,多任务之间的同步与互斥,资源互斥,在电脑自动打铃器的设计中,ZLG7290是通过I2C总线与LPC2000连接的,I2C总线是键盘任务和显示任务的共享资源,必须遵循资源互斥的原则进行访问,二者之间使用信号量进行资源互斥。,申请I2C资源,释放I2C资源,申请I2C资源,释放I2C资源,任务设计|电脑自动打铃器设计与实现,多任务之间的信息传递,全局变量,在任务的数据结构设计中,我们设计了时钟和闹钟两个数据结构,并定义了时钟和闹钟两个全局变量。键盘任务,显示任务和RTC中断通过它们传递信息。,任务设计|电脑自动打铃器设计与实现,多任务之间的信息传递,消息邮箱,RTC中断检测闹钟,闹钟到就向输出控制任务发送控制信息,在本设计实例中使用消息邮箱。,发送控制消息,接收控制消息,人机界面设计,键盘任务,主函数,显示任务,RTC中断,输出控制任务,电脑自动打铃器设计与实现,程序设计,程序设计|电脑自动打铃器设计与实现,人机界面设计,对于一个具有人机界面的应用系统来说,首先应该考虑的是人机界面如何设计。8位数码管显示力度有限,只能通过按键分屏显示,显示界面定义如下:,时钟模式:12时 59分 59秒 星期一,程序设计|电脑自动打铃器设计与实现,人机界面设计,对于一个具有人机界面的应用系统来说,首先应该考虑的是人机界面如何设计。8位数码管显示力度有限,只能通过按键分屏显示,显示界面定义如下:,时钟模式:2007年 12月 12日,程序设计|电脑自动打铃器设计与实现,人机界面设计,对于一个具有人机界面的应用系统来说,首先应该考虑的是人机界面如何设计。8位数码管显示力度有限,只能通过按键分屏显示,显示界面定义如下:,闹钟模式:A表示闹钟,0表示第一个闹钟,闹钟时间08:30:00,程序设计|电脑自动打铃器设计与实现,人机界面设计,对于一个具有人机界面的应用系统来说,首先应该考虑的是人机界面如何设计。8位数码管显示力度有限,只能通过按键分屏显示,显示界面定义如下:,闹钟模式:闹钟使能控制(E使能,d禁能),从左至右,第一个是总开关,接着是星期60(分别对应星期日星期一)的开关。,程序设计|电脑自动打铃器设计与实现,人机界面设计,对于一个具有人机界面的应用系统来说,首先应该考虑的是人机界面如何设计。8位数码管显示力度有限,只能通过按键分屏显示,显示界面定义如下:,闹钟模式:C表示通道,0表示第一个通道(每个闹钟有4个通道),H/L表示输出高低电平控制,接着是输出时间控制,最大为9999秒。,程序设计|电脑自动打铃器设计与实现,人机界面设计,根据上述分析,电脑自动打铃器具有时钟和闹钟模式,时钟和闹钟模式都分别有不同的显示内容,闹钟模式还有若干不同的闹钟,为了修改时钟和闹钟的设置,还需要一个光标闪烁来提示用户进行修改,为此定义了如下全局变量:,unsigned int GuiMode=0;/模式(时钟和闹钟模式)unsigned int GuiCursor=8;/光标(闪烁位置提示)unsigned int GuiIndex=0;/索引(不同的闹钟)unsigned int GuiItem=0;/条目(时钟或闹钟的不同内容),按键的处理比较灵活,可自行设计。,程序设计|电脑自动打铃器设计与实现,主函数,在程序设计的讲解中,首先讲一下主函数。在主函数中,进行了操作系统的初始化,创建了一个键盘任务,最后,启动多任务操作系统。程序如下所示:,int main(void)OSInit();/初始化uC/OS-II 创建键盘任务;/代码可参考配套教材 OSStart();/启动多任务操作系统 return(0);,程序设计|电脑自动打铃器设计与实现,键盘任务,键盘任务首先进行目标板的初始化,主要完成系统时钟中断的设置;然后初始化I2C0总线接口并设置中断;然后创建消息邮箱GmboxRingCtrl,用于闹钟触发输出控制任务;接着初始化RTC并设置中断;最后创建了显示任务和输出控制任务,就进入了周期性循环,通过读取ZLG7290获取键值,进行按键处理。,键盘任务负责解释按键,设置时钟和闹钟。,目标板初始化,I2C0初始化,创建消息邮箱GmboxRingCtrl,RTC初始化,创建显示任务和输出控制任务,任务循环,程序设计|电脑自动打铃器设计与实现,显示任务,显示任务负责显示界面的刷新,流程图如下所示:,显示任务周期性的输出全局变量的信息(时钟和闹钟),100ms是一个经验值,用户会觉得比较舒服,不会产生“系统死机”的感觉。,程序设计|电脑自动打铃器设计与实现,输出控制任务,输出控制任务首先初始化输出控制端口,默认为高电平;然后进入任务循环,从消息邮箱获取一条消息,由于消息邮箱没有消息,输出控制任务一直处于挂起状态,直到RTC中断检测到发生了闹钟事件;然后根据消息的内容设置各路的输出电平;接着就进入了输出控制时间循环,在此循环内不断查询消息邮箱是否有新的消息,如果有则退出循环,从而进行新的消息的处理,否则直至所有4路输出时间到为止。,输出控制任务接收RTC中断发送的控制信息,控制4路输出的电平和时间。,输出端口初始化,从消息邮箱获取一条消息,解释消息,设置各路输出,输出控制时间循环,程序设计|电脑自动打铃器设计与实现,RTC中断,RTC中断更新实时时钟,遍历所有闹钟,向输出控制任务发送闹钟控制信息。流程图如下所示:,