文档库 最新最全的文档下载
当前位置:文档库 › uC OS-II的任务切换总结

uC OS-II的任务切换总结

uC OS-II的任务切换总结
uC OS-II的任务切换总结

uC/OS-II的任务切换归根到底都是由以下三个函数引起的:

1. OSStart();

2. OSIntExit();

3. OS_Sched();

一、OSStart():

OSStart()函数是uC/OS-II任务调度的引导函数,它调用更底层的函数OSStartHighRdy()来完成最初的任务切换;OSStartHighRdy()唯一地在OSStart()函数中被调用。OSStart()函数代码如下:

/**********************************************************/

void OSStart (void)

{

INT8U y;

INT8U x;

if (OSRunning == FALSE) {

y = OSUnMapTbl[OSRdyGrp];

x = OSUnMapTbl[OSRdyTbl[y]];

OSPrioHighRdy = (INT8U)((y << 3) + x);

OSPrioCur = OSPrioHighRdy;

OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];

OSTCBCur = OSTCBHighRdy;

OSStartHighRdy();

}

}

/**********************************************************/

而OSStartHighRdy()函数需要用户移植实现,主要的工作是:

1. OSRunning = TRUE;

2. 调用OSTaskSwHook()函数;

3. 设置处理器的堆栈指针寄存器为OSTCBHighRdy->OSTCBStkPtr;

4. 恢复所有处理器的寄存器内容(不包括堆栈指针寄存器和PC寄存器);

5. 恢复PC寄存器并开始执行PC指向的指令。

二、OSIntExit():

OSIntExit()函数由中断服务代码调用,用户的中断服务代码要求如下:

1. 把全部CPU寄存器(包括堆栈指针寄存器和PC寄存器)推入当前任务堆栈;

2. 调用OSIntEnter()函数或OSIntNesting++;

3. 执行用户的中断处理代码;

4. 调用OSIntExit()。

OSIntExit()函数调用更底层的函数OSIntCtxSw()来实现任务切换,而OSIntExit()函数的代码如下:/**********************************************************/

void OSIntExit (void)

{

#if OS_CRITICAL_METHOD == 3

OS_CPU_SR cpu_sr;

#endif

if (OSRunning == TRUE) {

OS_ENTER_CRITICAL();

if (OSIntNesting > 0) {

OSIntNesting--;

}

if ((OSIntNesting == 0) && (OSLockNesting == 0)) {

OSIntExitY = OSUnMapTbl[OSRdyGrp];

OSPrioHighRdy = (INT8U)((OSIntExitY << 3) +

OSUnMapTbl[OSRdyTbl[OSIntExitY]]);

if (OSPrioHighRdy != OSPrioCur) {

OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];

OSCtxSwCtr++;

OSIntCtxSw();

}

}

OS_EXIT_CRITICAL();

}

}

/**********************************************************/

函数OSIntCtxSw()需要用户移植实现,主要内容如下:

1. 调用OSTaskSwHook()函数;

2. OSPrioCur = OSPrioHighRdy;

3. OSTCBCur = OSTCBHighRdy;

4. 设置处理器的堆栈指针寄存器为OSTCBHighRdy->OSTCBStkPtr;

5. 恢复所有处理器的寄存器内容(不包括堆栈指针寄存器和PC寄存器);

6. 恢复PC寄存器并开始执行PC指向的指令。

三、OS_Sched():

OS_Sched()函数被各种任务间通信函数如xxxPost()和xxxPend()调用,OS_Sched()函数调用更底层的函数OS_TASK_SW()来实现任务切换,OS_Sched()函数的源代码如下:

/**********************************************************/

void OS_Sched (void)

{

#if OS_CRITICAL_METHOD == 3

OS_CPU_SR cpu_sr;

#endif

INT8U y;

OS_ENTER_CRITICAL();

if ((OSIntNesting == 0) && (OSLockNesting == 0)) {

y = OSUnMapTbl[OSRdyGrp];

OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);

if (OSPrioHighRdy != OSPrioCur) {

OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];

OSCtxSwCtr++;

OS_TASK_SW();

}

}

OS_EXIT_CRITICAL();

}

/**********************************************************/

OS_TASK_SW()函数需要用户移植实现,主要内容如下:

1. 把全部CPU寄存器(包括堆栈指针寄存器和PC寄存器)推入当前任务堆栈;

2. 调用OSTaskSwHook()函数;

3. OSPrioCur = OSPrioHighRdy;

4. OSTCBCur = OSTCBHighRdy;

5. 设置处理器的堆栈指针寄存器为OSTCBHighRdy->OSTCBStkPtr;

6. 恢复所有处理器的寄存器内容(不包括堆栈指针寄存器和PC寄存器);

7. 恢复PC寄存器并开始执行PC指向的指令。

实时操作系统UCOS-II,学会RTOS给你的身价增值

实时操作系统UCOS-II,学会RTOS给你的身价增值 如果,你最近关注一些嵌入式招聘职位描述,你可能会经常看到看到使用过uCOS、Vxworks、QNX等RTOS者优先。 随便打开一个20K的嵌入式开发工作职责: 你会发现熟悉RTOS的开发、移植、剪裁真的很吃香! 今天,我们就来介绍一下实时操作系统UCOS-II。 一、嵌入式操作系统概览 嵌入式操作系统的主要好处就是屏蔽了底层硬件的差别,给上层应用提供统一的接口,并管理进程调度和资源(如CPU时间、内存)分配等。并且可以充分利用硬件资源,如在单任务时(大循环结构,如大部分51程序)遇到delay函数时,CPU在空转。而在多任务系统,遇到delay或需等待资源时系统会自动运行下一个任务,等条件满足再回来运行先前的任务,这样就充分利用了CPU,提高了效率。 uC/OS操作系统与裸机程序的最大不同点就在于uC/OS有任务调度,可以根据任务的重要程度(优先级)优先执行重要的任务,从而确保能及时处理最重要的数据。(所以对于一个系统有必要使用OS的判断是能否划分一个个的任务,并且各任务间的耦合很小)可以思考下裸机程序中断的时候发生的过程。利用堆栈可以很自由的在A、B中切换,如果切换足够快,A、B看以来好像同时在执行,这就是并行,A、B就是任务。如果这个切换操作放到定时器函数中来做,就可以严格按照时间来切换。另外,各个任务之间有存在一定的关系,有逻辑上的先后等,必须引进全局的结构体、变量来标记一些信息,全局的这些数据是不会被释放的,所以所有的任务可以去通过读、写这些数据来实现各个程序块交流信息,实现所谓的同步、互斥。这就是操作系统的原理,而这些不同的通信方式按功能细分就成事件管理、内存管理等。

