ucos—II函数大全(可编辑修改word版)

合集下载

uCOS-II_常用函数查询

uCOS-II_常用函数查询

第11章参考手册本章提供了uC/OS-Ⅱ的用户指南。

每一个用户可以调用的内核函数都按字母顺序加以说明,包括:函数的功能描述函数原型函数名称及源代码函数使用到的常量函数参数函数返回值特殊说明和注意点OSInit()Void OSInit(void);所属文件调用者开关量OS_CORE.C启动代码无OSinit()初始化uC/OS-Ⅱ,对这个函数的调用必须在调用OSStart()函数之前,而OSStart ()函数真正开始运行多任务。

注意/警告:必须先于OSStart()函数的调用范例:void main(void){……OSInit();//初始化uC/OS-II.OSStart();//启动多任务内核}void OSInit(void){#if OS_VERSION>=204OSInitHookBegin();//Call port specific initialization code#endifOS_InitMisc();//Initialize miscellaneous variablesOS_InitRdyList();//Initialize the Ready ListOS_InitTCBList();//Initialize the free list of OS_TCBsOS_InitEventList();//Initialize the free list of OS_EVENTs#if(OS_VERSION>=251)&&(OS_FLAG_EN>0)&&(OS_MAX_FLAGS>0) OS_FlagInit();//Initialize the event flag structures#endif#if(OS_MEM_EN>0)&&(OS_MAX_MEM_PART>0)OS_MemInit();//Initialize the memory manager#endif#if(OS_Q_EN>0)&&(OS_MAX_QS>0)OS_QInit();//Initialize the message queue structures*/#endifOS_InitTaskIdle();//Create the Idle Task#if OS_TASK_STAT_EN>0OS_InitTaskStat();//Create the Statistic Task#endif#if OS_VERSION>=204OSInitHookEnd();//Call port specific init.code#endif}OSIntEnter()Void OSIntEnter(void);所属文件调用者开关量OS_CORE.C中断无OSIntEnter()通知uC/OS-Ⅱ一个中断处理函数正在执行,这有助于uC/OS-Ⅱ掌握中断嵌套的情况。

uC OS II

uC OS II
进行任务堆栈的压栈工作以后,就可以调整SP的指针到系统堆栈了。压栈后的SP指向最后一个压栈内容①。 我们把SP的值赋值给优先级6任务的TCB->OSTCBStkPtr,以便进行任务调度的时候出栈使用②。接着,就把SP调 整到系统堆栈处③。在中断处理过程中,可能会出现压栈的操作,那么这种情况下SP的指针会随之移动。
调度工作的内容可以分为两部分:最高优先级任务的寻找和任务切换。其最高优先级任务的寻找是通过建立 就绪任务表来实现的。
中断机理
1
引言
2
组成部分
3
中断处理
4
函数调用
5
中断调用
在嵌入式操作系统领域,由Jean J. Labrosse开发的μC/OS,由于开放源代码和强大而稳定的功能,曾经 一度在嵌入式系统领域引起强烈反响。而其本人也早已成为了嵌入式系统会议(美国)的顾问委员会的成员。
(综合电子论坛)
优先级
优先翻转
运行机制
翻转解决
在嵌入式系统的应用中,实时性是一个重要的指标,而优先级翻转是影响系统实时性的重要问题。本文着重 分析优先级翻转问题的产生和影响,以及在uC/OS-II中的解决方案。
在ANSI C中是使用malloc和free两个函数来动态分配和释放内存。但在嵌入式实时系统中,多次这样的操作 会导致内存碎片,且由于内存管理算法的原因,malloc和free的执行时间也是不确定。
uC/OS-II中把连续的大块内存按分区管理。每个分区中包含整数个大小相同的内存块,但不同分区之间的内 存块大小可以不同。用户需要动态分配内存时,系统选择一个适当的分区,按块来分配内存。释放内存时将该块 放回它以前所属的分区,这样能有效解决碎片问题,同时执行时间也是固定的。
时钟部分(OSTime.c) μC/OS-II中的最小时钟单位是timetick(时钟节拍)。任务延时等操作是在这里完 成的。

第五篇:uCOS-II

第五篇:uCOS-II

第五篇:uCOS-II 信号量及其操作1.信号量使⽤信号量之前⾸先要对信号量有⼀个本质的认识(1)信号量的含义:信号量是⼀类事件,使⽤信号量的最初⽬的是为了给共享资源设⽴⼀个标志,该标志表⽰共享资源的占⽤情况,这样,当⼀个任务在访问共享资源之前,就可以对这个标志进⾏查询,从⽽在了解资源被占⽤的情况之后,再来决定⾃⼰的⾏为。

(2)UCOS-II的信号量⾥⾯有⼀个OSEventCnt,正确的认识这个,是使⽤信号量的关键。

OSSemCreate(0):这种情况下可以⽤任务的同步。

OSSemCreate(1):这种情况类似于互斥信号量,有⼀个名字就是⼆值信号量,可⽤于⼀个资源的使⽤OSSemCreate(>1):这种情况表⽰有>1个资源可以使⽤。

(3)OSEventCnt的初始数据代表可⽤的资源数,1就是⼀个可⽤资源,n就是n可⽤资源。

(4)OSTimeTick 函数⾥⾯有⼀个需要注意的地⽅。

a如果事件中设置了0SxxxPend的延时的话,会进到下⾯函数的这个地⽅。

b如果设置的是⼀直等到的话,将通过OSXXXPost释放。

在延迟的时间⾥⾯没有就绪的话,任务OSTCBStatPend被设置成超时,并清除相应的标志位。

if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {ptcb->OSTCBStat &= (INT8U)~(INT8U)OS_STAT_PEND_ANY;ptcb->OSTCBStatPend = OS_STAT_PEND_TO;}在延迟的时间⾥⾯任务收到信息,任务OSTCBStatPend被设置成OKelse{ptcb->OSTCBStatPend = OS_STAT_PEND_OK;}如果任务没有被挂起的话,任务将加⼊到就绪列表。

if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) {OSRdyGrp |= ptcb->OSTCBBitY;OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;}(5)下⾯分两种情况进⾏详细的讨论A. OSSemCreate(0)这种情况下⽤于信号的同步OSSemPen(xx, 0, xx)设置为0的话,任务将被⼀直挂起直到收到OSSemPost信号。

