UCOSII操作系统实验教程
- 格式:pdf
- 大小:513.23 KB
- 文档页数:57
实验2任务就绪表
1实验目的
掌握任务就绪表及任务就绪组的结构及二者之间的关系,系统需要一个就绪登记表,它登记系统中所有处于就绪状态的任务,这个就绪表就是一个位图,系统中的每个任务都在这个位图中占据一个二进制位,该位的状态(1或0)就表示任务是否处于就绪状态。
为了便于对就绪表的查找,系统又定义了一个数据类型为INT8U的变量OSRdyGrp,并使该变量的每一位都对应于OSRdyTbl[]的一个任务组,如果任务组中有就绪任务,则在变量OSRdyGrp里把该任务组所对应的位置1。
理解基于优先级调度的嵌入式实时操作系统的实现策略。
2实验内容
变量定义如下:
INT8U OSRdyGrp=0;
INT8U OSRdyTbl[8]={0};
INT8U OSMapTbl[8]={1,2,4,8,16,32,64,128};
INT8U OSUnMapTbl[256]={0};
INT8U x,y,OSPrioHighRdy,prio;
(1)编程对OSUnMapTbl数组进行初始化;
(2)输入多个任务的优先级prio,修改OSRdyGrp、OSRdyTbl的值并输出;
(3)根据OSRdyGrp、OSRdyTbl的值,求最高优先级任务的优先级OSPrioHighRdy并输出;
3实验代码(要求有注释)
4实验结果(截图)
5心得体会(不少于200字)
1。
实验 3 任务的创建、挂起与恢复课程名称:嵌入式操作系统 B1、实验目的理解任务管理的基本原理,了解任务的各个基本状态及其转换过程;掌握µC/OS-II 中任务管理的基本方法(创建、启动、挂起、恢复任务);熟练使用µC/OS-II 任务管理的基本系统调用。
理解任务的创建、挂起与恢复的原理及功能,掌握任务创建、挂起与恢复的实现过程。
2、实验内容(1)设计 Task0、Task1 两个任务:任务 Task0 不断地挂起自己,再被任务 Task1 解挂,两个任务不断地切换执行,并输出两个任务在各个时刻的状态。
Task0 的主要功能是显示 Task1 的状态,Task1 的主要功能是显示 Task0 的状态。
整个应用的运行流程如图 1 所示,其描述如下:在 main 函数创建起始任务 TaskStart,其优先级为 0。
TaskStart 任务主要完成创建 2 个应用任务 Task0、Task1,并挂起自己(不再被其它任务唤醒)。
之后整个系统的运行流程如下:t1 时刻,Task0 开始执行,它运行到 t2 时刻挂起自己;t2 时刻,系统调度处于就绪状态的优先级最高任务 Task1 执行,它在 t3 时刻唤醒 Task0,后者由于优先级较高而抢占 CPU;Task0 执行到 t4 时刻又挂起自己,内核调度 Task1执行;Task1 运行至 t5 时刻再度唤醒 Task0;注意:图中的栅格并不代表严格的时间刻度,而仅仅表现各任务启动和执行的相对先后关系。
(2)设计 MyTask、YouTask、KeyTask 三个任务:MyTask 任务输出 M;YouTask 任务输出 Y,并输出 MyTask 任务的状态;KeyTask 任务从键盘接收字符 Y 或 N,当接收 Y 时挂起 MyTask 任务,当接收 N 时恢复 MyTask 任务。
(3)设计 KeyTask 任务,当从键盘输入+号时动态创建任务,最多可以创建 10 个任务,这 10个任务都执行一个函数 MyTask,要求优先级是(PRIO_BASE+0,1,2,3,4,5,6,7,8,9),还要向不同的任务传递不同的参数(0,1,2,3,4,5,6,7,8,9)给 MyTask 函数,优先级为(PRIO_BASE+0,1,2,3,4,5,6,7,8,9)的任务分别输出数字(0,1,2,3,4,5,6,7,8,9)。
实验10_SOPC_UCOSII操作系统OK引言:在嵌入式系统中,操作系统是一种软件模块,它的目标是有效地管理系统的资源,并为应用程序提供一个良好的运行环境。
本实验将介绍SOPC_UCOSII操作系统,通过实践来学习如何在其上运行应用程序。
本实验分为以下几个部分:1.SOPC_UCOSII操作系统的介绍2.实验环境搭建3.实验步骤详解4.实验总结与展望一、SOPC_UCOSII操作系统的介绍SOPC(System on Programmable Chip,可编程芯片系统)是一种集成电路系统设计方法,它是将处理器、外设、总线和存储空间等硬件资源集成在一颗可编程逻辑器件(如FPGA)中的理念。
SOPC_UCOSII操作系统是基于SOPC架构设计的一种实时嵌入式操作系统。
UCOSII(MicroC/OS-II,Micro Controller Operating System-II)是美国Micrium公司开发的一款商业操作系统,经过多年的发展与优化,已经成为嵌入式系统领域最受欢迎的操作系统之一二、实验环境搭建1. 使用Altera的Quartus II软件进行FPGA设计和编译。
2.使用FPGA硬件平台开发板进行实验,如DE1-SoC开发板。
3. 使用Altera提供的示例设计进行实验。
三、实验步骤详解2. 使用Quartus II软件创建一个新的工程,选择目标FPGA芯片型号,并进行必要的设置。
3.导入SOPC_UCOSII的示例设计,该设计包含了处理器、外设、总线和存储空间等硬件资源的配置。
4. 编译工程,生成SOPC_UCOSII的.bit文件。
6. 使用终端仿真软件(如SecureCRT),通过串口连接到FPGA开发板。
7.启动FPGA开发板,并观察SOPC_UCOSII的运行情况。
8.在SOPC_UCOSII上运行应用程序,观察其输出结果和运行状态。
四、实验总结与展望通过本实验,我们学习了SOPC_UCOSII操作系统的搭建和运行方式,并在其上成功运行了应用程序。
UCOSII实验1-任务调度 ·UCOSII 是⼀个可以基于 ROM 运⾏的、可裁减的、抢占式、实时多任务内核,具有⾼度可移植性,特别适合于微处理器和控制器。
·为了提供最好的移植性能, UCOSII 最⼤程度上使⽤ ANSI C 语⾔进⾏开发,并且已经移植到近 40 多种处理器体系上,涵盖了从 8 位到 64 位各种 CPU(包括 DSP)。
·UCOSII 具有执⾏效率⾼、占⽤空间⼩、实时性能优良和可扩展性强等特点,最⼩内核可编译⾄ 2KB 。
UCOSII 已经移植到了⼏乎所有知名的 CPU 上。
UCOSII体系结构图:UCOSII 的移植,我们只需要修改: os_cpu.h、 os_cpu_a.asm 和 os_cpu.c等三个⽂件即可: ① os_cpu.h,进⾏数据类型的定义,以及处理器相关代码和⼏个函数原型; ② os_cpu_a.asm,是移植过程中需要汇编完成的⼀些函数,主要就是任务切换函数; ③ os_cpu.c,定义⼀些⽤户 HOOK 函数。
图中定时器的作⽤是为 UCOSII 提供系统时钟节拍,实现任务切换和任务延时等功能。
这个时钟节拍由 OS_TICKS_PER_SEC(在os_cfg.h 中定义)设置,⼀般我们设置 UCOSII 的系统时钟节拍为 1ms~100ms,具体根据你所⽤处理器和使⽤需要来设置。
对于STM32的单⽚机⼀般⽤其 SYSTICK 定时器来为 UCOSII 提供时钟节拍。
UCOSII的任务优先级 · UCOSII 保留了最⾼ 4 个优先级和最低 4 个优先级的总共 8 个任务,⽤于拓展使⽤; · UCOSII ⼀般只占⽤了最低 2 个优先级,分别⽤于空闲任务(倒数第⼀)和统计任务(倒数第⼆),所以剩下给我们使⽤的任务最多可达 255-2=253 个(V2.91)。
任务 · 所谓的任务,其实就是⼀个死循环函数,该函数实现⼀定的功能,⼀个⼯程可以有很多这样的任务(最多 255 个), UCOSII 对这些任务进⾏调度管理,让这些任务可以并发⼯作(注意不是同时⼯作!!,并发只是各任务轮流占⽤ CPU,⽽不是同时占⽤,任何时候还是只有 1 个任务能够占⽤ CPU),这就是 UCOSII 最基本的功能。
实验二uCOS-II在windows下的移植
一:实验目的:
1.掌握uCOS-II在windows下的移植。
二:实验内容:
完成实验环境搭建,并且将uCOS-II移植到d盘下。
三:实验步骤:
1.可以将该工程所需的五个文件:OS_CPU_A.ASM,OS_CPU_C.C,PC.C,TEST.C,Ucos_II.C
放到一个独立的文件夹中,添加的时候便于添加。
2.按照实验一的步骤建立工程
添加所需要的文件:
3.若是将工程建到同software文件夹同一磁盘,但并未如之前一样放到“software\uCOS-II\EX1_x86L\BC45\source\”路径下,在编译运行时会提醒:“unable to open includes.h”和“unable to open os_cfg.h”,解决方法如下:
方法一:将#include “includes.h”改为
“#include “..\SOFTWARE\uCOS-II\EX1_x86L\BC45\SOURCE\includes.h””
将#include “os_cfg.h”改为
“#include “..\SOFTWARE\uCOS-II\EX1_x86L\BC45\SOURCE\os_cfg.h””
方法二:将“..\SOFTWARE\uCOS-II\EX1_x86L\BC45\SOURCE\”路径下的“includes.h”和“os_cfg.h”复制到工程所在的目录之下。
3.运行程序:。
第7章uCOS-II操作系统实验第7章μC/OS-II操作系统实验7.1 实验目的掌握μC/OS-II操作系统的基本使用方法。
掌握μC/OS-II操作系统中时钟节拍的概念和方法。
掌握μC/OS-II操作系统的任务管理的机制。
掌握μC/OS-II操作系统的任务之间进行通讯的方法。
掌握使用标准库函数和μC/OS-II操作系统编写多任务程序的设计方法。
7.2 实验内容(1)设计具有串口通信功能的多任务程序●每个任务在运行时向上位机串口输出“Taskx is running”,x 为任务号;●至少创建除启动任务外的3个任务;●任务1和任务2根据延时运行,运行1次任务1之后运行2次任务2;●任务1运行5次后删除任务1;●任务2运行10次后,通过挂起和恢复方式,任务2执行3次后执行一次任务3。
(2)设计基于邮箱消息的多任务程序●每个任务在运行时向上位机串口输出“Taskx is running”,x 为任务号;●至少创建除启动任务外的2个任务;●任务1根据延时运行;●任务2由串口命令运行(一个任意字符运行一次)或定时器触发运行(邮箱消息方式);●发挥:能够基于ucos-II设计一个显示任务,显示动画。
7.3 实验步骤(1)设计具有串口通信功能的多任务程序。
设计多任务方案、分析功能、设计流程图、确定变量功能和作用域、编写程序、调试代码、记录实验结果。
(2)设计基于邮箱消息的多任务程序。
设计多任务方案、设计通讯方案、分析功能、设计流程图、确定变量功能和作用域、编写程序、调试代码、记录实验结果。
7.4 实验结果附设计方案、流程图、程序的执行结果7.5 实验总结总结实验经验、总结中断服务程序的编写方法、分析程序中的缺陷及改进的方法。
7.6多任务例程Main.c的代码#include#define STACK_SIZE 128static OS_STK MyTask1Stack[STACK_SIZE];static OS_STK MyTask2Stack[STACK_SIZE];static OS_STK StartTaskStack[STACK_SIZE];#define MYTASK1_PRIO 10#define MYTASK2_PRIO 15#define STARTTASK_PRIO 8void MyTask1(void* p_arg);void MyTask2(void* p_arg);void StartTask(void* p_arg);void GPIO_Conf(void);int main(void){OSInit();OSTaskCreate(StartTask,(void*)0,(OS_STK*)&StartTaskStack[S TACK_SIZE-1],STARTTASK_P RIO);OSStart();void GPIO_Conf(){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE );GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOF,&GPIO_InitStructure);GPIO_SetBits(GPIOF,GPIO_Pin_6|GPIO_Pin_7);}void StartTask(void* p_arg){GPIO_Conf();SysTick_Config(SystemCoreClock/1000);OSTaskCreate(MyTask1,(void*)0,(OS_STK*)&MyTask1Stack[STACK_SIZE-1],MYTASK1_PRIO);OSTaskCreate(MyTask2,(void*)0,(OS_STK*)&MyTask2Stack[STACK_SIZE-1],MYTASK2_PRIO);OSTaskDel(OS_PRIO_SELF);}void MyTask1(void* p_arg){while(1){GPIO_WriteBit(GPIOF,GPIO_Pin_6,(BitAction)(1-GPIO_ReadInputDataBit(GPIOF,GPIO_ Pin_6)));OSTimeDly(1000);}void MyTask2(void* p_arg){while(1){GPIO_WriteBit(GPIOF,GPIO_Pin_7,(BitAction)(1-GPIO_ReadInputDataBit(GPIOF,GPIO_ Pin_7)));OSTimeDly(100);}}。
第11章基于NIOS的μC/OS-II实验11.0 实验简介z实验说明本实验项目使用Quartus II、SOPC Builder、Nios II EDS从零开始构建一个能够在DE2-70实验平台上运行的μC/OS-II操作系统的Nios II系统。
初学者可以借此范例熟悉Quartus II、SOPC Builder、Nios II EDS的使用,并且了解基于FPGA的嵌入式系统开发流程。
z资料来源因特网网页:国立台湾大学王胜德教授关于软硬件协同设计的实验指导。
实验名:Altera SPOC Lab 1-uC/OS-II主页:.tw/jenny/homepage/sdwang_codesign2008/index.html其网站上只公开了这一网页:名称是Lab1z实验环境Quartus II 8.1 + Nios II EDS 8.1 + DE2-70 (Cyclone II EP2C70F896C6N)z本实验系统结构图图11-1给出了本实验十(NIOS + UCOS-II)的系统结构图。
图11-1 NIOS + UCOS-II实验的系统结构图从图11-1中可以看到FPGA芯片上有NiosII软核处理器、Avalon交换结构(片上总线)、JTAG调试模块、LED并行输出接口、并行输入开关接口、SDRAM控制器和片上存储器。
外部输入器件采用SW[17:0]。
外部输出器件采用LEDG[7:0]。
最后的实验結果希望在μC/OS-II下实现多任务执行(多任务执行),并且LEDG[17:0]能透过软件被SW[17:0]控制。
z本实验特色实验者从零开始建立一个基于Nios II的μC/OS-II应用实验系统(也可以认为是一个Nios II+μC/OS-II的应用框架)具有以下一些作用。
1. 读者可以借助SOPC Builder工具自行对Nios II软核处理器进行配置。
2. 很多范例都是纯硬件的Verilog 代码,需要自行从零开始建立Nios II系统,不能够直接使用Altera或友晶科技公司已经建立好的Nios II系统。
实验一实验环境搭建一:实验目的:1.安装Borland c++。
2.完成实验环境搭建。
3.学会建立工程。
二:实验内容:1.安装Borland C++:注意:安装到c盘中2.安装TASM 5.0注意:安装到C盘根目录下。
3.配置环境变量。
找到变量名为“path”的项,在“变量值”中,填写“C:\TASM\BIN”。
4.搭建开发环境。
(1).新建一个工程在新建工程界面中进行设置。
在 Project Path and Name 中设置为“C:\software\uCOS-II\EX1_x86L\BC45\source\test.ide”。
在Target Type 中选择“Application[.exe]”。
在 Platform 中选择“DOS(Standard)”。
在 Target Model 中选择“Large”。
其他选择都为默认。
(默认是将uC/OS 放在 C 盘根目录下的,放在别的盘符下自己进行修改。
)设置完成后,点击“OK”(2)新建的工程会包含一个默认的“.cpp”文件。
(3)删除默认的test.cpp。
(4)添加新文件:依次添加以下文件:(1)“C:\software\uCOS-II\EX1_x86L\BC45\SOURCE”里的“test.c”文件。
(2)在“C:\software\uCOS-II\Ix86L\BC45”中,在 List Files of Type中选择“All file(*.*)”。
然后在选“os_cpu_a.asm”和“os_cpu_c.c”(3)在“C:\software\uCOS-II\SOURCE”中,选择“ucos_ii.c”文件(4)在“C:\software\BLOCKS\PC\BC45”中,选择“pc.c”文件(5).在project->build all,如果出现如下情况:就这个!这个文件在“C:\BC45\BIN”文件夹中(也就是开发环境的目录下),把它拷贝到“C:\software\uCOS-II\EX1_x86L\BC45\SOURCE”目录下(也就是我们工程目录下) 然后重新点击:project->build all。
实验七ucos-II 综合实验—机器人综合控制实例一.实验目的1.掌握如何运行ucos-II 嵌入式操作系统。
2.掌握开发一个基于ucos-II的嵌入式系统应用实例。
3.掌握控制移动机器人电机转速的控制方法。
二.实验环境1.TEB-CM5000嵌入式单片机实验系统2.MDK4.7嵌入式软件开发环境三.实验内容1.熟悉TEB-CM5000嵌入式单片机实验系统上的电机控制电路和码盘数据采集电路等。
图1 电机转速控制和检测电路其中MD+和MD-控制电机转动,构成了H桥直流电机驱动电路,当MD+=1,MD-=0时,电机正转;当MD+=0,MD-=1时,电机反转。
PT1为电机转速测量电路,通过读取PT1上的脉冲从而计算出电机的转动速度。
按钮电路如下:图2 按钮电路其中使用按键1(找到合适的按键就行)控制电机的转动方向,按键2(找到合适的按键就行)控制电机的速度,设定为两个级别:快和慢。
初始时,电机停转;当按键2第一次按下时,电机速度慢;当按键2第二次按下时,电机速度快。
图3 串口通信电路电机转动的测量速度和方向,每当发生速度切换时,通过串口向电脑发送方向和具体的速度值。
2.实验箱多余接口方便同学实验连接需要。
图4 ARM部分扩展接口3. 参考”ucosii_mailbox4labbox”的ucosii邮箱通信程序,完成整个程序设计和开发。
4. 实验结束后,结合书中的综合实例,表述一个智能机器人小车的轮速是怎么来进行测量和控制的。
四.实验要求1.根据实际情况完成其中的部分任务即可,鼓励完成所有内容。
2.学习书籍有关ucosii综合开发的代码,结合参考例程,开发实验要求的内容,并根据实验箱实际的连接电路,编译和下载代码到实验箱,观察结果;在实验报告中说明其运行的结果。
3.通过开发此部分实验内容,能够衍生考虑到控制一个机器人小车的过程。
五.实验提交要求1.按照实验模板完成实验报告,其中包括实验要求的所有内容。
2.提交电子版报告,撰写程序流程图,并且提交程序主要代码。
实验八uCOS的互斥信号量一:实验目的:1.理解互斥型信号量。
2.学会使用互斥型信号量实现对共享资源的独占式处理。
3.解决任务在使用独占式资源出现的优先级反转问题。
二:实验内容:完成教材5-7实验,使用互斥型信号量实现对共享资源的独占式处理。
实验中要求要创建互斥型信号量,请求互斥型信号量,发送互斥型信号量,删除互斥型信号量。
三:程序代码:#include "includes.h"#define TASK_STK_SIZE 512OS_STK StartTaskStk[TASK_STK_SIZE];OS_STK MyTaskStk[TASK_STK_SIZE];OS_STK YouTaskStk[TASK_STK_SIZE];OS_STK HerTaskStk[TASK_STK_SIZE];INT16S key;char *s1="MyTask running--yangkun";char *s2="YouTask running--yangkun";char *s3="HerTask running--yangkun";char *s4="MyTask pend_Semp";char *s5="HerTask pend_Semp";INT8U err;INT8U y=0;INT32U Times=0;OS_EVENT *Semp;void StartTask(void *pdata);void MyTask(void *pdata);void YouTask(void *pdata);void HerTask(void *pdata);void main (void){OSInit();PC_DOSSaveReturn();PC_VectSet(uCOS, OSCtxSw);Semp=OSMutexCreate(1,&err);OSTaskCreate(StartTask,(void*)0,&StartTaskStk[TASK_STK_SIZE - 1], 0);OSStart();}void StartTask (void *pdata){#if OS_CRITICAL_METHOD == 3OS_CPU_SR cpu_sr;#endifpdata = pdata;OS_ENTER_CRITICAL();PC_VectSet(0x08, OSTickISR);PC_SetTickRate(OS_TICKS_PER_SEC);OS_EXIT_CRITICAL();OSStatInit();OSTaskCreate(MyTask,(void*)0,&MyTaskStk[TASK_STK_SIZE - 1], 3);OSTaskCreate(YouTask,(void*)0,&YouTaskStk[TASK_STK_SIZE - 1], 4);OSTaskCreate(HerTask,(void*)0,&HerTaskStk[TASK_STK_SIZE - 1], 5);for (;;){if (PC_GetKey(&key) == TRUE) {if (key == 0x1B) {PC_DOSReturn();}}OSTimeDlyHMSM(0, 0, 3, 0);}}void MyTask(void *pdata){#if OS_CRITICAL_METHOD==3OS_CPU_SR cpu_sr;#endifpdata=pdata;for(;;){OSTimeDlyHMSM(0,0,0,200);{PC_DispStr(10,++y,s4,DISP_BGND_BLACK+DISP_FGND_WHITE);OSMutexPend(Semp,0,&err);PC_DispStr(10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);}OSTimeDlyHMSM(0,0,0,200);}}void YouTask(void *pdata){#if OS_CRITICAL_METHOD==3OS_CPU_SR cpu_sr;#endifpdata=pdata;for(;;){PC_DispStr(10,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);OSTimeDlyHMSM(0,0,0,300);}}void HerTask(void *pdata){#if OS_CRITICAL_METHOD==3OS_CPU_SR cpu_sr;#endifpdata=pdata;for(;;){PC_DispStr(10,++y,s5,DISP_BGND_BLACK+DISP_FGND_WHITE);OSMutexPend(Semp,0,&err);PC_DispStr(10,++y,s3,DISP_BGND_BLACK+DISP_FGND_WHITE);for(Times;Times<20000000;Times++){OS_Sched();}PC_DispStr(20,++y,"***************",DISP_BGND_BLACK+DISP_FGND_WHITE);OSMutexPost(Semp);OSTimeDlyHMSM(0,0,1,0);}}四:实验结果:。