当前位置:文档之家› 北航实验报告实验实验

北航实验报告实验实验

实验三UC-OS移植实验一、实验目的在内核移植了uCOS-II 的处理器上创建任务。

二、实验内容1.运行实验十,在超级终端上观察四个任务的切换。

2. 任务1~3,每个控制“红”、“绿”、“蓝”一种颜色的显示,适当增加OSTimeDly()的时间,且优先级高的任务延时时间加长,以便看清三种颜色。

3.引入一个全局变量BOOLEAN ac_key,解决完整刷屏问题。

4. #define rUTRSTAT0 (*(volatile unsigned *)0x50000010)#define RdURXH0()(*(volatile unsigned char *)0x50000024)当键盘有输入时在超级终端上显示相应的字符。

三、实验设备硬件:ARM嵌入式开发平台、用于ARM920T的JTAG仿真器、PC机Pentium100以上。

软件:PC机操作系统Win2000或WinXP、ARM ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序。

四、实验原理所谓移植,指的是一个操作系统可以在某个微处理器或者微控制器上运行。

虽然uCOS-II的大部分源代码是用C语言写成的,仍需要用C语言和汇编语言完成一些与处理器相关的代码。

比如:uCOS-II在读写处理器、寄存器时只能通过汇编语言来实现。

因为uCOS-II在设计的时候就己经充分考虑了可移植性,所以,uCOS-II的移植还是比较容易的。

要使uCOS一工工可以正常工作,处理器必须满足以下要求:1)处理器的C编译器能产生可重入代码。

2)在程序中可以打开或者关闭中断。

3)处理器支持中断,并A能产生定时中断(通常在10Hz}1000Hz之间)。

4)处理器支持能够容纳一定量数据的硬件堆栈。

5)处理器有将堆栈指针和其它CPU寄存器存储和读出到堆栈(或者内存)的指令。

uCOS-II进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。

所以,寄存器的入栈和出栈是uCOS一工工多任务调度的基础。

五、实验步骤1 以实验十为模板,将实验六inc目录下的LCD320.H 和src目录下的LCD640.C 拷到模板下的相应目录,将LCD640.C加入工程中。

2包含以下头文件#include “inc/lcd320.h”。

3改LCD640.C 文件中包含头文件的路径。

#include "../inc/drv/reg2410.h"4 声明引用的变量extern U32 LCDBufferII2[LCDHEIGHT][LCDWIDTH];六、源程序#include"../ucos-ii/includes.h" /* uC/OS interface */#include "../ucos-ii/add/osaddition.h"#include "../inc/drivers.h"#include "../inc/sys/lib.h"#include "../src/gui/gui.h"#include "../inc/lcd320.h"#include <string.h>#include <stdio.h>//#include "..inc/lcd320.h"//#pragma import(__use_no_semihosting_swi) // ensure no functions that use semihostingOS_EVENT *MboxSem;///******************任务定义***************////*OS_STK SYS_Task_Stack[STACKSIZE]= {0, }; //system task刷新任务堆栈#define SYS_Task_Prio 1void SYS_Task(void *Id);*/OS_STK task1_Stack[STACKSIZE]={0, }; //Main_Test_Task堆栈void Task1(void *Id); //Main_Test_Task#define Task1_Prio 12OS_STK task2_Stack[STACKSIZE]={0, }; //test_Test_Task堆栈void Task2(void *Id); //test_Test_Task#define Task2_Prio 15OS_STK task3_Stack[STACKSIZE]={0, }; //test_Test_Task堆栈void Task3(void *Id); //test_Test_Task#define Task3_Prio 17OS_STK task4_Stack[STACKSIZE]={0, }; //test_Test_Task堆栈void Task4(void *Id); //test_Test_Task#define Task4_Prio 10extern U32 LCDBufferII2[LCDHEIGHT][LCDWIDTH];extern BOOLEAN ac_key=1;int k,j;#define rUTRSTAT0 (*(volatile unsigned *)0x50000010)#define RdURXH0() (*(volatile unsigned char *)0x50000024)/**************已经定义的OS任务*************#define SYS_Task_Prio 1#define Touch_Screen_Task_Prio 9#define Main_Task_Prio 12#define Key_Scan_Task_Prio 58#define Lcd_Fresh_prio 59#define Led_Flash_Prio 60***************************************////////////*****************事件定义*****************////////////////////////////////////////////////////////// Main function. //////////////////////////////////////////////////////int main(void){ARMTargetInit(); // do target (uHAL based ARM system) initialisation //OSInit(); // needed by uC/OS-II //LCD_Init();//OSTaskCreate(SYS_Task, (void *)0, (OS_STK *)&SYS_Task_Stack[STACKSIZE-1], SYS_Task_Prio);OSTaskCreate(Task1, (void *)0, (OS_STK *)&task1_Stack[STACKSIZE-1], Task1_Prio);OSTaskCreate(Task2, (void *)0, (OS_STK *)&task2_Stack[STACKSIZE-1], Task2_Prio);OSTaskCreate(Task3, (void *)0, (OS_STK *)&task3_Stack[STACKSIZE-1], Task3_Prio);OSTaskCreate(Task4, (void *)0, (OS_STK *)&task4_Stack[STACKSIZE-1], Task4_Prio);OSAddTask_Init(0);BSPprintf(0,"Starting uCOS-II...\n");OSStart(); // start the OS //// never reached //return 0;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////void Task1(void *Id){for(;;){ if(ac_key==1){ ac_key=0;BSPprintf(0,"RED%\n\n");for (k=0;k<480;k++)for (j=0;j<640;j++)LCDBufferII2[k][j]=0x000000ff;LCD_Refresh();OSTimeDly(10000);ac_key=1;}}}void Task2(void *Id){for(;;){ if(ac_key==1){ ac_key=0;BSPprintf(0,"GREEN%\n\n");for (k=0;k<480;k++)for (j=0;j<640;j++)LCDBufferII2[k][j]=0x0000fc00;LCD_Refresh();ac_key=1;OSTimeDly(8000);}}}void Task3(void *Id){for(;;){ if(ac_key==1){ ac_key=0;BSPprintf(0,"BLUE%\n\n");for (k=0;k<480;k++)for (j=0;j<640;j++)LCDBufferII2[k][j]=0x00f80000;LCD_Refresh();ac_key=1;OSTimeDly(6000);}}}void Task4(void *Id){char s;for(;;){ac_key=0;if (rUTRSTAT0 & 1){s=RdURXH0();OSTimeDly(100);BSPprintf(0,"%c\n\n",s);}ac_key=1;OSTimeDly(100);}}七、实验思考题1、如何提高键盘的响应速度?答:提高优先级,减少延时时间。

2、全局变量ac_key对共享资源管理有何意义?答:设置标志位,进入任务以后,判断标志位,通过,进行刷屏操作,全部显示完成后,标志位置位。

相关主题