ucosII中文教程

ucosII中文教程

ucosII中文教程(转1)1.01 INCLUDES.H用户将注意到本书中所有的*.C 文件都包括了以下定义:#include "includes.h"INCLUDE.H 可以使用户不必在工程项目中每个*.C文件中都考虑需要什么样的头文件。

换句话说,INCLUDE.H是主头文件。

这样做唯一的缺点是INCLUDES.H中许多头文件在一些*.C文件的编译中是不需要的。

这意味着逐个编译这些文件要花费额外的时间。

这虽有些不便,但代码的可移植性却增加了。

本书中所有的例子使用一个共同的头文件INCLUDES.H,3个副本分别存放在\SOFTWARE\uCOS-II\EX1_x86L,\ SOFTWARE\uCOS-II\EX2_x86L,以及\SOFTWARE\uCOS-II\EX3_x86L 中。

当然可以重新编辑INCLUDES.H以添加用户自己的头文件。

1.02不依赖于编译的数据类型因为不同的微处理器有不同的字长,µC/OS-II的移植文件包括很多类型定义以确保可移植性(参见\SOFTWARE\uCOS-II\Ix86L\OS_CPU.H,它是针对80x86的实模式,在大模式下编译)。

µCOS-II不使用C语言中的short,int,long等数据类型的定义,因为它们与处理器类型有关,隐含着不可移植性。

笔者代之以移植性强的整数数据类型,这样,既直观又可移植,如表L1.1所示。

为了方便起见,还定义了浮点数数据类型,虽然µC/OS- II中没有使用浮点数。

程序清单L1.1 可移植型数据类型。

Typedef unsigned char BOOLEAN;Typedef unsigned char INT8U;Typedef signed char INT8S;Typedef unsigned int INT16U;Typedef signed int INT16S;Typedef unsigned long INT32U;Typedef signed long INT32S;Typedef float FP32;Typedef double FP64;#define BYTE INT8S#define UBYTE INT8U#define WORD INT16S#define UWORD INT16U#define LONG INT32S#define ULONG INT32U以INT16U数据类型为例,它代表16位无符号整数数据类型。

uCOS-II 常用函数参考手册

uCOS-II 常用函数参考手册

uC/OS-II 常用函数参考手册任务管理1 OSTaskCreate()建立一个新任务。

任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立。

中断处理程序中不能建立任务。

一个任务可以为无限循环的结构。

函数原型:INT8U OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8Uprio);参数说明:task 是指向任务代码首地址的指针。

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

ptos is a pointer to the task's top of stack. If the configuration constantOS_STK_GROWTH is set to 1, the stack is assumed to grow downward (i.e. from high memoryto low memory). 'pstk' will thus point to the highest (valid) memory location of the stack. If OS_STK_GROWTH is set to 0, 'pstk' will point to the lowest memory location of the stack and the stack will grow with increasing memory locations.prio is the task's priority. A unique priority MUST be assigned to each task and thelower the number, the higher the priority.返回值:OSTaskCreate() 的返回值为下述之一:* OS_NO_ERR:函数调用成功。

UCOSⅡ 基本函数

UCOSⅡ 基本函数