ucosII任务切换是怎样实现的

UC/OS-II学习笔记之——任务切换是怎样实现的问题是, o Uc/OS-II如何切换任务?通过任务调度器OS_Sched(),那么谁在调用这个函数? o CPU在这里肯定有作用,因为任务切换必然涉及到CPU寄存器的入栈和出栈, 那么这一块工作是如何完成的? 书上讲:为了做到任务切换,运行OS_TASK_SW(),人为模仿一次中断。中断服务子程序或陷阱处理(trap hardler),也称作事故处理(exception handler),必须给汇编语言函数OSCtxSw()提供中断向量[1.92]。 那么,“人为模仿一次中断”是什么意思? 是指:OS_TASK_SW()触发了一个中断,由中断完成了任务切换? 阅读源代码,查找答案…… #define OS_TASK_SW()OSCtxSw()//这是一个宏调用,定义在os_cpu.h,Os_cpu_a.asm中定义了OSCtxSw NVIC_INT_CTRL EQU0xE000ED04 NVIC_PENDSVSET EQU0x10000000 ;****************************************************************************** ;PERFORM A CONTEXT SWITCH(From task level) ;void OSCtxSw(void) ; ;Note(s):1)OSCtxSw()is called when OS wants to perform a task context switch.This function ;triggers the PendSV exception which is where the real work is done. ;****************************************************************************** OSCtxSw LDR R0,=NVIC_INT_CTRL;Trigger the PendSV exception(causes context switch) LDR R1,=NVIC_PENDSVSET STR R1,[R0] BX LR 注释说明该段汇编代码触发了一个PendSV的异常。

ucos-ii操作系统复习大纲

ucos-ii操作系统复习大纲 一.填空题 1.uC/OS-II是一个简洁、易用的基于优先级的嵌入式【抢占式】多任务实时内核。 2.任务是一个无返回的无穷循环。uc/os-ii总是运行进入就绪状态的【最高优先级】的任务。 3.因为uc/os-ii总是运行进入就绪状态的最高优先级的任务。所以,确定哪 个任务优先级最高,下面该哪个任务运行,这个工作就是由【调度器(scheduler)】来完成的。 4.【任务级】的调度是由函数OSSched()完成的,而【中断级】的调度 是由函数OSIntExt() 完成。对于OSSched(),它内部调用的是【OS_TASK_SW()】完成实际的调度;OSIntExt()内部调用的是【 OSCtxSw() 】实现调度。 5.任务切换其实很简单,由如下2步完成: (1)将被挂起任务的处理器寄存器推入自己的【任务堆栈】。 (2)然后将进入就绪状态的最高优先级的任务的寄存器值从堆栈中恢复到【寄存器】中。 6.任务的5种状态。 【睡眠态(task dormat) 】:任务驻留于程序空间(rom或ram)中,暂时没交给ucos-ii处理。 【就绪态(task ready)】:任务一旦建立,这个任务就进入了就绪态。 【运行态(task running)】:调用OSStart()可以启动多任务。OSStart()函数只能调用一次,一旦调用,系统将运行进入就绪态并且优先级最高的任务。 【等待状态(task waiting)】:正在运行的任务,通过延迟函数或pend(挂起)相关函数后,将进入等待状态。

【中断状态(ISR running)】:正在运行的任务是可以被中断的,除非该任务将中断关闭或者ucos-ii将中断关闭。 7.【不可剥夺型】内核要求每个任务自我放弃CPU的所有权。不可剥夺型调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。 8.当系统响应时间很重要时,要使用【可剥夺型】内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。 9.使用可剥夺型内核时,应用程序不应直接使用不可重入型函数。调用不可重入型函数时,要满足互斥条件,这一点可以用【互斥型信号量】来实现。 10.【可重入型】函数可以被一个以上的任务调用,而不必担心数据的破坏。 11.可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数或者只使用【局部变量】,即变量保存在CPU寄存器中或堆栈中。如果使用全局变量,则要对全局变量予以【保护】。 12.每个任务都有其优先级。任务越重要,赋予的优先级应【越高】。 13.μC/OS-Ⅱ初始化是通过调用系统函数【OSIint()】实现的,完成μC/OS-Ⅱ所有的变量和数据结构的初始化。 14.多任务的启动是用户通过调用【OSStart()】实现的。然而,启动μC/OS-Ⅱ之前,用户至少要建立一个应用【任务】。 15. μC/OS-Ⅱ的参数配置文件名为【】。 16.删除任务,是说任务将返回并处于【休眠状态】,并不是说任务的代码被删除了,只是任务的代码不再被μC/OS-Ⅱ调用。 17.μC/OS-Ⅱ要求用户提供【定时中断】来实现延时与超时控制等功能。 18.定时中断也叫做【时钟节拍】,它应该每秒发生10至100次。 19. 时钟节拍的实际频率是由用户的应用程序决定的。时钟节拍的频率越高,系统的负荷就【越重】。 20.μC/OS-II中的信号量由两部分组成:一个是信号量的【计数值】,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的【等待任务表】。用户要在中将OS_SEM_EN开关量常数置成【1 】,这样μC/OS-II 才能支持信号量。 21. μC/OS-II中表示当前已经创建的任务数全局变量名为:【 OSTaskCtr 】。

