任务管理(uC/OS-II)

任务可以是一个无限的循环,也可以在一次执行完毕后被删除掉。任务的返回类型必须定义成void,只是它决不返回。任务必须是以下两种结构之一:

void YourTask(void *pdata)
{
    for (;;)
    {
        /*用户代码*/
    }
}

void YourTask(void *pdata)
{
    /*用户代码*/
    OSTaskDel(OS_PRIO_SELF);
}

一、建立任务

OSTaskCreate()或OSTaskCreateExt()建立任务。任务可以在多任务调度开始前建立,也可在其他任务的执行过程中建立。在开始多任务调度(调用OSStart())前,必须建立至少一个任务。任务不能由中断服务程序(ISR)建立。

注意:

(1)OSTaskCreate()或OSTaskCreateExt()须确保定义的优先级没有被其他任务占用。在uC/OS-II中,每个任务的优先级必须各不相同。

(2)如果OSTaskCreate()函数是在某个任务的执行过程中被调用的(OSRunning == TRUE),则任务调度函数会被调用,以判断新建立的任务是否比原来的任务有更高的优先级。如果新任务的优先级更高,内核会进行一次从旧任务到新任务的任务切换。如果该任务是在多任务调度开始之前建立的,则任务调度函数不会起作用。

(3)OSTaskCtr用于跟踪已建立的任务数目。

二、任务堆栈

堆栈必须声明为OS_STK类型,并且由连续的内存空间组成。可以静态分配堆栈空间(编译时分配),也可以动态分配堆栈空间(运行时分配)。

typedef INT32U         OS_STK;

注意:在动态分配中,要时刻注意内存碎片问题。特别是当反复建立和删除任务时,内存堆中可能会出现大量的内存碎片,导致没有足够大的一块连续内存区域可用做任务堆栈。

当OS_STK_GROWTH == 1时,堆栈是从上往下递减的,需将堆栈的最高内存地址传递给任务创建函数。

当OS_STK_GROWTH == 0时,堆栈是从下往上递增的,需将堆栈的最低内存地址传递给任务创建函数。

三、删除任务

删除任务,是说任务将返回并处于休眠状态,并不是说任务的代码被删除了,只是任务的代码不再被uC/OS-II调用。

时间: 2024-10-10 20:18:50

任务管理(uC/OS-II)的相关文章

uC/OS II 任务切换原理

今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引发一次中断,自动将CS.IP寄存器压入堆栈,再利用中断返回,将新任务的任务断点指针弹出到CPU的CS.IP寄存器中,实现任务切换.虽然明白个大概,但是其中的细节却有点模糊,为什么调用IRET中断返回指令后,弹入CPU的CS.IP寄存器的断点指针是新任务的断点指针,而不是当前任务的,UCOS II是如

uC/OS II 函数说明 之–OSTaskCreate()与OSTaskCreateExt()

1. OSTaskCreate()    OSTaskCreate()建立一个新任务,能够在多任务环境启动之前,或者执行任务中建立任务.注意,ISR中禁止建立任务,一个任务必须为无限循环结构.        源码例如以下: #if OS_TASK_CREATE_EN > 0                    /* 条件编译,是否同意任务的创建               */INT8U  OSTaskCreate (void (*task)(void *pd), /* 函数指针,void *

【原创】uC/OS 中LES BX,DWORD PTR DS:_OSTCBCur的作用及原理

1 LES BX, DWORD PTR DS:_OSTCBCur ;取得任务堆栈指针ES:[BX] 2 MOV ES:[BX+2], SS ;将当前SS(栈的基地址)寄存器值存放至当前任务堆栈的2,3内存单元 3 MOV ES:[BX+0], SP ;将当前SP(栈顶的偏移量)存放至当前任务堆栈的0,1内存单元 首先讲讲LES指针的功能:LES的功能有点像C语言的*. LES REG,MEM 参与操作的寄存器不仅有REG,还有ES寄存器.在16位系统中,寄存器为16位,很显然,MEM所指向的内存

uC/OS 的任务调度解析 (转)

uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS使用的是OSStartHighRdy OSStartHighRdy LDR R0, =NVIC_SYSPRI14 ; Set the PendSV exception priority LDR R1, =NVIC_PENDSV_PRI STRB R1, [R0] MOVS R0, #0 ; Set

关于uC/OS的简单学习(转)

1.微内核 与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括: 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等. 中断处理函数,且处理函数非常简单,一般仅是向相应的Task发消息,唤醒该Task来处理中断任务. 一个高效的调度器,这是OS的灵魂,实现多任务间的调度(包括调度点.调度算法.任务切换等). 好像就这么点,呵呵.它不支持内存保护,即不像Linux那样分用户空间.内核空间.如一个Task运行时,可调用内核函数Task

uc os相关的C语言知识点1-函数指针

开始读uc os的代码了,发现很多C语言的东西,之前没搞懂的,慢慢积累. 就象某一数据变量的内存地址可以存储在相应的指针变量中一样,函数的首地址也以存储在某个函数指针变量里的.这样,我就可以通过这个函数指针变量来调用所指向的函数了. 形式1:返回类型(*函数名)(参数表) ,例子如下: #include<stdio.h> void (*funp)(int); //定义一个函数指针,注意函数的返回类型和参数类型和指针的一致,才可以用. void print(int n); //函数申明 int

uc/os iii移植到STM32F4---IAR开发环境

也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢出警告(为何keil没有报堆栈溢出??),网上有人说不用理会,但是实际使用时发生了错误(定义的常量数组值被改变,怀疑是堆栈溢出导致),发现使用的IAR版本不能完美支持使用的STM32芯片,换用高版本测试..(高版本正确,与低版本对芯片的支持有关) 2.开始时虽然会堆栈溢出,但是能够进入异常中断,进入

FreeRTOS与uc/os

一.freeRTOS比uCOS II优胜的地方: 1.内核ROM和耗费RAM都比uCOS 小,特别是RAM. 这在单片机里面是稀缺资源,uCOS至少要5K以上, 而freeOS用2~3K也可以跑的很好. 2.freeRTOS 可以用协程(Co-routine),减少RAM消耗(共用STACK).uCOS只能用任务(TASK,每个任务有一个独立的STACK). 3.freeRTOS 可以有优先度一样的任务,这些任务是按时间片来轮流处理,uCOSII 每个任务都只有一个独一无二的优先级.因此,理论上

uc/os 笔记(转)

1.uC/OS-II中使用互斥信号对象应该注意 互斥信号对象(Mutual Exclusion Semaphore)简称Mutex,是uC/OS-II的内核对象之一,用于管理那些需要独占访问的资源,并使其适应多任务环境. 创建每一个Mutex,都需要指定一个空闲的优先级号,这个优先级号的优先级必须比所有可能使用此Mutex的任务的优先级都高! uC/OS-II的Mutex实现原理大致如下:    当一个低优先级的任务A申请并得到了Mutex,于是它获得资源访问权.如果此后有一个高优先级的任务B开

UC/OS操作系统 (转)

1.和其他一些著名的嵌入式操作系统不同,uC/OS-II在单片机系统中的启动过程比较简单,不像有些操作系统那样,需要把内核编译成一个映像文件写入ROM中,上电复位后,再从ROM中把文件加载到RAM中去,然后再运行应用程序.uC/OS-II的内核是和应用程序放在一起编译成一个文件的,使用者只需要把这个文件转换成HEX格式,写入ROM中就可以了,上电后,会像普通的单片机程序一样运行. 2.uC/OS-II的移植也是一件需要值得注意的工作.如果没有现成的移植实例的话,就必须自己来编写移植代码.虽然只需