UC/OSⅡ基本函数************************************************************************************************ * 事件标志管理 (EVENT FLAGS MANAGEMENT)** OSFlagAccept() 检查事件标志组函数(标志组的指针、事件标志位、等待事件标志位的方式、错误码指针) * OSFlagCreate() 建立一个事件标志组(初值、错误码)* OSFlagDel() 删除一个事件标志组(指针、条件值、错误值)* OSFlagPend() 等待事件标志组的事件标志位(事件组指针、需要检查的标志位、等待事件标志位的方式、* 允许等待的时钟节拍、出错代码的时钟节拍)* OSFlagPost() 置位或清0事件标志组中的标志位(指针、标志位、条件值、错误码)* OSFlagQuery() 查询事件标志组的当前事件标志状态(事件标志组的指针、错误代码的指针)************************************************************************************************************************************************************************************************ * 消息邮箱管理 (MESSAGE MAILBOX MANAGEMENT)** OSMboxAccept () 查看消息邮箱(消息邮箱指针)* OSMboxCreate () 建立并初始化一个消息邮箱(msg 参数不为空含内容)* OSMboxDel () 删除消息邮箱(消息邮箱指针、删除条件、出错代码指针)* OSMboxPend () 等待一个消息邮箱函数(消息邮箱指针、允许等待的时钟节拍、代码错误指针)* OSMboxPost () 发送消息函数(消息邮箱指针、即将实际发送给任务的消息)* OSMboxPostOpt () 向邮箱发送一则消息(邮箱指针、消息、条件)* OSMboxQuery () 查询一个邮箱的当前状态(信号量指针、状态数据结构指针)************************************************************************************************ ************************************************************************************************ * 内存管理项 (MEMORY MANAGEMENT)* OSMemCreate () 建立并初始化一块内存区(起始地址、需要的内存块数目、内存块大小、返回错误的指针) * OSMemGet () 从内存区分配一个内存块* OSMemPut () 释放一个内存块,内存块必须释放回原先申请的内存区* OSMemQuery () 得到内存区的信息************************************************************************************************************************************************************************************************ * 互斥型信号量项管理 (MUTUAL EXCLUSION SEMAPHORE MANAGEMENT)** OSMutexAccept () 无等待地获取互斥型信号量[任务不挂起](信号量指针、错误代码)* OSMutexCreate () 建立并初始化一个互斥型信号量(优先级继承优先级(PIP)、出错代码指针)* OSMutexDel () 删除互斥型信号量(信号指针、删除条件、错误指针)* OSMutexPend () 等待一个互斥型信号量(指针、等待超时时限、出错代码指针)* OSMutexPost () 释放一个互斥型信号量(互斥型信号量指针)* OSMutexQuery () 查询一个互斥型信号量的当前状态(互斥型信号量指针、状态数据结构指针)************************************************************************************************************************************************************************************************ * 消息队列管理 (MESSAGE QUEUE MANAGEMENT)** OSQAccept () 检查消息队列中是否已经有需要的消息(消息队列的指针)* OSQCreate () 建立一个消息队列(消息内存区的基地址(指针数组)、消息内存区的大小)* OSQDel () 删除一个消息队列(消息队列指针、删除条件、错误指针)* OSQFlush () 清空消息队列(指向得到消息队列的指针)* OSQPend () 任务等待消息队列中的消息(消息队列指针、允许等待的时钟节拍、代码错误指针)* OSQPost () 向消息队列发送一则消息FIFO(消息队列指针、发送的消息)* OSQPostFront () 向消息队列发送一则消息LIFO(消息队列指针、发送的消息)* OSQPostOpt () 向消息队列发送一则消息LIFO(消息队列指针、发送的消息、发送条件)* OSQQuery () 查询一个消息队列的当前状态(信号量指针、状态数据结构指针)************************************************************************************************/*********************************************************************************************** * 消息队列数据 (MESSAGE QUEUE DATA)************************************************************************************************ */队列控制块是一个用于维护消息队列信息的数据结构,它包含了以下的一些域。

ucos ii 46个系统API函数解析

ucos ii 46个系统API函数解析

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/AOSSchedLock()函数停止任务调度,只有使用配对的函数OSSchedUnlock()才能重新开始内核的任务调度。

调用OSSchedLock()函数的任务独占CPU,不管有没有其他高优先级的就绪任务。

在这种情况下,中断仍然可以被接受和执行(中断必须允许)。

uCOSII函数说明(一)--OSTaskCreate()与OSTaskCreateExt()

uCOSII函数说明(一)--OSTaskCreate()与OSTaskCreateExt()

uCOSII函数说明(一)--OSTaskCreate()与OSTaskCreateExt()uC/OS II 函数说明 (2010-04-17 15:05)分类:UCOS ARMuC/OS II 函数说明(一)--OSTaskCreate()与OSTaskCreateExt()1. OSTaskCreate()OSTaskCreate()建立一个新任务,可以在多任务环境启动之前,或者运行任务中建立任务。

注意,ISR中禁止建立任务,一个任务必须为无限循环结构。

源代码如下:#if OS_TASK_CREATE_EN >0 /* 条件编译,是否允许任务的创建 */INT8U OSTaskCreate (void(*task)(void *pd), /* 函数指针,void *pd为函数的参数 */void *pdata, /* 建立任务时,传递的参数 */OS_STK *ptos, /* 指向堆栈任务栈顶的指针 */INT8U prio) /* 任务优先级 */{#if OS_CRITICAL_METHOD ==3 /* Allocate storage for CPUstatus register */OS_CPU_SR cpu_sr;#endifOS_STK *psp;INT8U err;#if OS_ARG_CHK_EN > 0if (prio > OS_LOWEST_PRIO) { /* 参数检查,优先级是否处于允许优先级之内 */return (OS_PRIO_INVALID);}#endifOS_ENTER_CRITICAL(); /* 关中断 */if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* 判断任务的优先级是否存在,如不存在,设置任 */OSTCBPrioTbl[prio] = (OS_TCB *)1; /* 务优先级为1设置优先级后,就可以开中断了, *//* 不用担心冲突,因为该优先级已经被占了 */OS_EXIT_CRITICAL();psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, 0);/* 初始化堆栈,此函数与具体的硬件有关,OS_CPU_C.C */err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0); /* 详见此函数的说明 */if (err == OS_NO_ERR) {OS_ENTER_CRITICAL();OSTaskCtr++; /* 任务计数器加1,统计运行的任务数 */OS_EXIT_CRITICAL();if (OSRunning == TRUE) { /* 如果是在任务运行过程中新建任务,需要进行 */OS_Sched(); /* 任务调度,保证优先级最高的任务处于运行态 */}} else {OS_ENTER_CRITICAL();OSTCBPrioTbl[prio] = (OS_TCB *)0;/*如果任务创建失败,优先级设置为0,放弃该 *//* 任务的优先级保证别的任务创建时可以使用 *//* 此优先级 */OS_EXIT_CRITICAL();}return (err); /* 创建任务失败,返回错误代码 */}OS_EXIT_CRITICAL();return (OS_PRIO_EXIST); /*返回OS_PRIO_EXIST,告知任务优先级已经存在 */}#endif2. OSTaskCreateExt()OSTaskCreateExt()为OSTaskCreate()的扩展函数,允许更多的内容设置。

