北航实验报告实验实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三UC-OS移植实验
一、实验目的
在内核移植了uCOS-II 的处理器上创建任务。
二、实验内容
1.运行实验十,在超级终端上观察四个任务的切换。
2. 任务1~3,每个控制“红”、“绿”、“蓝”一种颜色的显示,适当增加OSTimeDly()的时间,且优先级高的任务延时时间加长,以便看清三种颜色。
3.引入一个全局变量 BOOLEAN ac_key,解决完整刷屏问题。
4. #define rUTRSTAT0 (*(volatile unsigned *)0x)
#define RdURXH0()(*(volatile unsigned char *)0x)
当键盘有输入时在超级终端上显示相应的字符。
三、实验设备
硬件:ARM嵌入式开发平台、用于ARM920T的JTAG仿真器、PC机Pentium100以上。
软件:PC机操作系统Win2000或WinXP、ARM 集成开发环境、仿真器驱动程序、超级终端通讯程序。
四、实验原理
所谓移植,指的是一个操作系统可以在某个微处理器或者微控制器上运行。
虽然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目录下的和src目录下的拷到模板下的相应目录,将加入工程中。
2包含以下头文件#include “inc/”。
3改文件中包含头文件的路径。
#include "../inc/drv/"
4 声明引用的变量 extern U32 LCDBufferII2[LCDHEIGHT][LCDWIDTH];
六、源程序
#include"../ucos-ii/" /* uC/OS interface */
#include "../ucos-ii/add/"
#include "../inc/"
#include "../inc/sys/"
#include "../src/gui/"
#include "../inc/"
#include <>
#include <>
inc/"
.\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对共享资源管理有何意义
答:设置标志位,进入任务以后,判断标志位,通过,进行刷屏操作,全部显示完成后,标志位置位。
允许其他任务执行。
总之,它能解决不能完整刷屏问题。