150 likes | 325 Views
系统的消息循环实验. 电信学院 嵌入式技术与应用专业. 实验提纲. 1 实验目的 2 实验内容 3 预备知识 4 实验设备 5 实验原理 6 实验思考. 实验目的. 学习使用系统的消息循环。掌握如何通过系统的消息循环来响应键盘任务的消息,同时学会使用图形模式下的液晶屏文字显示函数。. 实验内容. 通过使用消息队列接收键盘任务发出的按键消息,并把对应按键的字符显示在液晶屏和 PC 机的终端上。. 预备知识. 1 、用 ARM ADS1.2 集成开发环境,编写和调试程序的基本过程。 2 、基于 uCOS-II 操作系统的应用程序的框架结构。
E N D
系统的消息循环实验 电信学院 嵌入式技术与应用专业
实验提纲 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定义。应用程序在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.多任务系统中还有哪些机制实现任务间的通信与同步?