Transcript Document

系统的消息循环实验
电信学院 嵌入式技术与应用专业
实验提纲
1 实验目的
2 实验内容
3 预备知识
4 实验设备
5 实验原理
6 实验思考
嵌入式技术与应用专业教学资源库
实验目的
学习使用系统的消息循环。掌握如何通过
系统的消息循环来响应键盘任务的消息,
同时学会使用图形模式下的液晶屏文字显
示函数。
嵌入式技术与应用专业教学资源库
实验内容
通过使用消息队列接收键盘任务发出的按
键消息,并把对应按键的字符显示在液晶
屏和PC机的终端上。
嵌入式技术与应用专业教学资源库
预备知识
1、用ARM ADS1.2集成开发环境,编写和
调试程序的基本过程。
2、基于uCOS-II操作系统的应用程序的框
架结构。
3、操作系统的绘图API函数和绘图设备上
下文(DC)的使用。
嵌入式技术与应用专业教学资源库
实验设备及工具(包括软件调试工具)
硬件:ARM嵌入式开发平台、用于
ARM920T的JTAG仿真器、PC机
Pentium100以上。
软件:PC机操作系统Win2000或WinXP、
ARM ADS1.2集成开发环境、仿真器驱动程
序、超级终端通讯程序、SourceInsight。
嵌入式技术与应用专业教学资源库
基础知识
 通常在多任务操作系统中,任务之间的通讯是通过发送消
息来实现的。消息队列是uCOS-II操作系统的一种通信机
制,它可以使一个任务或者中断服务程序向另一个任务发
送以指针方式定义的变量。uCOS-II操作系统提供了若干
对消息队列进行操作的函数,例如OSQCreate(),
OSQPend(),OSQPost()等,都定义在OS_Q.C中。
 但是,在将uCOS-II移植到本ARM嵌入式开发平台时,对
消息队列相关函数又作了提高,使得程序中对消息队列的
使用变得更加简单易行。请参考附录API函数系统消息部
分,开发平台的消息队列相关函数定义在OSMessage.h
中。程序中可以用OSCreateMessage()函数为某个控件创
建消息,用SendMessage()函数将该消息发送到消息队列
中,用WaitMessage()函数等待消息,用DeleteMessage()
函数删除消息。
嵌入式技术与应用专业教学资源库
消息的数据结构
typedef struct {
POS_Ctrl pOSCtrl; //消息所发的窗口
(控件),为NULL时指桌面
U32 Message;
//消息类型
U32 WParam;
//消息参数
U32 LParam;
//消息参数
}OSMSG, *POSMSG;
嵌入式技术与应用专业教学资源库
平台的基本消息类型定义




#define OSM_KEY 1
//键盘消息
#define OSM_TOUCH_SCREEN
2
//触摸屏消息
#define OSM_SERIAL
100
//串口收到数据的消息
#define OSM_LISTCTRL_SELCHANGE 1001
//列表框的选择被改变的消息
 #define OSM_LISTCTRL_SELDBCLICK 1002
//列表框的选择双击消息
 #define OSM_BUTTON_CLICK
1003 //单击按钮消息
嵌入式技术与应用专业教学资源库
控件的使用
 对于键盘消息来说其类型pMsg->Message=OSM_KEY,参数pMsg>WParam则是按键的键码(pMsg是指向该消息结构体的指针)。键
盘消息是由键盘扫描任务(void Key_Scan_Task(void *Id))创建并发
送到系统的消息队列,键盘扫描任务用函数KeyBoard_Read()从IIC的
数据收发移位寄存器中获得键盘扫描码,这个扫描码是由ATMEGA8
当有键盘按下时发送到IIC的数据收发移位寄存器的。主任务由消息队
列中得到消息。
 所谓的系统消息循环如下图所示 :
嵌入式技术与应用专业教学资源库
 应用程序在Main_Task任务中等待消息,并对该
消息进行判断和处理,如果是键盘消息则提取出
键码,变换为对应字符,然后将其显示到液晶屏
上。在图形模式下,液晶屏的文字输出函数是
TextOut(),实际是通过在图形方式下绘图完成文
字显示的。此函数输出的字符数组必须是基于双
字节Unicode编码的。在程序中可以使用
Int2Unicode()和strChar2Unicode()两个函数分别
将整形数或ASCII字符转换为Unicode字符串。这
部分内容请参考附录API函数,在Ustring.h定义。
嵌入式技术与应用专业教学资源库
实验步骤
 1、编辑Main_Task任务中的代码,理解如何实现
消息循环。即:等待消息、处理(响应)消息、
删除消息。
 提示:
1)使用WaitMessage(0)接收消息,通常等待时间设置
为无限长。
2)系统的消息循环是一个无限循环。
3)收到消息以后(即WaitMessage()函数返回后),
通过判断消息结构中Message成员来判断消息类型。
如果是键盘消息,则Message的值为OSM_KEY,
WParam参数存储的是按键的键码,LParam参数存储
的是同时按下的功能键(如果没有,则为0)。
4)开始等待下一条消息之前必须使用DeleteMessage
删除消息,释放系统的内存空间。
嵌入式技术与应用专业教学资源库
实验步骤
2、编写键盘消息响应函数onKey(),处理
键盘的消息。当有键盘消息收到的时候,
把按键字符显示在液晶屏上,同时,发送
给PC机的终端。
3、生成发行版本的.bin文件,通过串口下
载到嵌入式开发板中,运行并检查输出结
果。
嵌入式技术与应用专业教学资源库
函数用法说明(onkey()函数中的函数)
 ClearScreen(void)
//清屏
 PDC CreateDC(void) //创建画笔
 strChar2(U16 *,U8 *) //将字符串转化为Unicode
类型字符
 void TextOut(PDC pdc, int x, int y, U16 *s, U8
bunicode, U8 fnt)
//向LCD屏幕输出转化的字
符串s(字符以0结束,和printf()函数类似),输出开
始坐标(x,y),bnunicode 标志位,fnt 字体大小,可
取值FONTSIZE_SMALL , FONTSIZE_MIDDLE ,
FONTSIZE_BIG
嵌入式技术与应用专业教学资源库
思考题
1.怎样通过消息循环实现两个用户任务之
间的同步?
2.多任务系统中还有哪些机制实现任务间
的通信与同步?
嵌入式技术与应用专业教学资源库