ucos函数简析

本文主要介绍了μC/OS-II操作系统中的几个核心函数,包括OSInit()、OSIntEnter()、OSIntExit()、OSSchedLock()、OSSchedUnlock()以及任务创建和管理的相关函数。这些函数对于理解和使用μC/OS-II进行嵌入式系统开发至关重要,涉及任务调度、中断处理和资源管理等方面。
摘要由CSDN通过智能技术生成

因为工作原因N久没有来更新博客了,现在谈一下博主最近在开发的ucos平台的一些基本函数,下一章将放出我在ucos平台上开发的一个,mp4的源代码和电路图。

Void OSInit(void);

所属文件——OS_CORE.C       调用者——启动代码           开关量——无

OSinit()初始化μC/OS-Ⅱ,对这个函数的调用必须在调用OSStart()函数之前,而OSStart()函数真正开始运行多任务。

 

Void OSIntEnter(void);

所属文件——OS_CORE.C       调用者——中断               开关量——无

OSIntEnter()通知μC/OS-Ⅱ一个中断处理函数正在执行,这有助于μC/OS-Ⅱ掌握中断嵌套的情况。OSIntEnter()函数通常和OSIntExit()函数联合使用。

注意/警告:在任务级不能调用该函数。如果系统使用的处理器能够执行自动的独立执行读取-修改-写入的操作,那么就可以直接递增中断嵌套层数(OSIntNesting),这样可以避免调用函数所带来的额外的开销。

 

Void OSIntExit(void);

所属文件——OS_CORE.C          调用者——中断                开关量——无

OSIntExit()通知μC/OS-Ⅱ一个中断服务已执行完毕,这有助于μC/OS-Ⅱ掌握中断嵌套的情况。通常OSIntExit()和OSIntEnter()联合使用。当最后一层嵌套的中断执行完毕后,如果有更高优先级的任务准备就绪,μC/OS-Ⅱ会调用任务调度函数,在这种情况下,中断返回到更高优先级的任务而不是被中断了的任务。

注意/警告:在任务级不能调用该函数。并且即使没有调用OSIntEnter()而是使用直接递增OSIntNesting的方法,也必须调用OSIntExit()函数。

 

Void OSSchedLock(void);

所属文件——OS_CORE.C          调用者——任务或中断          开关量——N/A

OSSchedLock()函数停止任务调度,只有使用配对的函数OSSchedUnlock()才能重新开始内核的任务调度。调用OSSchedLock()函数的任务独占CPU,不管有没有其他高优先级的就绪任务。在这种情况下,中断仍然可以被接受和执行(中断必须允许)。OSSchedLock()函数和OSSchedUnlock()函数必须配对使用。μC/OS-Ⅱ可以支持多达254层的OSSchedLock()函数嵌套,必须调用同样次数的OSSchedUnlock()函数才能恢复任务调度。

注意/警告:任务调用了OSSchedLock()函数后,决不能再调用可能导致当前任务挂起的系统函数:OSTimeDly(),OSTimeDlyHMSM(),OSSemPend(),OSMboxPend(),OSQPend()。因为任务调度已经被禁止,其他任务不能运行,这会导致系统死锁。

 

Void OSSchedUnlock(void);

所属文件——OS_CORE.C          调用者——任务或中断           开关量——N/A

在调用了OSSchedLock()函数后,OSSchedUnlock()函数恢复任务调度。

注意/警告:任务调用了OSSchedLock()函数后,决不能再调用可能导致当前任务挂起的系统函数:OSTimeDly(),OSTimeDlyHMSM(),OSSemPend(),OSMboxPend(),OSQPend()。因为任务调度已经被禁止,其他任务不能运行,这会导致系统死锁。

 

void OSStart(void);

所属文件——OS_CORE.C            调用者——初始代码           开关量——无

OSStart( )启动μC/OS-II的多任务环境。

注意/警告:在调用OSStart( )之前必须先调用OSInit ( )。在用户程序中OSStart( )只能被调用一次。第二次调用OSStart( )将不进行任何操作。

 

void OSStatInit (void);

所属文件——OS_CORE.C    调用者——初始代码  开关量——OS_TASK_STAT_EN &&OS_TASK_CREATE_EXT_EN

OSStatInit()获取当系统中没有其他任务运行时,32位计数器所能达到的最大值。OSStatInit()的调用时机是当多任务环境已经启动,且系统中只有一个任务在运行。也就是说,该函数只能在第一个被建立并运行的任务中调用。

 

INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio);

所属文件——OS_TASK.C    调用者——任务  开关量——OS_TASK_CHANGE_PRIO_EN

OSTaskChangePrio()改变一个任务的优先级。

参数

oldprio  是任务原先的优先级。

newprio   是任务的新优先级。

返回值

OSTaskChangePrio()的返回值为下述之一:

OS_NO_ERR:任务优先级成功改变。

OS_PRO_INVALID:参数中的任务原先优先级或新优先级大于或等于OS_LOWEST_PRIO

OS_PRIO_EXIST:参数中的新优先级已经存在。

OS_PRIO_ERR:参数中的任务原先优先级不存在。

注意/警告:参数中的新优先级必须是没有使用过的,否则会返回错误码。在OSTaskChangePrio()中还会先判断要改变优先级的任务是否存在

 