嵌入式实时操作系统UCOS 2优劣势分析

嵌入式实时操作系统ucos ii的优劣势分析 引言 早在20世纪60年代,就已经有人开始研究和开发嵌入式操作系统。但直到最近,它才在国内被越来越多的提及,在通信、电子、自动化等需要实时处理的领域所曰益显现的重要性吸引了人们越来越多的注意力。但是,人们所谈论的往往是一些著名的商业内核,诸如VxWorks、PSOS等。这些商业内核性能优越,但价格昂贵,主要用于16位和32位处理器中,针对国内大部分用户使用的51系列8位单片机,可以选择免费的ucos ii。 ucos ii的特点 1.ucos ii是由Labrosse先生编写的一个开放式内核,最主要的特点就是源码公开。这一点对于用户来说可谓利弊各半,好处在于,一方面它是免费的,另一方面用户可以根据自己的需要对它进行修改。缺点在于它缺乏必要的支持,没有功能强大的软件包,用户通常需要自己编写驱动程序,特别是如果用户使用的是不太常用的单片机,还必须自己编写移植程序。 2.ucos ii是一个占先式的内核,即已经准备就绪的高优先级任务可以剥夺正在运行的低优先级任务的CPU使用权。这个特点使得它的实时性比非占先式的内核要好。通常我们都是在中断服务程序中使高优先级任务进入就绪态(例如发信号),这样退出中断服务程序后,将进行任务切换,高优先级任务将被执行。拿51单片机为例,比较一下就可以发现这样做的好处。假如需要用中断方式采集一批数据并进行处理,在传统的编程方法中不能在中断服务程序中进行复杂的数据处理,因为这会使得关中断时间过长。所以经常采用的方法是置一标志位,然后退出中断。由于主程序是循环执行的,所以它总有机会检测到这一标志并转到数据处理程序中去。但是因为无法确定发生中断时程序到底执行到了什么地方,也就无法判断要经过多长时间数据处理程序才会执行,中断响应时间无法确定,系统的实时性不强。如果使用μC/OS-II的话,只要把数据处理程序的优先级设定得高一些,并在中断服务程序中使它进入就绪态,中断结束后数据处理程序就会被立即执行。这样可以把中断响应时间限制在一定的范围内。对于一些对中断响应时间有严格要求的系统,这是必不可少的。但应该指出的是如果数据处理程序简单,这样做就未必合适。因为ucos ii要求在中断服务程序末尾使用OSINTEXIT函数以判断是否进行任务切换,这需要花费一定的时间。 3.ucos ii和大家所熟知的Linux等分时操作系统不同,它不支持时间片轮转法。ucos ii是一个基于优先级的实时操作系统,每个任务的优先级必须不同,分析它的源码会发现,ucos ii把任务的优先级当做任务的标识来使用,如果优先级相同,任务将无法区分。进入就绪态的优先级最高的任务首先得到CPU的使用权,只有等它交出CPU的使用权后,其他任务才可以被执行。所以它只能说是多任务,不能说是多进程,至少不是我们所熟悉的那种多进程。显而易见,如果只考虑实时性,它当然比分时系统好,它可以保证重要任务总是优先占有CPU。但是在系统中,重要任务毕竟是有限的,这就使得划分其他任务的优先权变成了一个让人费神的问题。另外,有些任务交替执行反而对用户更有利。例如,用单

uCOS-II任务堆栈检验(OSTaskStkChk())

