文档详情

嵌入式系统实验二

M****1
实名认证
店铺
DOCX
84.37KB
约15页
文档ID:485245967
嵌入式系统实验二_第1页
1/15

实验二 嵌入式操作系统程序设计班级:0810805 姓名:谭 明 李 学号:08200515一、实验目的1. 了解卩C/OS-II内核的主要结构2. 掌握卩C/OS-II程序设计的基本方法3. 学习使用嵌入式系统绘图的API函数理解绘图设备上下文(DC)在多任务操作系 统中的作用会使用绘图设备上下文(DC)在屏幕上绘制一个圆角矩形和一个圆 了解绘制动画防止闪烁的基本原理,可以实现无闪烁的动画4. 学习使用系统的消息循环掌握如何通过系统的消息循环来响应键盘任务的消息, 同时学会使用图形模式下的液晶屏文字显示函数二、实验内容1. 学习卩C/OS-II的编程方法2. 编写几个简单任务,在超级终端上观察任务的切换3. 通过使用嵌入式系统的绘图API函数,首先,在屏幕上绘制一个圆角矩形和一个整 圆然后,再在屏幕上无闪烁的绘制一个移动的正弦波4. 通过使用消息队列接收键盘任务发出的按键消息,并把对应按键的字符显示在液晶 屏和PC机的终端上三、预备知识1. 掌握在ADS1.2集成开发环境中编写和调试程序的基本过程2. 了解ARM7处理器的结构3. 了解卩C/OS-II系统结构四、实验设备及工具硬件:ARM嵌入式开发平台、用于ARM7TDMI的J TAG仿真器、PC机。

软件:PC机操作系Win2000、ADS1.2集成开发环境、仿真器驱动程序、超级终端通 讯程序五、实验原理(—)pC/OS-II程序编写基础为了使pC/OS-II可以正常运行,硬件初始化和配置文件也是必须的STARTUP目录 下的文件还包括中断处理,时钟,串口通信等基本功能函数在文件main.c中给出了应用 程序的基本框架,包括初始化和多任务的创建,启动等在pC/OS-II中创建一个任务的步骤如下:1)在程序开头定义任务堆栈,任务函数声明和任务优先级:OS_STK TaskName_Stack[STACKSIZE]={0, }; //任务堆栈void TaskName(void *Id); //任务函数 #define TaskName_Prio N //任务优先级2 )在皿ain ()函数中调用OSStart ()函数之前用下列语句创建任务: OSTaskCreate(TaskName,(void*)0,(OS_STK*)&TaskName_Stack[STACKSIZE-1], TaskName_Prio);OSTaskCreate()函数的原型是:INT8U OSTaskCreate (void (*task)(void *pd), void *p_arg, OS_STK *ptos,INT8U prio);需要将任务函数TaskName,任务堆栈TaskName_Stack,任务优先级TaskName_Prio三 个参数传给OSTaskCreate()函数。