INT8U OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio);

所属文件——OS_TASK.C    调用者——任务或初始化代码       开关量——无

OSTaskCreate()建立一个新任务。任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立。中断处理程序中不能建立任务。一个任务必须为无限循环结构,且不能有返回点。

OSTaskCreate()是为与先前的μC/OS版本保持兼容,新增的特性在OSTaskCreateExt()函数中。

无论用户程序中是否产生中断,在初始化任务堆栈时,堆栈的结构必须与CPU中断后寄存器入栈的顺序结构相同。详细说明请参考所用处理器的手册。

参数

task是指向任务代码的指针。

pdata指向一个数据结构,该结构用来在建立任务时向任务传递参数。

ptos为指向任务堆栈栈顶的指针。任务堆栈用来保存局部变量,函数参数,返回地址以及任务被中断时的CPU寄存器内容。任务堆栈的大小决定于任务的需要及预计的中断嵌套层数。计算堆栈的大小,需要知道任务的局部变量所占的空间,可能产生嵌套调用的函数,及中断嵌套所需空间。如果初始化常量OS_STK_GROWTH设为1,堆栈被设为从内存高地址向低地址增长,此时ptos应该指向任务堆栈空间的最高地址。反之,如果OS_STK_GROWTH设为0,堆栈将从内存的低地址向高地址增长。

prio为任务的优先级。每个任务必须有一个唯一的优先级作为标识。数字越小,优先级越高。

返回值

OSTaskCreate()的返回值为下述之一:

OS_NO_ERR:函数调用成功。

OS_PRIO_EXIST:具有该优先级的任务已经存在。

OS_PRIO_INVALID:参数指定的优先级大于OS_LOWEST_PRIO

OS_NO_MORE_TCB:系统中没有OS_TCB可以分配给任务了。

注意/警告:任务堆栈必须声明为OS_STK类型。

在任务中必须调用μC/OS提供的下述过程之一:延时等待、任务挂起、等待事件发生(等待信号量,消息邮箱、消息队列),以使其他任务得到CPU

用户程序中不能使用优先级0123,以及OS_LOWEST_PRIO-3, OS_LOWEST_PRIO-2, OS_LOWEST_PRIO-1, OS_LOWEST_PRIO。这些优先级μC/OS系统保留,其余的56个优先级提供给应用程序。

 

INT8U OSTaskCreateExt(void (*task)(void *pd), void *pdata, OS_STK *ptos,INT8U prio, INT16U id, OS_STK *pbos, INT32U stk_size, void *pext, INT16U opt);

所属文件——OS_TASK.C      调用者——任务或初始化代码      开关量——无

OSTaskCreateExt()建立一个新任务。与OSTaskCreate()不同的是,OSTaskCreateExt()允许用户设置更多的细节内容。任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立,但中断处理程序中不能建立新任务。一个任务必须为无限循环结构(如下所示),且不能有返回点。

参数

task是指向任务代码的指针。

pdata指针指向一个数据结构,该结构用来在建立任务时向任务传递参数。下例中说明μC/OS中的任务代码结构以及如何传递参数pdata:(如果在程序中不使用参数pdata,为了避免在编译中出现参数未使用的警告信息,可以写一句pdata= pdata;)

ptos为指向任务堆栈栈顶的指针。任务堆栈用来保存局部变量,函数参数,返回地址以及中断时的CPU寄存器内容。任务堆栈的大小决定于任务的需要及预计的中断嵌套层数。计算堆栈的大小,需要知道任务的局部变量所占的空间,可能产生嵌套调用的函数,及中断嵌套所需空间。如果初始化常量OS_STK_GROWTH设为1,堆栈被设为向低端增长(从内存高地址向低地址增长)。此时ptos应该指向任务堆栈空间的最高地址。反之,如果OS_STK_GROWTH设为0,堆栈将从低地址向高地址增长。

prio为任务的优先级。每个任务必须有一个唯一的优先级作为标识。数字越小,优先级越高。id是任务的标识,目前这个参数没有实际的用途,但保留在OSTaskCreateExt()中供今后扩展,应用程序中可设置id与优先级相同。

pbos为指向堆栈底端的指针。如果初始化常量OS_STK_GROWTH设为1,堆栈被设为从内存高地址向低地址增长。此时pbos应该指向任务堆栈空间的最低地址。反之,如果OS_STK_GROWTH设为0,堆栈将从低地址向高地址增长。pbos应该指向堆栈空间的最高地址。参数pbos用于堆栈检测函数OSTaskStkChk()。

stk_size 指定任务堆栈的大小。其单位由OS_STK定义:当OS_STK的类型定义为INT8UINT16UINT32U的时候, stk_size的单位为分别为字节(8位)、字(16位)和双字(32位)。pext是一个用户定义数据结构的指针,可作为TCB的扩展。例如,当任务切换时,用户定义的数据结构中可存放浮点寄存器的数值,任务运行时间,任务切入次数等等信息。opt存放与任务相关的操作信息。opt的低8位由μC/OS保留,用户不能使用。用户可以使用opt的高8位。每一种操作由opt中的一位或几位指定,当相应的位被置位时,表示选择某种操作。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值