5). 提供有好的多媒体人机界面。
嵌入式设备能与用户紧密接触,最重要的因素就是它能提供友好的用户界面、图形界面和灵活的控制方式,使得人们感觉嵌入式设备就像一个熟悉的老朋友。这方面的要求使得嵌入式软件设计者要在图形界面,多媒体技术上多下功夫。手写文字输入、语音拨号上网、收发电子邮件以及彩色图形、图像都会使使用者获得自由的感受。目前一些先进的PDA在显示屏幕上也实现汉字输入、短消息语音发布,但一般的嵌入式设备距离这个要求还有很长的路要走。
第三章 系统开发环境与技术
3.1 系统的开发环境
考虑到系统的性能、成本、可靠性等因素,系统的主控芯片选用了台湾Syncmos公司生产的以80C52为内核的8位微控制器SM5964。它具有丰富的片内资源,只需添加少量的外围器件即可满足系统设计的需要。根据上一章中阐述的嵌入式操作系统的选取原则,软件开发平台选用了源代码公开的RTOS ---μC/OS-II。下面对其详细介绍。
3.1.1 SM5964概述
SM5964 微控制器是系统的核心器件,它是80C52 微控制器家族的派生产品,其硬件特征和强大的指令系统使它成为一种性能价格比高的控制器。除具有通用80C52优点之外,其特点如下:
集成度高:它具有丰富的片内资源,包括3个16位定时器、1个看门狗定时器、全双工串口通道等,其PDIP 封装具有32个I/O口而PLCC/QFP封装则具有多达36个I/O口。
存储量大:它内置了64 KB Flash ROM和1 KB RAM。
ISP特性:它具有在系统可编程(ISP)功能,可以通过串口或者并口利用ISP功能实现系统的程序在线修改或升级。片内有多达4KB的存储空间供ISP编程之用。
PWM特性:片上有5路PWM通道可供用户使用。
另外它的主频可以高达40MHz,SM5964处理器的模块图如图3-1所示:
图3-1 SM5964模块图
3.1.2 嵌入式操作系统----μC/OS-II
在进行嵌入式系统设计时,选择适合自己的实时操作系统是至关重要的,我结合具体的应用,考虑开发成本等因素,根据嵌入式操作系统的选取原则并基于μC/OS-II的许多特点,选用了源代码公开的实时操作系统μC/OS-II。
3.1.2.1 μC/OS-II的主要特点
它是由Labrosse先生编写的一个开放式内核,主要特点如下:
公开源代码:源代码全部公开,这样使系统变得透明,很容易就能把操作系统移植的各个不同的硬件平台上,并可根据需要进行扩充。
可移植性:μC/OS-II绝大部分源码是用ANSI C写的,可移植性(Portable)较强。它可以在绝大多数8位、16位、32位甚至64位微处理器、微控制器、数字信号处理器(DSP)上运行。
可固化:μC/OS-II是为嵌入式应用而设计的,可以嵌入到开发者的产品中成为产品的一部分。
可裁减:可以根据具体的应用,对内核进行裁减,其内核最小可达到2KB。
占先式:μC/OS-II完全是占先式(Preemptive)的实时内核,总是运行在就绪条件下优先级最高的任务。大多数商业内核也是占先式的,μC/OS-II在性能上与它们类似。
多任务:μC/OS-II可以管理64个任务,系统本身保留8个,应用程序最多可以有56个任务,赋予每个任务的优先级必须不同。
可确定性:全部μC/OS-II的函数调用与服务的执行时间具有其可确定性。μC/OS-II的系统服务的执行时间不依赖于应用程序任务的多少。
任务栈:每个任务有自己单独的栈,μC/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。使用μC/OS-II的栈空间校验函数,可以确定每个任务到底需要多少栈空间。
系统服务:μC/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请和释放、时间相关函数等。
中断管理:中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。
稳定性与可靠性:μC/OS-II自1992年以来已经有很多成功的商业应用,其稳定性和可靠性都有很好的保证。
3.1.2.2 μC/OS-II 硬件和软件体系结构
μC/OS-II的内核是占先式(Preemptive)内核,即总是让就绪态的高优先级的任务先运行,中断服务程序可以抢占CPU,当中断服务程序完成时,内核让此时优先级最高的任务运行。这样使系统的响应时间得到最优化,而且是可知的。它完成了任务管理、任务间的通信和同步、内存管理、时间管理和中断管理。其硬件和软件体系结构如图3-2所示
图3-2
1).任务的管理
它包括任务的创建、删除、挂起和恢复等。在嵌入式系统中每个任务是一个无限的循环,它看起来像其他C的函数一样,有函数返回类型,有形式参数变量,但是任务是绝不会返回的,故返回参数必须定义为Void。格式如下:
void Task1(void *ppdata)
{
for(;;)
{
/* 用户代码*/
/*调用μC/OS-II的某种系统服务*/
}
}
任务的创建函数如下:
INT8U OSTaskCreate(void (*task)(void *pd),void *ppdata, OS_STK *ptos, INT8U prio);
其中:task是任务代码的指针;ppdata是当任务开始执行时传递给任务的参数指针;ptos是分配给任务的堆栈的栈顶指针;prio是分配给任务的优先级。
任务删除函数为:INT8U OSTaskDel(INT8U prio)。
任务挂起函数为:INT8U OSTaskSuspend (INT8U prio)。
任务恢复函数为:INT8U OSTaskResume (INT8U prio)。
系统中每个任务有挂起、就绪、运行及休眠等状态,各状态之间的转换