UCOSII部分函数中文注释

UCOSII部分函数中文注释

1.时间管理函数1). void OSTimeDly (INT16U ticks);任务延时函数。

2). INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli);按时、分、秒、毫秒延时函数。

3). INT8U OSTimeDlyResume (INT8U prio);让处在延时期的任务结束延时函数。

4). INT32U OSTimeGet (void);系统时间函数。

5). void OSTimeSet (INT32U ticks) ;系统时间函数。

6). void OSTimeTick (void);系统时钟节拍。

2.任务管理函数1). INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio);优先级变更。

2). INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio);任务建立。

3). 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);任务建立。

4). INT8U OSTaskDel (INT8U prio);删除任务。

5). INT8U OSTaskDelReq (INT8U prio);请求删除任务。

6). INT8U OSTaskResume (INT8U prio);任务信息的获取。

7). INT8U OSTaskStkChk (INT8U prio, OS_STK_DA TA *pdata);任务恢复。

UCOS-II编程要点讲解

UCOS-II编程要点讲解

OSTaskQuery( ) INT8U OSTaskQuery ( INT8U prio, OS_TCB *pdata);
3
UCOSII 编程要点 参数:prio 为指定要获取 TCB 内容的任务优先级,也可以指定参数 OS_PRIO_SELF,获取调用 任务的信息。pdata 指向一个 OS_TCB 类型的数据结构,容纳返回的任务 TCB 的一个拷贝 OSTimeGet():系统时间;
UCOSII 编程要点
OSStatInit():系统统计初始化;
OSStatInit ( )
void OSStatInit (void);
OSTaskStatHook():任务统计外界接入函数;
OSTaskSuspend(OS_PR1O_SELF):
OSTaskStkChk():任务堆栈检查;
OSTaskStkChk( ) INT8U OSTaskStkChk ( INT8U prio, OS_STK_DATA *pdata); 参数:prio 为指定要获取堆栈信息的任务优先级,也可以指定参数 OS_PRIO_SELF,获取调用 任务本身的信息。pdata 指向一个类型为 OS_STK_DATA 的数据结构。 OSSched():任务调度;
一、任务状态
UCOSII 编程要点
二、系统函数
OSIint():系统初始化函数,并建立空闲任务; OSTastCreat(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio):任
务建立,进入就绪态准备运行; 参数:task 是指向任务代码的指针。Pdata 指向一个数据结构,该结构用来在建立任务时向 任务传递参数。ptos 为指向任务堆栈栈顶的指针。prio 为任务的优先级 OSTaskCreatExt(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio, INT16U id, OS_STK *pbos, INT32U stk_size, void *pext, INT16U opt): 任务建立,进入就绪态准备运行; OSTaskChangePrio():改变任务的优先级; INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio); 参数:oldprio 是任务原先的优先级。newprio 是任务的新优先级。 OSTaskDel():任务睡眠; OSTaskDel() INT8U OSTaskDel (INT8U prio); 参数:prio 为指定要删除任务的优先级,也可以用参数 OS_PRIO_SELF 代替 OSStart():启动任务; OSTimeDly():任务延迟,进入等待状态; OSTimeDly( ) void OSTimeDly ( INT16U ticks); 参数:ticks 为要延时的时钟节拍数 OSTimeDlyHMSM():任务延迟,进入等待状态; OSTimeDlyHMSM( ) void OSTimeDlyHMSM( INT8U hours,INT8U minutes,INT8U seconds,INT8U milli);

uCOS-II的任务切换总结

uCOS-II的任务切换总结

uC/OS-II的任务切换总结uC/OS-II的任务切换归根到底都是由以下三个函数引起的:∙OSStart();∙OSIntExit();∙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()函数需要用户移植实现,主要的工作是:OSRunning = TRUE;调用OSTaskSwHook()函数;设置处理器的堆栈指针寄存器为 OSTCBHighRdy->OSTCBStkPtr;恢复所有处理器的寄存器内容(不包括堆栈指针寄存器和PC寄存器);恢复PC寄存器并开始执行PC指向的指令。

二、OSIntExit():OSIntExit()函数由中断服务代码调用,用户的中断服务代码要求如下:把全部CPU寄存器(包括堆栈指针寄存器和PC寄存器)推入当前任务堆栈;调用OSIntEnter()函数或OSIntNesting++;执行用户的中断处理代码;调用OSIntExit()。

μCOS-ii 介绍

μCOS-ii 介绍