根据任务函数的内容决定堆栈大小,宏STACKSIZE定义 为4KB,可以在此基数上乘倍任务优先级越高,TaskName_Prio值越小;卩C/OS-II可以 管理64个任务,由OSInit()创建的空闲任务的优先级最低为63; pC/OS-II保留4个最高和4 个最低优先级,用户任务可以使用其余56 个优先级值3)编写任务函数内容:void TaskName(void *Id){//添入任务初始化语句for(;;){ // 添入任务循环内容OSTimeDly(SusPendTime);//挂起一定时间,以使其他任务可以占用CPU}}卩C/OS-II至少要有一个任务,这里首先创建一个系统任务SYS_Task,其中由语句 OSRunning=TRUE; //使能(1C/OS-II 运行uHALr_InstallSystemTimer(); 启动系统时钟和多任务切换为了验证卩C/OS-II多任务切换的进行,再编写两个简单的任务,分别在超级终端上输出run taskl和run task2可以参考main.c的结构创建多个不同功能的任务,观察个任务的切换二)完善的pC/OS-II开发框架需要说明的是, pC/OS-I 作为一个实时操作系统只提供了多任务调度等基本功能,这 在实际应用中显然是不够的。

除了移植好的操作系统内核部分,还必须有文件系统,全部硬 件的驱动程序,图形API,控件函数,综合提高的消息函数以及几个系统必须的基本任务, 象键盘,触摸屏, LCD 刷新等有了这些, pC/OS-I 才能实现复杂的功能特殊需求的 地方还需要像USB通信协议,TCP/IP协议等更复杂的软件模块实验系统提供的pC/OS-II库文件中包含了上述大部分功能,基于库的开发变的非常简 单,在基本的程序框架下应用实验系统提供的丰富API函数即可实际开发中,用户的工 程中无需包括pC/OS-II的源代码,只需要包括库文件即可当然,用户也可以了解库中部 分代码的源文件,可以根据自己的需求就行重新编译,也可以对自己的一系列源文件生成一 个专门的库,方便自己后续工作pC/OS-II的开发中,应用程序和操作系统是绑在一起编译的,所生成的system.bin文 件是唯一的可执行文件,其中包括了所需要的LiC/OS-II代码和被用到的驱动程序等函数代 码,以及应用程序的代码system.bin文件是存放在平台的16M FLASH中的,在系统启动 时由BIOS依靠文件系统从FLASH中读入到SDRAM中,然后把控制转移到该代码上,完 成所谓的引导。

而BIOS是存储在另外的ROM中的本实验提供了基于库的lC/OS-II开发框架,可以打开工程进行了解图3-3是ADS环 境下看到的该框架的文件组成,还可以展开各目录查看更多的文件信息可以看出,STARTUP下的都是最基本的硬件初始化和配置文件;Ucos」ib.a是ADS环 境下的库;SRC是用户编写的工程文件;lC/OS-II下都是系统用到的头文件,其中ADD下 是添加的基本系统任务和消息函数的相关头文件 INC 下主要是硬件驱动程序的头文件 Init下的几个文件是ADS环境下配置存储器及堆栈的,和pC/OS-II无直接关系打开Main.c文件,可以看到一个应用工程的基本框架,在这个实验中,所谓的应用很 简单,就是在LCD上显示“Hello world!”大部分代码都是框架用户可以在这些代码的 基础上进行应用开发,创建新任务,编写必要的函数当然,如果针对特定的项目有相对独 立并集中的一些函数则最好新建源文件和头文件,以方便管理,这些用户新建的源文件可以 放到SRC目录下,在编译环境下用Add Files命令加入对应位置下面是Main ()函数中的内容:int main(void){ARMTargetInit(); //开发板初始化 OSInit(); //操作系统初始化 uHALr_ResetMMU(); //复位 MMU LCD_Init(); //初始化LCD 模块 LCD_printf("LCD initialization is OK\n");//向液晶屏输出数据 initOSGUI(); //初始化图形界面LoadFont(); //调Unicode 字库LoadConfigSys(); //使用config.sys文件配置系统设置LCD_printf("Create task on yC/OS-II ...\n");OSTaskCreate(Main_Task, (void *)0, (OS_STK *)&Main_Stack[STACKSIZE*8-1], Main_Task_Prio); // 创建系统任务OSAddTask_Init(); //创建系统附加任务LCD_printf("Starting yC/OS-I ...\n");LCD_printf("Entering graph mode...\n");LCD_ChangeMode(DspGraMode); //变LCD 显示模式为图形模式InitRtc(); // 初始化系统时钟Nand_Rw_Sem=0SSemCreate(1); //创建Nand-Flash读写控制权旗语,初值为1满足互斥 条件OSStart();//操作系统任务调度开始//不会执行到这里return 0;}main()函数中调用了必要的初始化函数,创建了系统任务和用户任务,然后启动系统任 务调度。

建议用户不要改动该函数中的初始化过程,但可以按本实验第一部分所述的任务创 建方法来创建更多的任务,注意每个任务必须具有不同的优先级三)绘图的API函数请查阅附录API函数,在Display.h中定义了和绘图显示有关的数据类型和函数原型 在卩C/OS-II系统环境下,绘图必须通过使用绘图设备上下文(DC)来实现绘图设备上下 文(DC)中包括了与绘图相关的信息,比如:画笔的宽度、绘图的原点等等这样,在多 任务系统中,不同的任务通过不同的绘图设备上下文(DC)绘图才不会互相影响绘图设 备上下文(DC)的结构定义如下:typedef struct{int DrawPointx;int DrawPointy; //绘图所使用的坐标点int PenWidth; //画笔宽度U32 PenMode; //画笔模式COLORREF PenColor; //画笔的颜色int DrawOrgx; //绘图的坐标原点位置 int DrawOrgy;int WndOrgx; //绘图的窗口坐标位置int WndOrgy;int DrawRangex; //绘图的区域范围int DrawRangey;structRECT DrawRect; //绘图的有效范围U8 bUpdataBuffer; //是否更新后台缓冲区及显示U32 Fontcolor; //字符颜色 }DC,*PDC与绘图设备上下文(DC)有关的函数有:initOSDC()用来初始化系统的DC,为DC动 态内存开辟空间;CreateDC()和DestoryDC(PDC pdc)分别用来创建和删除DC,前者返回所创 建的DC指针,后者则释放DC的内存空间。

和绘图有关的函数有TextOut(), LineTo(), FillRect(), CircleShowBmp()等常见的图 形函数,用户可以查看附录API函数显示部分,尝试使用这些函数在卩C/OS-II操作系统中,液晶显示屏的刷新是通过Lcd_Fresh_Task任务完成的,该任 务是在系统附加任务初始化函数OSAddTask_Init()中定义的,该函数开辟了LCD刷新任务, 触摸屏任务,键盘任务等绘图首先是在绘图缓冲区中完成的,然后系统自动(也可以通过 设置绘图设备上下文参数,不让系统自动刷新)向Lcd_Fresh_Task发送更新消息其流程 图如图 4-1所示:图4-1 绘图流程因为绘图是在后台进行的,绘制完成之后,再更新到液晶屏上,所以,在绘图的时候不 用担心反覆的擦除屏幕会引起屏幕的闪烁,这样,可以很方便的实现动画无闪烁的显示绘 制完一次图形以后,必须要使用OSTimeDly()给出一定时间的延时(推荐用200),同时使 Main_Task任务主动让出对CPU的控制权,使Lcd_Fresh_Task任务可以完成刷新 (四)图形系统的消息循环通常在多任务操作系统中,任务之间的通讯是通过发送消息来实现的。

消息队列是 卩C/OS-II操作系统的一种通信机制,它可以使一个任务或者中断服务程序向另一个任务发 送以指针方式定义的变量卩C/OS-II操作系统提供了若干对消息队列进行操作的函数,例 如0SQCre。

下载提示
相似文档
正为您匹配相似的精品文档