2.uCOSII 应用教程
2.1 嵌入式图形系统μC/GUI 移植与应用
该例子程序在ADSP-EDU-uCOSII/code 文件夹下的bf53x_ucgui_source 文件夹中。代码包含了uCOSII 源码和uC/GUI 源码。
2.1.1 程序功能
- 领会μC/GUI 图形系统的模块层次化结构,了解液晶驱动模块,内存设备模块,窗口系统模块,窗口控件模块,反锯齿模块和触摸屏及外围模块等;
- 掌握一些主要控制和功能函数,主要包括文本显示、数值显示、2D 图形库、字体、颜色、存储设备、视窗管理器、窗口对象、对话框、抗锯齿、输入设备、时间函数等;
- 掌握在μC/OS-Ⅱ系统下μC/GUI 图形系统的移植与应用;
- 通过图形界面显示实例来讲述如何在μC/OS-Ⅱ系统中构建μC/GUI 图形用户接口。
- 本程序包含18个μC/GUI的DEMO
2.1.2 实验步骤
1. 将仿真器(ICE)与ADSP-EDU-BF53x 开发板和计算机连接好。
2. 先给ADSP-EDU-BF53x 开发板上电,再为仿真器(ICE)上电。
3. 运行VisualDSP++ 5.0 软件,选择合适的BF533 的session 将仿真器与软件连接。
4. 加载VisualDSP++ 5.0 工程文件BF53x_UCGUI_SOURCE.dpj,编译并全速运行。
5. 观察液晶屏上的显示。
2.1.3 程序说明
打开BF53x_UCGUI_SOURCE.dpj工程,可以在工程结构栏看到这个例程的工程结构(如下图)
- APP 组项:主要包含应用层函数
- BSP 组项:主要包含处理器初始化,硬件模块的驱动函数
- GUI 组项:主要包含GUI处理函数
- GUI _APP 组项:主要包含GUI应用函数,本例程包含了18个GUI DEMO
- UCOS_II 组项:UCOSII源码
在这个例程中我们建立了两个用户任务,一个是UCGUI 界面显示任务,一个是触摸屏任务。再采用一个任务作为初始化时的主任务,用于建立以上的2个用户任务。 根据实时响应的重要程度,将各个任务的优先级经行了设置。
任务名 优先级
APP_TASK_START_PRIO 6 主任务
APP_TASK_USER_IF_PRIO 9 UCGUI 界面显示任务
APP_TASK_KBD_PRIO 8 是触摸屏任务
为了兼顾实时效率及CPU 的负荷。将ucosII 的时钟节拍设置为1ms, ucosII 需要提供周期性信号源,用于实现时间延时和确认超时,时钟节拍的含义就是任务和任务之间最短切换时间。这个节拍也不能设置的非常短,会造成CPU 负荷过大,会造成任务执行兼顾不周。 某些高优先级任务总是在执行,有些低优先级任务得不到执行。 但节拍也不能设置的非常长,这会造成任务执行的实时性变差。 一般10-100ms 就可以了,ucosII 的时钟节拍是由内核定时器定时来完成的。
CoreTimerInit(79, 5000); // 1 mS tick.. Callback is O/S tick function
例程所用到uCosII 中的任务介绍
任务通常是一个无限的循环, 返回参数必须定义为void。 当任务开始执行时,会有一个参数传递给用户任务代码。 uCosII 可以管理64 个任务, 其中系统保留了8 个任务。开放给用户的有56 个任务,每
个任务的优先级都不同, 任务的优先级号越低,任务的优先级越高,在这个版本的uCosII 中,任务的优先级号就是任务编号。
任务的状态一定是以下5 种之一:
- 睡眠态:就是任务没有交给ucosII 调度的,也就是没用经过建立的任务。 只保存在存储器空间里。
- 就绪态:任务一旦建立,任务就进入就绪态。任务可以通过调用OSTasjDel()返回到睡眠态。
- 运行态:任何时刻只能有一个任务处于运行态。
- 等待状态:正在运行的任务可以通过调用以下2 个函数之一,将自身延迟一段时间。 这2 个函数是OSTimeDly()或OSTimeDlyHMSM()。这个任务于是进入等待状态,一直到函数中定义的延迟时间到。
正在运行的任务可能在等待某一事件的发生,可以通过调用以下函数之一实现: OSFlagPend() ,OSSemPend(),OSMutexPend(), OSMboxPend()或OSQPend()。如果某事件并未发生,调用上述函数的任务就进入了等待状态,直到等待的事件发生了。当任务因等待事件被挂起时,下一个优先级最高的就绪任务就得到了CPU 的使用权。当时间发生了或等待延时超时时,被挂起的任务就进入就绪态。 - 中断服务态:正在运行的任务是可以被中断的,被中断的任务于是进入了中断服务态,响应中断时,正在执行的任务被挂起,中断服务程序控制了CPU 的使用权。从中断服务程序返回前,uCosII 要判定被中断的任务是否是目前就绪任务里优先级最高的,如果不是,就执行优先级最高的那个任务。 如果是,就执行被中断的这个任务。
- 消息邮箱:这是uCosII 中的一种通信机制,可以使一个任务或者中断服务程序向另一个任务发送一个指针型的变量,通常该指针指向了一个包含了消息的特定数据结构。 在例程中需要建立邮箱,用到了函数OSMboxCreate(), 串口1 中断服务程序用到了向邮箱发送一则消息的函数OSMboxPost(), 串口接收任务用到了等待邮箱中消息的函数OSMboxPend()。