第三章内核结构3.00 临界段,OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL()3种方法实现上边两个函数:(1) OS_CRITICAL_METHOD==1,用关中断实现OS_ENTER_CRITICAL,用开中断实现OS_EXIT_CRITLCAL();此方法的缺点是如果进入该函数前系统的中断状态是关中断,调用函数后则会改变其中断状态。

(2)OS_CRITICAL_METHOD==2, 用在堆栈中保存现在的中断开关状态,然后关中断来实现OS_ENTER_CRITICAL,用从堆栈中弹出原来的中断状态来实现OS_EXIT_CRITICAL();此方法存在的问题是:有些编译器不够灵敏,不能正确进行出入栈操作而引起严重错误。

(3)OS_CRITICAL_METHOD==3,用户可以得到当前处理器的状态字值,并保存在一个C函数的局部变量里,这个变量可以用于恢复PSW。

3.01 任务Ucosii 最多管理64个任务,但有些被系统保留,所以推荐使用其中的56个,不用前4个和后4个;为了使ucosii管理用户任务,必须在建立任务时,将任务的起始地址与其他参数传递给OSTaskCreate()或OSTaskCreateExt()中的一个。

3.02任务状态(睡眠态、就绪态、运行态、中断服务态、等待态)当所有任务都在等待事件的发生或等待延迟时间的结束时,ucosii执行空闲任务OSTaskIdle().3.03任务控制块(OS_TCB)一旦任务建立,一个任务控制块OS_TCB就被赋值,任务控制块是一个数据结构,当任务的CPU使用权被剥夺时,任务控制块用来保存该任务的状态,当任务重新得到CPU的使用权时,任务控制块能确保任务从当时被中断的那一点继续执行。

OS_TCB全部驻留在RAM中。

3.04就绪表每个就绪的任务都放在就绪表(ready list)中,就绪表中有两个变量:OSRdyGrp 和OSRdyTbl[]. 找出进入就绪态的优先级最高的任务的办法(ucosii提供了一个表OSUnMapTbl[]): y = OSUnMapTbl[OSRdyGrp]; x =OSUnMapTbl[OSRdyTbl[y]]; prio = (y<<3) + x ;附:若从就绪表的两个变量,通过查找法或直观地看,也可以找到处于就绪态的优先级最高的任务,但是比较麻烦,ucosii加入了算法,通过查表的办法可以直接得到处于就绪态的优先级最高的任务,比较方便。

uCOS-II中文版电子书+第1章

uCOS-II中文版电子书+第1章

第一章:范例在这一章里将提供三个范例来说明如何使用 µC/OS-II。

笔者之所以在本书一开始就写这一章是为了让读者尽快开始使用 µC/OS-II。

在开始讲述这些例子之前,笔者想先说明一些在这本书里的约定。

这些例子曾经用Borland C/C++ 编译器(V3.1)编译过,用选择项产生Intel/AMD80186处理器(大模式下编译)的代码。

这些代码实际上是在Intel Pentium II PC (300MHz)上运行和测试过,Intel Pentium II PC可以看成是特别快的80186。

笔者选择PC做为目标系统是由于以下几个原因:首先也是最为重要的,以PC做为目标系统比起以其他嵌入式环境,如评估板,仿真器等,更容易进行代码的测试,不用不断地烧写EPROM,不断地向EPROM仿真器中下载程序等等。

用户只需要简单地编译、链接和执行。

其次,使用Borland C/C++产生的80186的目标代码(实模式,在大模式下编译)与所有Intel、AMD、Cyrix公司的80x86 CPU兼容。

1.00 安装 µC/OS-II本书附带一张软盘包括了所有我们讨论的源代码。

是假定读者在80x86,Pentium,或者Pentium-II处理器上运行DOS或Windows95。

至少需要5Mb硬盘空间来安装uC/OS-II。

请按照以下步骤安装:1.进入到DOS(或在Windows 95下打开DOS窗口)并且指定C:为默认驱动器。

2.将磁盘插入到A:驱动器。

3.键入 A:INSTALL 【drive】注意『drive』是读者想要将µC/OS-II安装的目标磁盘的盘符。

INSTALL.BAT 是一个DOS的批处理文件,位于磁盘的根目录下。

它会自动在读者指定的目标驱动器中建立\SOFTWARE目录并且将uCOS-II.EXE文件从A:驱动器复制到\SOFTWARE并且运行。

µC/OS-II将在\SOFTWARE目录下添加所有的目录和文件。

ucos II 内核学习之四:任务延时函数

ucos II 内核学习之四:任务延时函数

Ucos II 任务延时函数编写过单片机程序的都知道,延时函数是经常被用到的。

在ucos II 里,系统也提供了这样的延时函数。

一个是大众版的OSTimeDly(),一个是精致版的OSTimeDlyHMSM()。

萝卜青菜,各有所爱,随你怎么选。

这两者的区别是,OSTimeDly()的延时时间是以节拍数来衡量的,OSTimeDlyHMSM()的延时时间则是以具体时间大小来衡量的。

这两个函数有着非常重要重要的作用,就是当你调用这两个函数的时候,ucos II 会进行一次任务调度。

所以cpu能在各任务间进行切换,很大功劳得益于这两个函数。

调用这两个延时函数都会挂起本任务,cpu就会执行就绪表中优先级最高的任务。

有一点要注意的是任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态,而不是执行状态,也就是说延时结束后本任务不一定会被立刻执行。

假设你在任务执行过程中,调用延时函数延时0.001秒,时间的延时时间是有可能大于这个值的。