uC/OS-II任务堆栈检验(OSTaskStkChk()) 使用OSTaskStkChk()可以返回一个记录所检查堆栈空间的使用情况,包括已使用空间及 空闲空间的大小。但只有用OSTaskCreateExt()建立的任务的堆栈才正常使用OSTaskStkChk()。这个堆栈检验功能的原理很简单,因为OSTaskCreateExt()已经把任务堆栈 每个字节初始为0了,所以只需要从栈底依次扫描每个字节并计数直到当一个字节的内容不 为0,也即从这个字节起的空间已经至少被任务使用过了,得到的计数就是空闲空间的大小,使用空间的大小由栈的总大小减去空闲空间的大小就可以得到。 OSTaskStkChk(INT8U prio,OS_STK_DATA *pdata) /*检查优先级为prio的任务的堆栈使用情况,并把结果存入OS_STK_DATA类型的单元中*/ INT8U OSTaskStkChk(INT8U prio,OS_STK_DATA *pdata) { OS_TCB *ptcb; /*用于执行所要堆栈检测任务的TCB*/ OS_STK *pchk; /*用于指向所要堆栈检测的任务的堆栈*/ INT32U free; /*存放未使用的堆栈容量*/ INT32U size; /*存放堆栈总容量*/ pdata->OSFree=0; /*将用于存放堆栈检测结果的单元进行清零*/ pdata->OSUsed=0; if(prio>OS_LOWEST_PRIO &&prio != OS_PRIO_SELF)/*查看优先级是否在有效范围内*/ { return(OS_PRIO_INVALID); } OS_ENTER_CRITICAL();/*在对任务的TCB内容读取的过程中需要关中断,即TCB是临界资源,不可多个进程同时访问*/ if (prio==OS_PRIO_SELF) /*如果prio的值为OS_PRIO_SELF 即prio==0xFF,系统规定优 先级为当前正在执行的任务*/ { prio=OSTCBCur->OSTCBPrio;/*需要将prio的值更改为当前正在执行任务的优先级*/ } ptcb=OSTCBPrioTbl[prio];/*根据任务的优先级和TCB优先级表,找到所要进程堆栈检测 任务的TCB*/

实验二 UCOS-II任务管理

班级学号姓名同组人 实验日期室温大气压成绩 实验二 UCOS-II任务管理 一、实验目的 1、掌握UCOS-II中任务管理的函数的应用。 2、掌握UCOS-II在STM32平台下对硬件的控制。 3、掌握开发UCOS-II应用的程序结构。 二、实验步骤 1、UCOSII工作原理 UCOSII提供系统时钟节拍,实现任务切换和任务延时等功能。这个时钟节拍由 OS_TICKS_PER_SEC(在os_cfg.h中定义)设置,一般我们设置UCOSII的系统时钟节拍为1ms~100ms。本次实验利用STM32的SYSTICK定时器来提供UCOSII时钟节拍。 UCOSII的任何任务都是通过一个叫任务控制块(TCB)的东西来控制的,每个任务管理块有3个最重要的参数:(1)任务函数指针;(2)任务堆栈指针;(3)任务优先级。 在UCOSII中,使用CPU的时候,优先级高(数值小)的任务比优先级低的任务具有优先使用权,即任务就绪表中总是优先级最高的任务获得CPU使用权,只有高优先级的任务让出CPU使用权(比如延时)时,低优先级的任务才能获得CPU使用权。UCOSII不支持多个任务优先级相同,也就是每个任务的优先级必须不一样。任务的调度其实就是CPU 运行环境的切换,即:PC指针、SP指针和寄存器组等内容的存取过程 UCOSII的每个任务都是一个死循环。每个任务都处在以下5种状态之一的状态下,这5种状态是:睡眠状态、就绪状态、运行状态、等待状态(等待某一事件发生)和中断服务状态。 睡眠状态,任务在没有被配备任务控制块或被剥夺了任务控制块时的状态。

就绪状态,系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,任务已经准备好了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行,这时任务的状态叫做就绪状态。 运行状态,该任务获得CPU使用权,并正在运行中,此时的任务状态叫做运行状态等待状态,正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给别的任务而使任务进入等待状态。 中断服务状态,一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态。 UCOSII任务的5个状态转换关系如图所示: 与任务相关的几个函数: 1)建立任务函数 UCOSII提供了我们2个建立任务的函数:OSTaskCreat和OSTaskCreatExt,我们一般用OSTaskCreat函数来创建任务,该函数原型为: OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio) 该函数包括4个参数: task:是指向任务代码的指针; pdata:是任务开始执行时,传递给任务的参数的指针; ptos:是分配给任务的堆栈的栈顶指针; prio是分配给任务的优先级。 每个任务都有自己的堆栈,堆栈必须申明为OS_STK类型,并且由连续的内存空间组成。可以静态分配堆栈空间,也可以动态分配堆栈空间。OSTaskCreatExt也可以用来创

uCOS-II中的任务切换机制

uCOS-II中的任务切换机制 【@.1 函数周期与死循环】 一般函数的生命周期很简单,从开始调用函数起,直到函数返回,即结束。这样一来就完成了这个函数的使命,它也就不再需要了。对于一般的函数就是这样,但是回过头想想,对于一个系统、OS、或者工业控制中的一个控制器重的系统个,函数返回是很轻易很随便的就能返回吗?返回就意味着函数结束,死亡,若是想系统这样一个很大的函数,它的返回就意味着系统结束。因此,对于系统的函数返回有些时候我们不希望它返回,返回时是需要好好设计的,像嵌入式中的控制程序我们也并不需要它返回,直接关机就好了。因此,一个系统往往就是一个很大的循环,不停的扫描,而我们编程的时候对于这个死循环是需要好好设计的。考虑以下一个控制要求, @.按键控制电机启、停、正转反转,并每秒发送CAN报文报告当前情况。 我们可以有多种方法实现这一要求: 方法一:每次在循环体重扫描当前按键的电平,从而进入对应的控制电机函数,如果所有电平都没有信号则直接进入下一个循环。发送CAN报文就直接用一个定时中断。这样的好处就是编程简单直白,每次循环进入不同的电机控制函数,坏处很明显,一定要等待到下一个循

环才能进入其他的电机控制函数,每次循环的时间不好控制,不管你用函数指针还是 if/else来判断,每次循环一定要等待电机动作结束才能进入下一个循环。 方法二:改用外部中断来处理按键。仅当按键按下时触发外部中断,从而控制响应的电机进行操作。这样的好处就是循环体简单,可以仅仅就是一个计数器加一,所有控制都等中断来实现。但这样带来的问题也很明显,就是中断嵌套问题。比如当电机正转时按下停止按钮,这时由于是在中断中,停止按钮是否真的能够得到响应?这就涉及到中断嵌套问题,并不见得所有CPU都能支持中断嵌套,我的这一篇文章对中断嵌套问题进行了一个讨论。 方法三:采用RTOS的思想,加入任务调度系统。每次任务调度系统就是一个小小的循环,对于各个任务进行轮询,当这次轮询发现某任务是已经就绪的优先级最高的任务,则交给CPU处理,所有中断与任务,任务与任务之间有通讯机制可以交换信息。当然实际上并不仅仅只在任务调度器轮询时才进行任务的切换,实际上的操作比这个复杂一些,我的这篇文章就想以uCOS-II为例讨论RTOS的任务调度系统是怎样执行的。 【@.2 uCOS-II中的任务调度】 回到前面的方法一,二,我们将这种任务称作前后台任务。

实验二-UCOS-II任务管理

实验二-U C O S-I I任务 管理 -CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN

