嵌入式系统多任务软件设计_第1页
嵌入式系统多任务软件设计_第2页
嵌入式系统多任务软件设计_第3页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章

嵌入式系统多任务软件设计考核要点计等。1

考核知识PC在嵌入式系统设计中一般使用标准的FAT12/16/32文件系统。uC/OS-Ⅱ本身不提供文件系统,不支持文件相关的管理功能,在将uC/OS-Ⅱ操作系统移植到ARM参考YAFFS(YetAnotherFlashFileSystem)文件系统,为该系统扩展了一个简单的文件系统来满足嵌入式产品开发的需要。在系统中要想使用文件系统,首先必须通过initOSFile统,为操作系统的文件缓冲区分配存储空间。函数initOSFile代码如下:voidinitOSFile(){INI8Uerr;pFileMem=OSMemCreate(FileMemPart,10,sizeof(File),&err);if(pFileMem==NULL){Uart_printf(“FailedtocreateFile”);LCD_printf(“FailedtocreateFile”);}代码中OSMemCreate函数为操作系统分配了10个文件缓冲区,其中FILE是一个文件的相关结构体。它的定义为typedefstruct{U8Buffer[BLOCK_SIZE]; //文件缓冲区U32fileblock; //文件当前的簇的位置U32filemode; //打开文件的模式U32filebufnum; ///写入的字节数U32filecurpos; //读写的当前位置U32filesize; //文件的大小}FILE;在Flash存储器中,数据是按照块(Block)存储的。所以,在开辟文件缓冲区时以一个块的大小为单位比较便于管理。其他与文件系统相关的API函数包括:OpenOSFile:以读取或写入的模式打开指定的文件,并创建FILE(FILE)的指针ReadOSFile:读取已经打开的文件到指定的缓冲区,如果成功则返回读取的字节数WriteOSFile:把缓冲区写入指定的文件,如果成功则返回TRUE;否则返回FALSELineReadOSFile:读取指定文件的一行,返回读取文件的字节数CloseOSFile:关闭打开的文件,释放文件缓冲区GetNextFileName:得到文件目录分配表中指定位置的文件名,文件位置自动下移。如果文件有效则返回TRUE;否则返回FALSEListNextFileName:列出当前位置开始第一个指定扩展名的文件,如果没有则返回FALSE2、基于Unicode的汉字字库基于32位嵌入式处理器的硬件平台,有着较高的运算速度和大容量的内存,为人机交互建立GUI是首选的方式。针对常用的图形用户界面建立相应的API函数,主要包括基于Unicode的汉字字库,典型的控件和基本绘图函数Unicode:,Unicode,现了软件的全球化。PC机,而且一般只针对专用系统设计,基本使用的是图形点阵字库。用于Unicode字库显示的相关APIInt2Unicode定义:voidInt2Unicode(intnumber,U16str[]);功能:从int型变量到Unicode字符串的转换参数说明:number:被转换的整型数字str:转换成的Unicode字符串Unicode2Int定义:intUnicode2Int(U16str[])功能:Unicode字符串到int-int型数据参数说明:str:被转换的Unicode字符串strChar2Unicode定义:voidstrChar2Unicode(U16ch2[],constcharch1[]);功能:char类型到Unicode的编码转换参数说明:ch1:转换成的Unicodech2:被转换的Char字符串UstrCpy定义:voidUstrCpy(U16ch1[],U16ch2[]);功能:字符串复制参数说明:ch1:目标字符串ch2:源字符串3、基本绘图函数uCOS-II系统环境下,绘图必须通过使用绘图设备上下文来实现。绘图设备上下文中包括了与绘图相关的信息,比如:画笔的宽绘图才不会互相影响。绘图设备上下文的结构定义如下:typedefstruct{intDrawPointx;intDrawPointy;//绘图所使用的坐标点intPenWidth;//画笔宽度U32PenMode;//画笔模式COLORREFPenColor;//画笔的颜色intDrawOrgx;//绘图的坐标原点位置intDrawOrgy;intWndOrgx;//绘图的窗口坐标位置intWndOrgy;intDrawRangex;//绘图的区域范围intDrawRangey;structRECTDrawRect;//绘图的有效范围U8bUpdataBuffer;//是否更新后台缓冲区及显示U32Fontcolor;//字符颜色}DC,*PDC与绘图设备上下文DCDC动态内存开辟空间;CreateDC()和DestoryDC(PDCDC,DCDC的内存空间。的图形函数。10-1所示。读者将学习使用嵌入式系统的绘图API(DC)在多任务操作系统中的作用。会使用绘图设备上下文(DC)在屏幕上绘制一个圆角矩形和一个圆。理解绘制防止闪烁的基本原理,可以实现无闪烁的动画。下面结合代码介绍其实现过程。图10-1绘制图形在μC/OS-II操作系统中,液晶显示屏的刷新是通过Lcd_Fresh_Task任务完成的,该任务是在系统附加任务初始化函数中定义的,该函数开辟了LCD(也可以通过设置绘图设备上下文参数,不让系统自动刷新)向Lcd_Fresh_Task发送更新信息。其流程10-2所示。图10-2绘图流程(推荐用200),同时使Main_Task任务主动让出对CPU的控制权。使Lcd_Fresh_Task任务可以完成刷新。其源代码如下:/*****************Main_Test_Task的定义*****************/voidMain_Task(void*Id){intoldx,oldy; */PDCpdc; 定义绘图设备上下文结intx,y; 坐标*/doubleoffset=0; 坐标偏移量*/ClearScreen(); 清屏*/pdc=CreateDC(); */SetDrawOrg(pdc,LCDWIDTH/2,LCDHEIGHT/2,&oldx,&/*设置绘图原点为屏幕中心*/Circle(pdc,0,0,50); 画圆*/MoveTo(pdc,-50,-50); 移动*/LineTo(pdc,50,-50); 画线*/ArcTo(pdc,80,-20,TRUE,30); 画弧*/LineTo(pdc,80,20);ArcTo(pdc,50,50,TRUE,30);LineTo(pdc,-50,50);ArcTo(pdc,-80,20,TRUE,30);LineTo(pdc,-80,-20);ArcTo(pdc,-50,-50,TRUE,30);OSTimeDly(3000); 秒ClearScreen();SetDrawOrg(pdc,0,LCDHEIGHT/2,&oldx,&oldy);设置绘图原点为屏幕左边中for(;;) 消息循环*/{MoveTo(pdc,0,0);for(x=0;x<LCDWIDTH;x++){y=(int)(50*sin(((double)x)/20.0+offset));画正弦波LineTo(pdc,x,y);}offset+=1;if(offset>=2*3.14)offset=0;OSTimeDly(1000);ClearScreen();}DestoryDC(pdc); */}本程序中应注意如下几点:⑴绘图必须通过使用绘图设备上下文(DC)来实现。绘图设备上下文(DC)中包括了与绘图相关的信息,例如,画笔的宽度、绘图的原点等。这样,在多任务系统中,不同的任务通过不同的绘图设备上下文(DC)绘图才不会互相影响。⑵绘制整圆可以用Circle函数,绘制直线用Line函数,绘制圆弧用ArcTo函数。调试的过程中可以在每个绘图函数之后调用OSTimeDly上。⑶为方便绘图,可使用SetDrawOrg函数设置绘图的原点。⑷因为本次实验不用系统的字符显示,所以,可以去掉Main()函数中的LoadFont()函数,以节省系统启动的时间。4、列表框控件APIuCOS-IIAPI函数。initOSCtrl(API函数有:SetWndCtrlFocus()函数设置窗口中指定ID的控件为焦点控件,返回原来焦点控件的ID;GetWndCtrlFocus()函数获取当前焦点控件的ID。ReDrawOSCtrl()函数重画所有的系统可见控件,当由于某原因清屏后必须重画控件。GetCtrlfromID()函数从指定ID的控件获取该控件的指针。SetCtrlMessageCallBk()函数设置指定控件的消息回调函数,程序中收到发给该控件的消息后可以调用其消息回调函数。OSOnSysMessage()函数是系统的消息处理函数,程序中收到消息后可以用该函数将其传送给控件。下面是列表框控件的结构定义:typedefstruct{U32CtrlType;//控件的类型U32CtrlID;//列表框控件的IDstructRECTListCtrlRect;//列表框的位置和大小structRECTClientRect;//列表框列表区域U32FontSize;//列表框字体大小U32style;//列表框的风格U8bVisible;//是否可见PWndparentWnd;//控件的父窗口指针U8(*CtrlMsgCallBk)(void*);//列表框控件的消息回调函数U16**pListText;//列表框所容纳的文本指针intListMaxNum;//列表框所容纳的最大文本的行数intListNum;//列表框所容纳的文本的行数intListShowNum;//列表框所能显示的文本行数intCurrentHead;//列表的表头号intCurrentSel;//当前选中的列表项号structRECTListCtrlRollRect;//列表框滚动条方框structRECTRollBlockRect;//列表框滚动条滑块方框}ListCtrl,*PListCtrlCreateListCtrl(SetWndCtrlFocus(一的IDAddStringListCtrl()函数向该列表框中添加表项了。5、文本框控件文本框控件也是系统的一个基本控件,其结构定义如下:typedefstruct{U32CtrlType;//控件的类型U32CtrlID;//控件的IDstructRECTTextCtrlRect;//文本框的位置和大小structRECTClientRect;//客户区域U32FontSize;//文本框的字符大小U32style;//文本框的风格U8bVisible;//是否可见PWndparentWnd;//控件的父窗口指针U8(*CtrlMsgCallBk)(void*);//文本框控件的消息回调函数U8bIsEdit;//文本框是否处于编辑状态char*KeyTable;//文本框的字符映射表U16text[40];//文本框中的字符块}TextCtrl,*PTextCtrlCreateTextCtrl(IDSetTextCtrlText(Unicode文本添加到文本框中,而GetTextCtrlText()函数用来获取文本框中字符串的指针。用SetTextCtrlEdit(以响应键盘消息,通过键盘输入文字。6、消息循环通常在多任务操作系统中,任务之间的通讯是通过发送消息来实现的。消息队列是uCOS-IIuCOS-II操作系统提供了若干对消息队列进行操作的函数,例如OS_Q.C中。但是,在将uCOS-II移植到本ARM嵌入式开发平台时,对消息队列相关函数又作了提高,使得程序中对消息队列的使OSCreateMessage()函数为某个控件创建消息,用SendMessage(WaitMessage()函数等待消息,用DeleteMessage()函数删除消息。消息的数据结构定义如下:typedefstruct{POS_CtrlpOSCtrl;//消息所发到的窗口(控件),为NULL时指桌面U32Message;//消息类型U32WParam;//消息参数U32LParam;//消息参数}OSMSG,*POSMSG;下面是平台的基本消息类型定义:#defineOSM_KEY1//键盘消息#defineOSM_TOUCH_SCREEN2//触摸屏消息#defineOSM_SERIAL100//串口收到数据的消息#defineOSM_LISTCTRL_SELCHANGE1001//列表框的选择被改变的消息#defineOSM_LISTCTRL_SELDBCLICK1002//列表框的选择双击消息#defineOSM_BUTTON_CLICK1003//单击按钮消息下面是各基本消息类型的参数说明:MessageWParamLParamOSM_KEY键盘扫描码OSM_TOUCH_SCREEN低16位=x高16位=y坐标值坐标值触摸动作OSM_LISTCTRL_SELCHANGECtrlIDCurrentSelOSM_LISTCTRL_SELDBCLICKCtrlIDCurrentSelOSM_BUTTON_CLICKCtrlIDpMsg->Message=OSM_KEYpMsg->WParam则是按键的键码(pMsg是指向该消息结构体的指针)。键盘消息是由键盘扫描任务(voidKey_Scan_Task(void*Id))创建并发送到系统的消息队列,键盘扫描任务用函数KeyBoard_Read()从IIC的数据收发移位寄存器中获得键盘扫描码,这个扫描码是由ATMEGA8当有键盘按下时发送到IIC的数据收发移位寄存器的。主任务由消息队列中得到消息。staticvoidKey_Scan_Task(void*Id){U32key;INT8Uerr;POSMSGpmsg;printk("beginkeytask\n");for(;;){OS_FLAGSflag;flag=OSFlagPend(Input_Flag,UCOS2_KBINPUT,OS_FLAG_WAIT_SET_ANY,0,&err);OSFlagPost(Input_Flag,flag,OS_FLAG_CLR,&err);key=KeyBoard_Read(0,FALSE);if(key==-1)continue;pmsg=OSCreateMessage(NULL,OSM_KEY,key,0);if(pmsg)SendMessage(pmsg);}}Main_TaskTextOut(),实际是通过在图形方式下绘图完成文字显示的。此函

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论