这就得看你任务的安排了。

下面看看这两个函数的具体实现。

程序清单L 5.1 OSTimeDly().Void OSTimeDly (INT16U ticks){if (ticks > 0) { (1)OS_ENTER_CRITICAL();if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) { (2) OSRdyGrp &= ~OSTCBCur->OSTCBBitY;}OSTCBCur->OSTCBDly = ticks; (3)OS_EXIT_CRITICAL();OSSched(); (4)}}其实程序就做了下面几件事1. 把本任务从任务就绪表中删除2. 把延时值保持到任务控制块中,并且通过OSTimeTick()每隔一个时钟节拍就减少一个延时节拍数3. 调用任务调度函数,切换任务。

第三章_uCOS-II程序设计示例

第三章_uCOS-II程序设计示例
启动车辆,踩油门就可以了;但实际上,你必须等车门关上了才可以启动车辆。 ① 、启动车辆,踩油门就可以了;但实际上,你必须等车门关上了才可以启动车辆。 行驶和售票的行动互不干涉、彼此独立,此时不存在协调关系。 ② 、行驶和售票的行动互不干涉、彼此独立,此时不存在协调关系。 开车门只要按下开关就可以了;但实际上,你得等司机停车才能开车门, ③ 、开车门只要按下开关就可以了;但实际上,你得等司机停车才能开车门,否则就 出事故了。 出事故了。
µC/OS-II程序设计实例 程序设计实例
——基于SmartARM2200平台
目 录
1 2 3 4 5
工程模板介绍 数据采集系统 万年历 UART中间件 中间件 I2C中间件 中间件
uC/OS-II
工程模板应用| µC/OS-II程序设计 程序设计
目录
1
工程模板简介
2
示例实现
工程模板应用| µC/OS-II程序设计 程序设计
void TaskBeep (void *pdata) { …… sem = OSSemCreate(0); OS_ENTER_CRITICAL(); /* 初始化VIC(省略) */ /* 初始化定时器1(省略) */ /* 目标板初始化TargeInit() (省略) */ OS_EXIT_CRITICAL(); while (1) { OSSemPend(sem, 0, &err); IO0CLR = BEEP; OSTimeDly(60); IO0SET = BEEP; OSTimeDly(60); } }
任务的同步和通信| 数据采集系统
任务的同步
一、任务的同步
1、什么是任务的同步?
在实时操作系统中,任务和任务之间往往需要协调运行,这种协调关系, 在日常生活里也是屡见不鲜的。为了说明这种协调关系,请看下面的演示:

ucos2中系统函数OSTaskDelReq()的用法,体会,和注意事项

ucos2中系统函数OSTaskDelReq()的用法,体会,和注意事项

OSTaskDelReq()本文就该函数做了细致,深入的解答。

并借用网友的例子和邵贝贝书上的例子,讲解了一般的问题和常用的用法。

带了自己的感想和思考。

希望对自己有帮助。

做此记录。

在ucos中这个函数很常用,个人觉着,使用OSTaskDel,是有风险的,因为他会删除那些变量。

比如下面的一篇文章的部分内容。

慎用OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTaskDel(OS_PRIO_SELF);这个函数,把该任务使用到的变量都给删除了!比如,在Wake_Modem();中使用到了char txmsg;.................txmsg ='7';OSQPost(QSem, (void *)&txmsg);而在另一个任务中等待该消息,char *rxmsg = 0;....................rxmsg=(char *)OSQPend(QSem, 0, &err);switch(*rxmsg){ case '7':OS_ENTER_CRITICAL();Uart_Select(0);Uart_Init(0,115200);Uart_Printf("OK!\n");OS_EXIT_CRITICAL();break;}程序则无法输出OK,因为OSTaskDel(OS_PRIO_SELF);这个函数的存在,导致txmsg 也被删除了!OSTaskSuspend(OS_PRIO_SELF); 与之同效!解决办法:static char txmsg;下面是OSTaskDelReq的用法。

一、发出删除任务请求的任务和打算被时删除的任务都必须调用OSTaskDelReq() 函数举个例子:请求删除其他任务的任务,设为Task-1。

要被删除的任务,设为Task-2。

UCOSII 详解part3

UCOSII 详解part3