班级学号姓名同组人 实验日期室温大气压成绩 实验二 UCOS-II任务管理 一、实验目的 1、掌握UCOS-II中任务管理的函数的应用。 2、掌握UCOS-II在STM32平台下对硬件的控制。 3、掌握开发UCOS-II应用的程序结构。 二、实验步骤 1、UCOSII工作原理 UCOSII提供系统时钟节拍,实现任务切换和任务延时等功能。这个时钟节拍由 OS_TICKS_PER_SEC(在os_cfg.h中定义)设置,一般我们设置UCOSII的系统时钟节拍为1ms~100ms。本次实验利用STM32的SYSTICK定时器来提供UCOSII时钟节拍。 UCOSII的任何任务都是通过一个叫任务控制块(TCB)的东西来控制的,每个任务管理块有3个最重要的参数:(1)任务函数指针;(2)任务堆栈指针;(3)任务优先级。 在UCOSII中,使用CPU的时候,优先级高(数值小)的任务比优先级低的任务具有优先使用权,即任务就绪表中总是优先级最高的任务获得CPU使用权,只有高优先级的任务让出CPU使用权(比如延时)时,低优先级的任务才能获得CPU使用权。UCOSII不

支持多个任务优先级相同,也就是每个任务的优先级必须不一样。任务的调度其实就是CPU运行环境的切换,即:PC指针、SP指针和寄存器组等内容的存取过程UCOSII的每个任务都是一个死循环。每个任务都处在以下5种状态之一的状态下,这5种状态是:睡眠状态、就绪状态、运行状态、等待状态(等待某一事件发生)和中断服务状态。 睡眠状态,任务在没有被配备任务控制块或被剥夺了任务控制块时的状态。 就绪状态,系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,任务已经准备好了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行,这时任务的状态叫做就绪状态。 运行状态,该任务获得CPU使用权,并正在运行中,此时的任务状态叫做运行状态等待状态,正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给别的任务而使任务进入等待状态。 中断服务状态,一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态。 UCOSII任务的5个状态转换关系如图所示:

嵌入式实时操作系统ucos期末考试题

一、名词解释: 1、OS:操作系统 2、MCU:微控制器 3、ISR:中断服务子程序 4、FIFO:先进先出 5、TCB:Task Control Block,任务控制块 6、API:应用程序接口 7、RTOS:实时操作系统 8、UART:通用异步收发传输器 9、MMU:内存管理单元 10、JTAG:边界调试接口 二、填空题 1、( 优先级抢占和时间片轮转 )是一种运行时间一到就剥夺进程处理器使用权的剥夺式调度。 2、实时系统的两个基本要求:( 逻辑或功能正确 )、时间正确。所谓时间正确是指 (实时系统的计算必须在预定的时间内完成)。 3、临界区是指( 处理时不可分割的代码、每个进程中访问临界资源的那段程序 ) 4、UCOS调用系统延时最小时间单位( 毫秒 ) 5、UCOS配置文件中OS_TICKS_PER_SEC的数值定义为32,含义是(时钟频率为32 hz) 6如果某一个任务不是必须的监控任务,我们一般采用( 动态内存管理 )的机制来创建该任务所需要的变量内存空间,要想能使用这种机制,必须首先将内存交给(操作系统)来统一管理 7、如果系统中某一个资源属于独占资源,n个任务都需要使用,标准的做法是使用(互斥信号量)来解决 8、在UCOS中,优先级用一个数字表示,数字越大表示任务的优先级别越(低) 9、优先级调度的( 任务就绪表 )标志进程抢占处理器的权利大小。 10、(任务控制块)主要用来记录任务的堆栈指针,任务的当前状态,任务的优先级别等一些与任务管理有关的属性的表。 11、临界区是指( 保证共享资源的完整性和可靠性的代码段 )。 12、可重入指的是(是一段代码(如一个函数)可以被多个任务同时调用,而不必担心会破坏数据)。 13、某事件周期不确定,持续时间较短,处理容忍度较长,通常我们采取在(任务就绪表)中发现该事件,在(任务调度)中处理该事件。 14、如果系统中有2个资源,n个任务都需要使用,标准的做法是使用(互斥信号量)来解决。 15、在UCOS中,最低优先级自动赋给( 空闲任务 )这个系统任务。 16、对CPU资源进行分配的两种操作系统常见调度算法为__(任务级调度_)和(中断级调度)。 17、uC/OS中,主要依靠_(任务堆栈_)来保存任务工作环境。

uCOS II 删除任务

任务的删除(删除任务请求方,被删除任务方)所谓删除任务,就是把任务置于睡眠状态。具体做法是,把被删除的任务 的任务控制块从任务控制块链表中删除,并归还给空任务控制块链表。(创建一个任务就像向空任务控制链表借东西。但是有借必有还,删除任务就是用完以后归还给空任务链表的过程),然后在任务就绪表中把该任务的就绪状态位置为0,于是该任务就不能再被调度器所调用了。简单的说,就是把他的身份证给吊销了。 #if OS_TASK_DEL_EN INT8U OSTaskDel(INT8U prio); //要删除任务的优先级别这与任务的挂起相似,可以调用函数OSTaskDel()来删除任务自身或者除了空闲任务之外的其他任务。如果一个任务要删除自己,则应调用函数时函数参数prio为OS_PRIO_SELF。 核心讨论的问题 问题的提出: 有时,任务会占用一些动态分配的内存或是信号量之类的资源。这时,如果有其他任务把这个任务删除了,那么被删除任务所占用的一些资源就会因为没有被释放而丢失,这时任何系统都无法接受的。 这就像在C语言中用malloc申请的对空间,在释放之前不能让子函数没了,否则永远就找不到申请的这段空间了。 解决方案: 提出删除任务请求的任务只能负责提出删除任务的请求,而删除工作要有被删除任务自己来完成。这样,被删除的任务就可以根据自身的具体情况来决定何时删除任务自身,同时也会有机会再删除自身之前把占用的资源给释放掉。 显然如果想使提出删除任务请求的任务和被删除任务之间能够像上述方式来执行删除工作,则他们必须有某种通信方法。ucos利用被删除任务的任务控制块成员OSTCBDelReq作为请求删除方与被删除方的联络信号,同时提供了一个双方都能调用的函数-----请求删除任务函数OSTaskDelReq()。这样提出删除任务请求的任务和被删除任务的双方都能使用这个函数来访问OSTCBDelReq这个信号,从而可以根据这个信号状态来决定各自的行为 过程是这样的。就像两个人A和B。A对B调用函数OSTaskDelReq ()说我要删除你。然后将Flag(OSTCBDelReq)置给一个标志位。B通过函数OSTaskDelReq()看到Flag(OSTCBDelReq)置位,然后就启动自己删除自己的命令。

