基于嵌入式操作系统的数字电子钟系统设计
一.嵌入式背景介绍
随着信息化、智能化、网络化的发展以及计算机技术的发展,嵌入式技术也获得了广阔的发展空间,嵌入式技术目前已成为通信和消费类产品的共同发展方向。嵌入式技术的应用到处可见,应用十分广泛。如家庭中的数字电视、机顶盒、DVD、超级VCD智能手机等;办公室中的复印机、打印机、扫描仪、键盘灯;手持设备也用到了嵌入式技术,包括MP3、GPS手机、数码相机、数码摄像机等;汽车电子产品:电子地图、导航、车载GPS等。其他领域,如通信、机器人等都应用到了嵌入式技术,由此可以看出,嵌入式系统的发展已日趋成熟了。
嵌入式系统被定义为:以应用为中心,以计算机技术为基础、软件硬件可剪裁、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。嵌入式系统是现代多学科互相融合的产物,嵌入式系统无多余软件,并且以固态化出现,硬件亦无多余存储器,有可靠性高、成本低、体积小、功耗少等特点。嵌入式系统又是知识密集,投资规模大,产品更新换代快,且具有不断创新特征、不断发展的系统。
嵌入式系统主要由嵌入式处理器、相关支撑硬件和嵌入式软件系统组成,它是集软硬件于一体的可工作的“器件”。嵌入式处理器主要由一个单片机或微控制器组成。而这些嵌入式微处理器目前多是8位、16位和32位的,与位的高性能处理器相比,具有很强的经济性。相关支撑硬件包括显示卡、存储介质、通讯设备、IC卡或信用卡的读取设备等。嵌入式系统有别于一般的计算机处理系统,它不具备像硬盘那样大容量的存储介质,而大多使用闪存作为存储介质。嵌入式软件包括与硬件相关的底层软件、操作系统、图形界面、通讯协议、数据库系统等、标准化浏览器和应用软件等。
随着计算机技术、信息技术和网络技术以及其他技术的发展,嵌入式系统将向着更加小、更快速、功耗更低以及互联网的方向发展。
本系统的功能是可调数字时钟,LED显示时间,通过键盘和触摸
屏均可以校对时钟。
通过对本课题的设计达到如下目的:
1.熟悉ARM芯片cortex-m3定时/计数器,中断的应用。 2.掌握给予嵌入式操作系统us/os的编程方法。 3.熟悉时钟时,分,秒计时方法,掌握编程技巧。
4.掌握键盘的基本工作原理,键的识别,键抖动和重键问题的解决,键盘工作方法和键盘程序的编程。
5.掌握七段码LED的结构,七段码LED的工作方式和显示程序的编程。
二.软硬件的设计
1.设计要求
利用cortex-m3,uc/os,七段码LED,按键及常用外围器件,设计一个基于嵌入式操作系统的数字电子钟系统,具体要求如下: (1).设计基于嵌入式操作系统的数字电子钟系统的硬件框图。 (2).设计定时程序。
(3).在LED上显示时间,通过按键切换,分别显示时,分,秒,设计显示程序。
(4).可用键盘进行校对时间,设计键盘程序。 2.硬件环境概述
嵌入式系统主要由嵌入式微处理器和操作系统组成。硬件主要包括:微处理器,ROM,DRAM,人机交互接口,A/D、D/A转换电路,触摸屏等。
嵌入式系统的核心部件是各种类型的嵌入式处理器,嵌入式开发硬件平台的选择主要是嵌入式处理器的选择。在一个系统中使用什么样的嵌入式处理器内核主要取决于应用的领域、用户的需求、成本、开发的难易程度等因素。确定了使用哪种嵌入式处理器内核以后,接下来就是综合考虑系统外围设备的需求情况一选择一款合适的处理器。
本系统采用基于ARM的S3C44B0X的微处理器,通过系统总线将CPU、电源管理模块、存储器、控制器、LCD控制器、中断控制器连接在一起,通过外设总线和A/D转换器、看门狗定时器、通过I/O控
制器、PWM定时器等连接在一起。S3C44B0X的160个引脚中,71个引脚可以通过编程的方法定义多功能输入/输出引脚。I/O端口有两种编制方式,键盘模块输入数字型数据或选择控制设备的操作模式,LCD通过数据总线寄存器及使能信号与处理器连接实现触摸屏驱动X、Y通道连接。
硬件设计原理图如下:
STM32原理图如下图:
3.软件环境概述
嵌入式系统的软件一般由嵌入式操作系统和应用软件组成,编译过程是一起进行的。而操作 系统的软件又与硬件紧密相关,必须与具体应用相结合才能发挥其优势,即必须结合实际系 统的需求进行合理的裁剪。所以,如果能够建立相对通用的软硬件基础,然后在其上开发出 需要的系统,是一种比较好的发展模式。从某种程度上来说,嵌入式系统是指能够运行操作系统的软硬件综合体。
就实时嵌入式操作系统(operation system)而言,它可大致分为商用嵌入式OS与 源码开放的嵌入式OS,前者如WindRiver公司的Vxworks、ISI公司的pSOS和Q uantum公司的QNX等,后者如免费的嵌入式Linux,以及本文中所用到的uC/OS Ⅱ。尽管这些嵌入式RTOS形式多样,但一般都具有以下特点:
1)可裁剪的微内核结构,高效的多任务优先级管理,μs级的中断处理(Windows下 的中断最快是55μs/次),更加有利于工业控制效率的提高;
2)支持多处理器并行处理及任务间通信(这一点对于电力系统并行计算有可借鉴之处);
3)具有共享内存,有利于实时数据库的实现;
4)灵活的引导方式(支持从ROM/flash/本地盘/网络引导),引导操作系统事件 更短,甚至可以一上电在秒级的时间内就跳转至用户程序处等等。
从这些特点可看出,在工业控制等领域以嵌入式RTOS作为软件平台将比Windows、UNI X、OS/2
等商用操作系统更有其特殊的优
势。例如东北电网的SCADA与EMS中就采 用了VXM实时操作系统。
目前国际上已有几百个成熟的实时嵌入式操作系统,而我国在这方面起步较晚。这里将比较 两种实时操作系统以说明选择uC/OS-Ⅱ的原因。
uCLinux是专为无MMU微处理器打造的嵌入式Linux操作系统。它是由Linux2. 0内核发展来的,内核代码小于512 kb。uC/OS-Ⅱ内核编译过后大约为6~1 0kb。uC/OS-Ⅱ内核是针对实时系统的要求设计实现的,可以满足较高 的实时性要求。而uCLinux仅针对嵌入
式处理器进行了改良,实时性不如uC/OS-Ⅱ优越。uCLinux继承了Linux内核的特点,支持文件系统和网络能力,并 提供了一些API接口函数,而uC/OS-Ⅱ只是一个实时内核,要建立一个 实用的系统,还需要进行扩展。
由于该系统设计对实时性要求很高,所以本文选择uC/OS-Ⅱ内核进行移植。
嵌入式系统中,软件和硬件紧密配合,协调工作,共同完成系统预定的功能。根据OSI的七层模型可以确定链路层和物理层有硬件实现,其他各层由软件实现。 (三)系统的实现
由于嵌入式应用软件是通过并发的任务来运作的,应用软件开发
的系统设计将系统划分为多个并发执行的任务,通过相互间通信建立联系。根据需求划分任务是比较重要的一步,通用部分可以划分为各个功能子模块。
本文中设计的保护测控系统,划分成数据采集、液晶操作、键盘处理、循环计算程序、保护 量计算、继电器出口等任务,每一个任务根据相互之间的关系及数据流设置优先级以及执行 频率,这些设 置好之后都由内核实现调度和任务之间的通信。
同时还要根据实际情况设置中断的优先级。在以uC/OS-Ⅱ为操作系统的项目中,系统 可能要处理各种不同的中断请求,如果某个中断处理程序需要调用uC/OS-Ⅱ的各种Post函数向任务发出消息,那么uC/OS-Ⅱ中的中断服务程序的写法是: 1)保存全部CPU寄存器;
2)调用OSIntEnter或OSIntNesting直接加1; 3)执行用户代码做中断服务; 4)调用OSIntExit; 5)恢复所有CPU寄存器; 6)执行中断返回指令。
这种方式实际上是将这个中断处理加入了任务调度系统,也就是说这个中断可以引起任务的 切换,也叫“标准中断”。如果在中断处理中没有调用各种Post函数的话,则可以用原 来没有操作系统时的
写法:
1)保存中断处理程序需要用到的CPU寄存器; 2)执行中断处理;
3)恢复保存了的CPU寄存器; 4)执行中断返回指令。
按照这种方法定义的中断永远不会引起任务切换,称为“快中断”。
硬件(LCD、USB、FLASH和网卡等) 基于uC/OS-II的RTOS内核 驱动程序(与硬件中的设备对应) API函数 用户应用程序 图2:系统结构
主要软件设计如下: 1.主程序
主程序的主要功能是进行定时器/计数器初始化编程,然后通过反复调用子程序的方法,等待定时中断的到来。流程框图如图3-1所示。 主程序如下:
#include \"stm32f10x.h\" #include \"SysParaSet.h\" #include \"KeyScan.h\"
extern u8 KeySta,KeyChanFlag;
extern u8 TimeCountA,TimeCountB,Time3Flag;
extern u8 SecData,MinuData,SecDataPart[2],MinuDataPart[2]; u8 CountA,KeyCountA;
u8 LEDDispA,LEDDispB,LEDDispC,LEDDispD; int main(void) {
int a=0,b=0,c=0,d=0;
NVIC_Configuration(); //初始化 GPIOConfiguration();
D3Off; D4Off; D5Off; D6Off; D7Off; D8Off; KeyCountA = 0; Time3Flag = 0; for(CountA=0;CountA<5;CountA++) { D3On; D4On; D5On; D6On; D7On; D8On; delay_ms(1000); D3Off; D4Off; D5Off; D6Off; D7Off; D8Off; delay_ms(1000); } EXTI9_5_Config(); EXTI15_10_Config(); TIMER3_Init(); ADInit(); while (1) //主循环 { KeyScan(); if(KeyChanFlag == 0x01) { switch (KeySta) { case 0x07: KeyCountA++; if(KeyCountA > 0x04) { KeyCountA = 0; } while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4) == 0); break;
default: break; } KeyChanFlag = 0x00; } LEDDispA = 0; //LEDA显示0 LEDDispB = 0; //LEDB显示0 LEDDispC = 0; //LEDC显示0 LEDDispD = 0; //LEDD显示0 for(d=0;d<10;d++) //在for循环下实现计数,d为秒 { LEDDispA=a;//LEDA显示a所对应的值 LEDDispB=b;//LEDB显示b所对应的值 LEDDispC=c;//LEDC显示c所对应的值 LEDDispD=d;//LEDD显示d所对应的值 delay_ms(50);//延时 /*实现60进制技术,即为秒的设计*/ if(d==9) //当d等于9时,进位,即c=c+1 { c=c+1; } if(c==6) //当c=6时,说明秒的部分已完成0-59的计数,先将秒的部分清零,再进位 { c=0; d=0; b=b+1; //分的部分进一位 } /*实现60进制技术,即为分的设计*/
if(b==10) //当b=10时,b已经完成0-9的计数,也是先清零,再进位 { c=0; d=0; b=0; a=a+1; } if(a==6) //当a=6时,说明分的部分已完成0-59的计数,全部清零 { a=0; b=0; c=0; d=0; } } } }
2.定时中断程序
采用中断方式进行溢出次数累计,计满20次即到秒计时。从秒到分,从分到时的计时,可通过数值比较实现。流程框图如图3-2所示。 3.设计键盘子程序(KEY)
采用按键扫描法,设计键盘程序。用软件方法解决按键抖动问题。键盘程序框图如图3-3所示。
三、结束语
本系统中还有许多问题存在,由于我刚接触嵌入式系统,对其了解的不是很深,只是在老师原先给的数码管动态显示的那个程序的基础上改的。我并没有用外部中断去实现计时器,而是在主程序中用C语言区实现,在主程序中写还是比较简单的,只是一开始要想好设计思路。
我的设计想法是整个计数在d的循环计数上实现的,所以整个分,秒的计数都是在for循环里实现的。要注意的是,在秒已经完成0-59计数后是要先清零在进位,否则会0分59秒后会直接出现1分59秒,然后再出现1分00秒。后面只要出现进位都要注意这个问题,否则计数系统会出现混乱。到分的0-59计数完成后整个系统要清零。我再编程时还遇到了下面两个问题需要重视。LEDDispA=a;数码管显示要在for循环之前,否则数码管显示也会有点小问题。整个系统只要有一个延时就好了,否则系统在计时时会出现紊乱。
这个课题用外部中断完成会比较好,虽然我也完成了电子钟的实验,但是程序刷新时间会比较长,实际设计中不会采用在主程序内写代码的。我相信通过今后的学习,我会掌握更多的单片机知识,能够让设计的程序更加简洁方便。