/*检查优先级有效性*/
return (OS_ERR_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL();
ptcb = OSTCBPrioTbl[prio];
if (ptcb == (OS_TCB *)0) {
/*被挂起的任务必须存在*/
OS_EXIT_CRITICAL();
}
代码中(1)处为判断要恢复的任务是否为被OSTaskSuspend挂起。当然,如果对应优先
级的任务并没有被OSTaskSuspend挂起,就谈不上使用OSTaskResume恢复。将要恢复的任务
称为目标任务,目标任务的控制块称为目标TCB,那么,前面将目标任务的TCB的地址已经
赋值给了ptcb,目标TCB的OSTCBStat从低到高的第4位标志着任务是否被挂起。而宏OS_ST
在OSTaskSuspend挂起一个任务的时候,要修改就绪表和就绪组,取消任务的就绪标志 ;那么当恢复一个任务的时候,应该加上就绪标志。另外,对于挂起的标志,是在任务控制 块中的OSTCBStat从低到高的第4位,因此,如果恢复一个任务,应该看这一位是否已经被 置位,如果没有被置位,那么恢复操作也应该是无效的。最后,如果一切正常,再将该位进 行复位。
#define OS_STAT_RDY 0x00u #define OS_STAT_SEM 0x01u #define OS_STAT_MBOX 0x02u #define OS_STAT_Q 0x04u #define OS_STAT_SUSPEND 0x08u
/*未等待*/ /*等待信号量*/ /*等待邮箱*/
(1)
OS_ENTER_CRITICAL();
if (ptcb->OSTCBDly != 0u) { /*如果该任务设置了时间延时或事件等待延时*/
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

uc/os—II 下的九个C 语言文件功能函数大全一、OS_CORE.C(1)void OSInit (void)(2)void OSIntEnter (void)(3)void OSIntExit (void)(4)void OSSchedLock (void) // 给调度器上锁(5)void OSSchedUnlock (void) // 给调度器解锁,成对使用(6)void OSStart (void) // 启动多任务过程,在启动之前必须调用OSInit(),并已建立一个任务。

其中OSStartHighRdy()必须调用OSTaskSwHook(),并令OSRunning = TRUE.(7)void OSStatInit (void) // 确定CPU 使用率(8)void OSTimeTick (void) // 时钟节拍服务函数,在每个时钟节拍了解每个任务的延时情况,使其中已经到了延时时限的非挂起任务进入就绪状态(9)INT16U OSVersion (void) // 返回uc/os 的版本号*100(10)void OS_Dummy (void) // 不做任何事情,被OSTaskDel() 所调用(11)INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)// 使一个正在等待的任务进入就绪状态,在调用函数OS***Post 发送一个事件时被调用(12)void OS_EventTaskWait (OS_EVENT *pevent)// 因为一个事件未发生而挂起一个任务时被调用(13)void OS_EventTO (OS_EVENT *pevent)// 使一个等待超时的任务进入就绪状态(14)void OS_EventWaitListInit (OS_EVENT *pevent)// 把OSEventGrp 及任务等待表中的每一位清零,即令ECB 中不含任务等待,被OS***Create()调用(15)void OS_Sched (void) // 实现任务级的调度(16)void OS_TaskIdle (void *pdata) // 空闲任务,为使CPU 在没有用户任务时有事可做(17)void OS_TaskStat (void *pdata) // 统计任务,每秒计算一次CPU 在单位时间内的使用时间,并将计算结果以百分数的形式存放在OSCPUUsage 中,以便应用程序访问它来了解cpu 的利用率(18)INT8U OS_TCBInit (INT8U prio, // 任务的优先级别,存于OSTCBPrioOS_STK *ptos, // 任务堆栈顶指针,存于OSTCBStkPtrOS_STK *pbos, // 任务堆栈栈底指针,存于OSTCBStkBottomINT16U id, // 任务的标识符,存于OSTCBIDINT32U stk_size, // 任务堆栈长度,存于OSTCBStkSizevoid *pext, // 任务控制块的扩展指针,存于OSTCBExtPtrINT16U opt) // 任务控制块的选择项,存于OSTCBOpt// 为用户程序分配任务控制块及对其进行初始化备注:INT8U const OSUnMapTbl[ ] 是uc/os 为提高查找速度而定义的一个数组二、OS_FLAG.C(1)OS_FLAG_GRP *OSFlagCreate (OS_FLAGS flags, // 信号量的初始值INT8U *err) // 错误信息// 信号量集的创建函数(2)void OS_FlagInit (void) // initialize the event flag module,是uc/os 的内部函数,应用程序不得调用该函数(3)OS_FLAG_GRP *OSFlagDel (OS_FLAG_GRP *pgrp, // 所要删除的信号量集指针INT8U opt, // 选择项INT8U *err)// 删除信号量集(4)OS_FLAGS OSFlagPend (OS_FLAG_GRP *pgrp, // 所要请求的信号量集的指针OS_FLAGS flags, // 滤波器INT8U wait_type, // 等待类型INT16U timeout, // 延时时限INT8U *err) // 错误信息// 请求信号量集(5)OS_FLAGS OSFlagAccept (OS_FLAG_GRP *pgrp, // 所请求的信号量集指针OS_FLAGS flags, // 请求的信号INT8U wait_type, // 逻辑运算类型INT8U *err) // 错误信息// 无等待的请求一个信号量集(6)OS_FLAGS OSFlagPost (OS_FLAG_GRP *pgrp,OS_FLAGS flags, // 所要选择发送的信号INT8U opt, // 信号有效的选项INT8U *err)// 向信号量集发送信号(7)OS_FLAGS OSFlagQuery (OS_FLAG_GRP *pgrp, // 待查询的信号量集的指针INT8U *err)// 查询信号量的状态,返回被查询信号量集标志组的成员OSFlagFlags(8)static void OS_FlagBlock (OS_FLAG_GRP *pgrp, // 信号量集指针节点指针据逻辑OS_FLAG_NODE *pnode, // 待添加的等待任务OS_FLAGS flags, // 指定等待信号的数INT8U wait_type, // 信号与等待之间的INT16U timeout) // 等待时限// 添加节点,在请求信号量集函数OSFlagPend()中被调用(9)static BOOLEAN OS_FlagTaskRdy (OS_FLAG_NODE *pnode,OS_FLAGS flags_rdy)// 期望的事件标志为已经置位,从而使一个任务准备运行(10)void OS_FlagUnlink (OS_FLAG_NODE *pnode)// 删除节点,在OSFlagPost() 中被调用三、OS_MBOX.C(1)void *OSMboxAccept (OS_EVENT *pevent)// 无等待的请求消息邮箱(2)OS_EVENT *OSMboxCreate (void *msg)// 创建一个消息邮箱(3)OS_EVENT *OSMboxDel (OS_EVENT *pevent, INT8U opt, INT8U *er r)// 删除消息邮箱(4)void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)// 请求消息邮箱,查看OSEventPtr 是否为NULL (5)INT8U OSMboxPost (OS_EVENT *pevent, void *msg)// 向消息邮箱发送消息(6)INT8U OSMboxPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)// 以广播形式向事件等待任务表中的所有任务发送消息(7)INT8U OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *pdata)// 状态查询四、OS_MEM.C(1)OS_MEM *OSMemCreate (void *addr, INT32U nblks, INT32U blksize,INT8U *err)// 创建动态内存(2)void *OSMemGet (OS_MEM *pmem, INT8U *err)// 请求获得一个内存块(3)INT8U OSMemPut (OS_MEM *pmem, void *pblk)// 释放一个内存块(4)INT8U OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *pdata)// 查询动态内存的状态(5)void OS_MemInit (void) // 初始化动态内存五、OS_MUTEX.C(1)INT8U OSMutexAccept (OS_EVENT *pevent, INT8U *err)// 无等待时间的请求信号量(2)OS_EVENT *OSMutexCreate (INT8U prio, INT8U *err)// 创建互斥型信号量(3)OS_EVENT *OSMutexDel (OS_EVENT *pevent, INT8U opt, INT8U *e rr)// 删除互斥型信号量(4)void OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)// 有等待时间的请求信号量(5)INT8U OSMutexPost (OS_EVENT *pevent)// 发送(释放)互斥型信号量(6)INT8U OSMutexQuery (OS_EVENT *pevent, OS_MUTEX_DATA *pdat a)// 获取互斥型信号量的当前状态六、OS_Q.C(1)void *OSQAccept (OS_EVENT *pevent)// 无等待的请求一个消息队列(2)OS_EVENT *OSQCreate (void **start, INT16U size)// 创建一个消息队列(3)OS_EVENT *OSQDel (OS_EVENT *pevent, INT8U opt, INT8U *err)// 删除消息队列(4)INT8U OSQFlush (OS_EVENT *pevent)// 清空消息队列(5)void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)// 有等待的请求一个消息队列(6)INT8U OSQPost (OS_EVENT *pevent, void *msg)// 以“先进先出”的方式向消息队列发送消息(7)INT8U OSQPostFront (OS_EVENT *pevent, void *msg)// 以“后进先出”的方式向消息队列发送消息(8)INT8U OSQPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)// 以“广播”方式向消息队列发送消息(9)INT8U OSQQuery (OS_EVENT *pevent, OS_Q_DATA *pdata)// 获取消息队列的当前状态(10)void OS_QInit (void)// 消息队列初始化七、OS_SEM.C(1)INT16U OSSemAccept (OS_EVENT *pevent)// 无等待的请求信号量(2)OS_EVENT *OSSemCreate (INT16U cnt)// 创建信号量(3)OS_EVENT *OSSemDel (OS_EVENT *pevent, INT8U opt, INT8U *err)// 删除信号量(4)void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)// 有等待的请求信号量(5)INT8U OSSemPost (OS_EVENT *pevent)// 发送(释放)信号量(6)INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *pdata)// 获取信号量的当前状态八、OS_TASK.C(1)INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)// 任务优先级别的改变(2)INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *pt os, INT8U prio)// 任务的创建(3)INT8U OSTaskCreateExt (void (*task)(void *pd), // 指向任务的指针void *pdata, // 传递给任务的参数OS_STK *ptos, // 指向任务堆栈栈顶的指针INT8U INT16U OS_STK INT32U void prio, id,*pbos, stk_size,*pext, // 创建任务的优先级// 任务的标识// 任务堆栈栈底的指针// 任务堆栈的长度// 指向附加数据域的指针INT16U opt) // 用于设定操作的选项额外的开销// 任务的另一种创建函数,更加灵活,但也增加了(4)INT8U OSTaskDel (INT8U prio) // 任务的删除(5)INT8U OSTaskDelReq (INT8U prio) // 请求删除任务函数(6)INT8U OSTaskResume (INT8U prio) // 任务的恢复(7)INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *pdata)// 校核空余内存的数量(8)INT8U OSTaskSuspend (INT8U prio) // 任务的挂起,可用来挂起自身或除空闲任务之外的任何任务(9)INT8U OSTaskQuery (INT8U prio, OS_TCB *pdata)// 任务的查询九、OS_TIME.C(1)void OSTimeDly (INT16U ticks) // 以时钟节拍数为单位延时(2)INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U second s, INT16U milli)// 用时、分、秒、毫秒为单位延时(3)INT8U OSTimeDlyResume (INT8U prio)// 取消延时,若任务比正在运行的任务级别高,则立即引发一次调度(4)INT32U OSTimeGet (void) // 获取OSTime 值(5)void OSTimeSet (INT32U ticks) // 设置OSTime 值注:INT32U OSTime // 全局变量,用以记录系统发生的时钟节拍。

相关文档
最新文档