ucOSII实时操作系统共41页

面向二十一世纪的嵌入式系统设计技术 第五讲: ucOS/II 实时操作系统 RTOS(一):ucOS/II 2002 年 1 月任课教员:徐欣 主讲教员:习勇 国防科大电子科学与工程学院 嵌入式系统开放研究小组 博士 博士 1

What is uC/OS? u: Micro C:control uC/OS : 适合于小的、控制器的操作系统 小巧 公开源代码,详细的注解可剥夺实时内核 可移植性强多任务确定性 2002/112

美国人 The S t ory of uC/OS Jean Labrosse 1992 年编写的 商业软件的昂贵 应用面覆盖了诸多领域,如照相机、医疗器 械、音响设备、发动机控制、高速公路电话 系统、自动提款机等 1998 年uC/OS-II ,目前 的版本 uCOS-II 2002/11 uC/OS-II V2.51 3

嵌入式操作系统—uC/OS 概要 内核结构 - 任务以及调度机制 任务间通信 uC/OS 的移植 在PC 机上运行 uC/OS 2002/114

—uC/OS 任务task 嵌入式操作系统 典型的一个无限循环。 void mytask(void *pdata) for (;;) { do something; waiting; do something; 支持64 个任务,每个任务一个特定的优先级。优先级 越高,数字越小 系统占用了两个任务,空闲任务和统计任务。 2002/11 5

嵌入式操作系统—uC/OS 任务的数据结构—任务控制块 任务控制块 OS_tcb ,包括 任务堆栈指针,状 态,优先级,任务 表 位置,任务链表指针 等。 所有的任务控制块分为两条链表,空闲 链表和使用链表。 新任务TCB (1) TCB0 TCB1 next pre ( 2 ) ( 3 ) OSTCBFr eeList 图 4 .3 TCB的 双向 链表 结构 TCBn 空 2002/116

uCOS-II任务讲解

1.uCos-II操作系统内核的主要工作就是对任务进行管理和调度. 在应用程序设计的角度来看,uCos-II的任务就是一个线程. 2.从任务的存储结构来看,uCOS-II的任务由三个部分组成: 1-任务程序代码(任务的执行部分). 2-任务堆栈(用于保存任务工作环境) 3-任务控制块(用于保存任务属性) 3.uCOS-II的任务有两种,用户任务和系统任务. 由应用程序设计者编写的任务叫做用户任务. 由系统提供的任务叫做系统任务. 用户任务是为解决应用问题而编写的,系统任务是为应用程序来提供某种服务的. 4,任务的5种状态 5.从等待状态不能直接进入运行状态. 6.从程序设计的角度来看,一个uCOS-II任务的代码就是一个C语的函数.为了可以传递各种不同类型的数据甚至是函数,任务的参数是一个void类型的指针.可以说uCOS-II任务是一个代码结构是带有临界段的无限循环. 7.用户任务他不是被主函数或其他函数调用的, 主函数main()只负责创建和启动它们,而操作系统负责来调度运行. 8.OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL用来做临界保护的. 9.OSTaskCreate()为操作系统uCOS-II提供的用来创建任务的函数. 10.OSStart()为操作系统提供启动各任务的函数.启动任务以后,任务就应由操作系统来管理和调度了. 11.uCOS-II预定义了两个为应用程序服务的系统任务:空闲任务和统计任务.其中空闲任务是每个应用程序必须使用的,而统计任务则是应用程序可以根据实际需要来选择使用的. 12.空闲任务:让CPU在没有用户任务可执行时有事可做. OSTaskIdle(): void OSTaskIdle(void *pdata) { #if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif pdata = pdata; //定义了型参没有用,编译器会报警告或者错误 for(;;) { OS_ENTER_CRITICAL(); OSdleCtr++; OS_EXIT_CRITICAL(); } }

嵌入式实时操作系统ucos期末考试题复习过程

) 一、名词解释: 1、OS:操作系统 2、MCU:微控制器 3、ISR:中断服务子程序 4、FIFO:先进先出 5、TCB:Task Control Block,任务控制块 6、API:应用程序接口 7、RTOS:实时操作系统 # 8、UART:通用异步收发传输器 9、MMU:内存管理单元 10、JTAG:边界调试接口 二、填空题 1、( 优先级抢占和时间片轮转)是一种运行时间一到就剥夺进程处理器使用权的剥夺式调度。 2、实时系统的两个基本要求:( 逻辑或功能正确)、时间正确。所谓时间正确是指 (实时系统的计算必须在预定的时间内完成)。 3、临界区是指( 处理时不可分割的代码、每个进程中访问临界资源的那段程序) ` 4、UCOS调用系统延时最小时间单位( 毫秒) 5、UCOS配置文件中OS_TICKS_PER_SEC的数值定义为32,含义是(时钟频率为32 hz) 6如果某一个任务不是必须的监控任务,我们一般采用( 动态内存管理)的机制来创建该任务所需要的变量内存空间,要想能使用这种机制,必须首先将内存交给(操作系统)来统一管理 7、如果系统中某一个资源属于独占资源,n个任务都需要使用,标准的做法是使用(互斥信号量)来解决 8、在UCOS中,优先级用一个数字表示,数字越大表示任务的优先级别越(低) 9、优先级调度的( 任务就绪表)标志进程抢占处理器的权利大小。 10、(任务控制块)主要用来记录任务的堆栈指针,任务的当前状态,任务的优先级别等一些与任务管理有关的属性的表。 11、临界区是指( 保证共享资源的完整性和可靠性的代码段)。 ( 12、可重入指的是(是一段代码(如一个函数)可以被多个任务同时调用,而不必担心会破坏数据)。 13、某事件周期不确定,持续时间较短,处理容忍度较长,通常我们采取在(任务就绪表)中发现该事件,在(任务调度)中处理该事件。 14、如果系统中有2个资源,n个任务都需要使用,标准的做法是使用(互斥信号量)来解决。 15、在UCOS中,最低优先级自动赋给( 空闲任务)这个系统任务。 16、对CPU资源进行分配的两种操作系统常见调度算法为__(任务级调度_)和(中断级调度)。 17、uC/OS中,主要依靠_(任务堆栈_)来保存任务工作环境。

ucos任务的各个状态简述

被中断等待事件。时间挂起 1. 运行状态 任何时候只有一个在运行。正在运行的任务可能会因为等待某一个任务而进 入等待状态,此时下一个优先级更高的进入了就绪状态被赋予了CPU 的控制权,即任务级切换。如果一个未屏蔽中断发生,当前任务将进入中断状态,则在中断返回时将进行任务切换,即更到优先级的任务 2. 就绪状态 如果一个任务所等待的资源除CPU 外已全部获得,则处于就绪状态。如果该 任务的优先级最高,则马上执行。如果当前还有高优先级的任务,则次任务等待更高优先级的任务放弃CPU 的控制权后再调度CPU的使用权。 3. 等待状态 即正在运行的任务需要等待某一事件或时间延迟的发生。当任务因等待事件 被挂起时,下一个优先级更高的立即得到CPU的控制权。当其等待的事件发生了,该被挂起的任务重新进入就绪状态。事件发生的报告可能来自另一个任务,也可能来自中断服务子程序。 4. 休眠状态 任务驻留在程序空间中,还没有交给ucos管理,把任务交给ucos 是通 过调用OSTaskCreate ()或OSTaskCreateExt ()两个函数之一实现的。任务一旦确立将进入就绪状态。一个任务可通过调用OSTaskDel ()返回到休眠状态,即被删除,或通过调用该函数让另外一个任务进入休眠状态。 5. 被中断状态 正在运行的任务可以被中断,除非该任务关闭中断,或ucos 关闭中断。被 中断了的任务即进入了中断服务状态。响应中断时,正在执行的任务被挂起,中断服务子程序控制了CPU 的使用权。中断服务子程序可能会报告一个或多个时间的发生,而使一个或多个任务进入就绪状态。此时,中断服务子程序返回之前,ucos 要判定被中断的任务是否还是就绪态任务中优先级最高的。如果更高的进入了就绪状态,则他会运行,否则原来的继续运行。

嵌入式实时操作系统_uCOSII

uC/OS-II
北京邮电大学计算机学院 邝 坚 2011年10月
教材及参考文献
《嵌入式实时操作系统 uC/OS-II(第2 版)》,Jean https://www.wendangku.net/doc/1c5424481.html,brosse, 邵贝贝, 北航出版 社, 2003年1月

uC/OS-II的主要特点
实时性可确定:绝大多数系统服务的执行时间具有可确定 性,不依赖于用户应用程序Task数目的多少。 多任务、独立栈:最多64个Task,基于优先级抢占调度方 式。每个Task有自身独立的堆栈。 可裁减性:系统最小可裁减到几K到十几K,这种裁减还可 以做到基于函数级。 可移植性:与CPU体系结构相关部分用汇编编写,其他功 能组件CPU无关。 可靠、稳定性:由整个系统设计来保证,市场验证。美国 联邦航空管理局(FAA)认证。 开源代码:内核约5500行C代码。 可固化:面向嵌入式应用。
系统功能
实时内核 任务管理 时间管理 信号量、互斥信号量管理 事件标志组管理 消息邮箱管理 消息队列管理 内存管理 …

Targets x86 68k PPC CPU32 i960 SPARC ARM MIPS XScale …
Typical development configuration
Ethernet
RS-232
Development Host
Target
Typical scenario:
1. Boot target. 4. Download object module. 2. Attach target server. 5. Test & Debug. 3. Edit & compile. 6. Return to 3 or 1 as necessary

嵌入式实时操作系统ucosii课后答案

第一章 1.什么是操作系统?它应具备什么功能? 操作系统是控制其他程序运行,管理系统资源并为用户提供操作界面的系统软件的集合。 功能: 1.计算机硬件的封装和扩充; 2.计算机资源的管理,包括处理器管理、存储器存储空间管理、外部输入输出(I/O)设备管理、文件管理、网络和通信管理、提供用户接口。 2.简述嵌入式操作系统与普通操作系统的区别。 嵌入到对象体系中,为实现对象体系智能化控制的计算机系统,简称嵌入式系统。嵌入式系统应具有的特点是:高可靠性;在恶劣的环境或突然断电的情况下,系统仍然能够正常工作;许多嵌入式应用要求实时性,这就要求嵌入式操作系统具有实时处理能力;嵌入式系统和具体应用有机地结合在一起,它的升级换代也是具体产品同步进行;嵌入式系统中的软件代码要求高质量、高可靠性,一般都固化在只读存储器中或闪存中,也就是说软件要求固态化存储,而不是存储在磁盘等载体中。 3.什么是实时系统?对实时系统有什么要求? 如果一个系统能及时响应外部事件的请求,并能在规定的时间内完成对事件的处理,这种系统称为实时系统。 对实时系统的两个基本要求: 1.实时系统的计算必须产生正确的结果,称为逻辑或功能正确。 2.实时系统的计算必须在预定的时间内完成,称为时间正确。 4.什么是可剥夺内核? 当一个进程正在被处理器所运行时,其他就绪进程可以按照事先规定的规定的规则,强行剥夺正在运行进程的处理器使用权,而使自己获得处理器使用权并得以运行。 5.计算:RM 等三种算法;实时进程的可调度性。 一个事件发生周期为T =200ms ,一般需要运行50ms 才完毕。试按RM 算法确定该进程的优先级别prio 。 答:如果取k=1,根据T=200ms=0.2S ,则 T k prio 1= 结果:prio=5。 假如有三个同时发生的周期型进程:进程1,进程2,进程3,周期分别为P1=70ms ,P2=80ms ,P3=30ms ,它们完成任务的时间分别为:C1=20ms ,C2=15ms ,C3=10ms 。试判断该进程是否为可调度的。 答: 807.0301080157020=++=ρ777 .0)12(3)12(3=-=-n n

ucos II 任务通信与同步

任务的同步与一个通信初解 操作系统就像就像一个好的家长,控制着资源的公平分配 应用程序中的各个任务,必须通过彼此之间的有效合作,才能完成一项大规模的工作。因为这些任务在运行时,经常需要相互无冲突地访问一个共享资源,或者需要相互支持和 依赖,甚至有时候还需要互相加以必要的制约,才能保证任务的顺利进行。因此操作系统 必须具有对任务运行进行协调的能力,从而使任务之间可以无冲突,流畅的同步运行,而 不致导致灾难性的后果。 这与人们依靠通信来相互沟通,从而使人际关系和谐,工作顺利的做法是一样的,计算机系统依靠任务间的良好通信来保证任务与任务的同步。 任何为任务所占用的实体都可以称为资源。资源可以是输入输出设备,比如打印机,键 盘显示器,资源也可以是一个变量,一个结构或者是一个数组。 1任务的同步和事件 嵌入式系统中的各个任务是为同一个大的任务服务的子任务,他们不可避免的要共同使 用一些资源,并且在处理一些需要多个任务共同协同来完成的工作时,还需要相互的支持和限制。因此,对一个完善的多任务操作系统来说,系统必须具有完备的同步和通信机制任务的同步: 为了实现各个任务之间的合作和无冲突的运行,在各个任务之间必须建立一些制约关系。其中一种制约关系叫做直接制约关系,另一种制约关系叫做间接制约关系 直接制约关系来自任务的合作:例如,有任务A和任务B两个任务,他们需要通过访 问同一个数据缓冲区合作完成一项工作,任务A负责向缓冲区写入数据,任务B负责向缓 冲区读取该数据。显然,当任务A还未向缓冲区写入数据时(缓冲区为空时),任务B因 不能从缓冲区得到有效地数据而应处于等待状态;只有等任务A向缓冲区写入了数据之后,才应该通知任务B去读取数据。相反,当缓冲区的数据还未被任务B读取时(缓冲区为满时),任务A就不能向缓冲区写入新的数据而应该处于等待状态;只有当任务B自缓冲区读取数据后,才应该通知任务A写入数据。显然,如果这两个任务不能如此协调工作,将势必造成严重的后果。 间接制约关系源于对资源的共享:例如:任务A和任务B共享一台打印机,如果系统已经把打印机分配给了任务A,则任务B因不能获得打印机的使用权而应该处于等待状态; 只有当任务A把打印机释放后,系统才能唤醒任务B使其获得打印机的使用权。如果这两 个系统不这样做,那么也会造成严重的后果。

uCOSII实时操作系统通信机制之内核分析

μC/OS-II通信机制之内核分析 摘要:本文主要着重对μC/OS-III通信机制的内核分析,研究μC/OS-II内核通信机制的实现方式及实现的技巧,同时分析其中不足之处。 1.引言 μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。 uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。 μC/OS-II这款操作系统内核简单易学,通过对其源代码的分析,可以加深我们对操作系统内核的理解,为学习linux等大型操作系统打下基础。 2.操作系统中任务间的通信机制 内核中多个任务之间不可避免的存在相互协同的关系,来完成一定的内核功能。这种协同最直观的就是任务间相互通信。。包括VxWorks 等所有的嵌入式操作系统一般都会提供许多任务间通信的方法,通常包括: (1)共享内存,数据的简单共享。 (2)信号量,基本的互斥和同步。 (3)消息队列和管道,同一CPU 内多任务间消息传递。 (4)Socket 和远程调用,任务间透明的网络通信。 (5)Signals,用于异常处理。 在μC/OS-II中设计了五种通讯机制,或者说是同步机制,分别是信号量(semaphore),互斥体(mutual exclusion semaphore),事件组(event flag),邮箱(message box)和队列(queue)。 3. uC/OS-II中通信机制实现的方式分析 在uC/OS-II中是如何通信机制呢?这几种通信机制有什么关系?或者说有什么共同点有什么不同点?在实现上有哪些步骤是相同的?下面将就这几个问题进行分析论述。 我们知道通信机制是发生在任务之间的,换句话说任务与通信机制存在着关联。在内核又是如何处理这种关联呢?通信机制具体来说是信号量,互斥量,邮箱,队列等。通信机制协调的关系一般是针对两个以上的任务,比如说当两个任务互斥的访问共享资源,就需要一个互斥量,这个互斥量就关联着这两个任务。同样的道理,其他通信机制也是关联着两个以上的任务。那么设计内核时就要考虑如何将他们的关系有效协调地统一管理起来。 在内核中是通过一个事件控制块来实现通信机制与任务的联系。这里所说的事件就是指任务间进行通信时传递信号的统称。这里其实是利用到了一种抽象的思想,即将各种通信机制的共同点抽象出来,于是内核就设计了一个事件控制块的数据结构,这个数据结构是所有通信机制都会用到的,这样的设计就节省了不少代码,因为有共同点意味着有重复代码。 既然知道了事件控制块是实现通信机制代码共享的关键,那么下面我们就来分析下它的数据结构。

相关文档
相关文档 最新文档