Ucos2.52基本函数

合集下载

转:一步一步教你使用uCOS-II

转:一步一步教你使用uCOS-II

转:⼀步⼀步教你使⽤uCOS-II第⼀篇 UCOS介绍第⼀篇 UCOS介绍这个⼤家都知道。

呵呵。

考虑到咱们学习的完整性还是在这⾥唠叨⼀下。

让⼤家再熟悉⼀下。

⾼⼿们忍耐⼀下吧! uC/OS II(Micro Control Operation System Two)是⼀个可以基于ROM运⾏的、可裁减的、抢占式、实时多任务内核,具有⾼度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统(RTOS)。

为了提供最好的移植性能,uC/OS II最⼤程度上使⽤ANSI C语⾔进⾏开发,并且已经移植到近40多种处理器体系上,涵盖了从8位到64位各种CPU(包括DSP)。

uC/OS II可以简单的视为⼀个多任务调度器,在这个任务调度器之上完善并添加了和多任务操作系统相关的系统服务,如信号量、邮箱等。

其主要特点有公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。

内核属于抢占式,最多可以管理60个任务。

µC/OS-II 的前⾝是µC/OS,最早出⾃于1992 年美国嵌⼊式系统专家Jean brosse 在《嵌⼊式系统编程》杂志的5 ⽉和6 ⽉刊上刊登的⽂章连载,并把µC/OS 的源码发布在该杂志的B B S 上。

µC/OS 和µC/OS-II 是专门为计算机的嵌⼊式应⽤设计的,绝⼤部分代码是⽤C语⾔编写的。

CPU 硬件相关部分是⽤汇编语⾔编写的、总量约200⾏的汇编语⾔部分被压缩到最低限度,为的是便于移植到任何⼀种其它的CPU 上。

⽤户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件⼯具,就可以将µC/OS-II嵌⼈到开发的产品中。

µC/OS-II 具有执⾏效率⾼、占⽤空间⼩、实时性能优良和可扩展性强等特点,最⼩内核可编译⾄ 2KB 。

µC/OS-II 已经移植到了⼏乎所有知名的CPU 上。

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-Ⅱ掌握中断嵌套的情况。

ucos—II函数大全

ucos—II函数大全

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 *er r)// 删除互斥型信号量(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 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_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 // 全局变量,用以记录系统发生的时钟节拍。

嵌入式系统UCOS2学习

嵌入式系统UCOS2学习

嵌入式系统UCOS2学习/s/blog_5f0bed160100tqnv.html20113、非空闲任务控制块双向链表ucos-II的任务状态l 睡眠态(Dormant):指任务驻留在程序空间之中,还没有交给μC/OS-Ⅱ管理。

把任务交给μC/OS-Ⅱ是通过调用下述两个函数之一:OSTaskCreate()或OSTaskCreateExt()。

一个任务可以通过调用OSTaskDel()返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。

l 就绪态:当任务一旦建立,这个任务就进入就绪态准备运行。

l 运行态:调用OSStart()可以启动多任务。

OSStart()函数运行进入就绪态的优先级最高的任务。

就绪的任务只有当所有优先级高于这个任务的任务转为等待状态,或者是被删除了,才能进入运行态。

l 等待状态:正在运行的任务可以通过调用两个函数之一将自身延迟一段时间,这两个函数是OSTimeDly()或OSTimeDlyHMSM()。

这个任务于是进入等待状态。

正在运行的任务期待某一事件的发生时也要等待,手段是调用以下几个函数之一:OSFlagPend()、OSSemPend()、OSMutexPend()、OSMboxPend(),或OSQPend()。

如果某事件未发生,调用后任务进入了等待状态(WAITING)。

l 中断服务态:正在运行的任务是可以被中断的,除非该任务将中断关了,或者μC/OS-Ⅱ将中断关了。

被中断了的任务就进入了中断服务态(ISR)。

任务控制块TCB的管理1、任务块数组定义(OS_EXT OS_TCB OSTCBTbl[OS_MAX_TASKS+OS_N_SYS_TASKS];)应用程序中可以有的最多任务数(OS_MAX_TASKS)是在文件OS_CFG.H中定义的。

这个最多任务数也是μC/OS-Ⅱ分配给用户程序的最多任务控制块OS_TCBs的数目。

将OS_MAX_TASKS的数目设置为用户应用程序实际需要的任务数可以减小RAM的需求量。

uCOS操作系统46个基本函数汇总

uCOS操作系统46个基本函数汇总
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()中还 会先判断要改变优先级的任务是否存在
uC/OS 操作系统 46 个基本函数汇总
Void OSInit(void);
所属文件 OS_CORE.C 调用者 启动代码 开关量 无
OSinit() 初始化 μC/OS-Ⅱ,对这个函数的调用必须在调用 OSStart()函数之前,
而 OSStart()函数真正开始运行多任务。
Void OSIntEnter(void);
Void OSSchedLock(void);
所属文件 OS_CORE.C 调用者 任务或中断 开关量 N/A OSSchedLock() 函数停止任务调度,只有使用配对的函数 OSSchedUnlock()才能重新开始内核的任务 调度。调用 OSSchedLock(断仍然可以被接受和执行(中断必须允许)。OSSchedLock()函数和 OSSchedUnlock()函数必须配 对使用。μC/OS-Ⅱ可以支持多达 254 层的 OSSchedLock()函数嵌套,必须调用同样次数的 OSSchedUnlock ()函数才能恢复任务调度。 注意/警告:任务调用了 OSSchedLock()函数后,决不能再调用 可能导致当前任务挂起的系统函数: OSTimeDly(),OSTimeDlyHMSM(),OSSemPend(),OSMboxPend(),OSQPend()。 因为任 务调度已经被禁止,其他任务不能运行,这会导致系统死锁。

ucOS-II入门经典教程

ucOS-II入门经典教程
OS_EXIT_CRITICAL( ); //开放中断 OSTaskIdle( )的系统任务 }
}
μC/OS-II提供的另一个系统任务是统
计任务OSTaskStat( )。这个统计任务 每秒计算一次CPU在单位时间内被使用 系统提供的另一个任务 的时间,并把计算结果以百分比的形 ——统计任务 式存放在变量OSCPUsage中,以便应用 程序通过访问它来了解CPU的利用率, 所以这个系统任务OSTaskStat( )叫做 统计任务
μC/OS-II中 的任务管理
任务在没有被配备 任务控制块或被剥 夺了任务控制块时 的状态叫做任务的 睡眠状态
正在运行的任务,需要 等待一段时间或需要等 待一个事件发生再运行 时,该任务就会把CPU 的使用权让给别的任务 而使任务进入等待状态
任务的状态及其转换
系统为任务配备 了任务控制块且 在任务就绪表中 进行了就绪登记, 这时任务的状态 叫做就绪状态。 处于就绪状态的 任务如果经调度 器判断获得了 CPU的使用权, 则任务就进入运 行状态
任务堆栈
多任务时的问题
处理器 PC 寄存器组 SP 当有多个任务时,处理 内存 内存 器中的运行环境应该怎 内存 么办? 任务代码 任务代码 任务代码

任务堆栈 任务堆栈 任务堆栈 程序运行环境
多任务时任务与处理器 之间关系的处理 在内存中为每个任
处理器 PC 寄存器组 SP 复制 复制
调度器
复制 PC PC PC PC
处理器是个傻瓜,PC让 从此可以知道,哪个程 它干啥,它就干啥。 深刻地理解PC是理解系统 序占有了PC,哪个程序 进行程序切换动作的关键。 就占有了处理器。 PC是个指路器,它指向哪 儿,处理器就去哪儿。
= PC

Ucos_II2.52源码中文译注

Ucos_II2.52源码中文译注

作者:钟常慰Ucos_II2.52是一份非常完美的嵌入式开发系统,在学习ARM的基础上,嵌入ucos系统并增加自己的源码是一件不错的选择,目前在市面上已经有了大量的ucos嵌入案例,特别是在arm和dsp的应用当中,已经成为一种主流,虽然和其它的嵌入式系统相比,ucos不是很完善,如没有内存分配、任务级别不多;但却是一个代码简短、条理清晰、实时性及安全性能很高的嵌入式操作系统。

Ucos_II2.52对比2.8版的256个任务而言,任务数量相比过少,但却是目前应用量最大的一个版本,相对而言,能够满足我们的基本要求,而且增加了很多消息处理,特别是在优先级别方面,具有不可比拟的优势;我曾试图阅读ecos的源码,但还是失败了,还有挑战linux0.01版源码的想法,最终我不能不被屈服;对于Ucos而言,很多入门者是一个福音,因为它的代码非常的少,而且能够对应贝贝老师的书本直接参考,他的书本对结构方面讲解的极为xian详细。

在学习Ucos的整个过程中,E文的理解是一个致命的打击,原因是我的E文水平很差,不过Ucos还是给了我尝试的动力,在作者的原基础上增加中文译码,也许是一件非常不错的选择,相信在中国和我这种水平的人多不胜数,中文的注解对源码而言,能够具有极高的理解价值,可以在极短的时间内,能够充分了解ucos的真正含义。

整个翻译过程历时4个月,每每在寒冬腊月坐在计算机前面,不断的查阅贝贝老师的书来对整个Uco s进行理解,对每个源码进行逐条翻译,也是一件非常需要勇气的事情,但E文的翻译过程中很多变量是不能完全理解的,所以在翻译过程中不乏错误译文很多,于此带来的错误还请读者纠正,相信克服种种困难一定会有所了解的。

对于经济窘迫的我来说,曾试图希望卖一点资料来养家糊口,但这种做法根本不现实,很多的读者可能和我一样,习惯了拿不收费的资料,并对变相收费有一种深恶痛绝的感觉;想了很多决定还是把它贡献出来,让更多的人来(更容易)了解ucos,贡献自己的一点力量。

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)************************************************************************************************ */队列控制块是一个用于维护消息队列信息的数据结构,它包含了以下的一些域。

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()的扩展函数,允许更多的内容设置。

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

嵌入式实时操作系统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中,最低优先级自动赋给( 空闲任务)这个系统任务。

uC-OS-II 常用函数参考手册

uC-OS-II 常用函数参考手册

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

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

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

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

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

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

 ptos is a pointer to the task’s top of stack. If the configuration constant OS_STK_GROWTH is set to 1, the stack is assumed to grow downward (i.e. from high memory to 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.。

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 入门理解

uCOS-II 初级程序员指南(一)uC/OS-II 简介uC/OS-II是一种基于优先级的可抢先的硬实时内核。

自从92年发布以来,在世界各地都获得了广泛的应用,它是一种专门为嵌入式设备设计的内核,目前已经被移植到40多种不同结构的CPU 上,运行在从8位到64位的各种系统之上。

尤其值得一提的是,该系统自从2.51版本之后,就通过了美国FAA认证,可以运行在诸如航天器等对安全要求极为苛刻的系统之上。

鉴于uC/OS-II可以免费获得代码,对于嵌入式RTOS而言,选择uC/OS无疑是最经济的选择。

(二)uC/OS-II应用程序基本结构应用uC/OS-II,自然要为它开发应用程序,下面论述基于uC/OS-II的应用程序的基本结构以及注意事项。

每一个uC/OS-II应用至少要有一个任务。

而每一个任务必须被写成无限循环的形式。

以下是推荐的结构:void task ( void* pdata ){INT8U err;InitTimer(); // 可选For( ;; ){// 你的应用程序代码…….……..OSTimeDly(1); // 可选}}以上就是基本结构,至于为什么要写成无限循环的形式呢?那是因为系统会为每一个任务保留一个堆栈空间,由系统在任务切换的时候换恢复上下文,并执行一条reti 指令返回。

如果允许任务执行到最后一个花括号(那一般都意味着一条ret指令)的话,很可能会破坏系统堆栈空间从而使应用程序的执行不确定。

换句话说,就是“跑飞”了。

所以,每一个任务必须被写成无限循环的形式。

程序员一定要相信,自己的任务是会放弃CPU使用权的,而不管是系统强制(通过ISR)还是主动放弃(通过调用OS API)。

现在来谈论上面程序中的InitTimer()函数,这个函数应该由系统提供,程序员有义务在优先级最高的任务内调用它而且不能在for循环内调用。

注意,这个函数是和所使用的CPU相关的,每种系统都有自己的Timer初始化程序。

uCOS252+bc31安装配置指南

uCOS252+bc31安装配置指南

uCOSII V2.52 + Borland C 4.5安装配置指南文中的开发包及开发工具如下:∙开发包:uC/OS 2.52∙开发工具:Borland C 4.51.安装∙ 1.1 下载软件包Software.rar∙ 1.2 解压缩,建议解压到C盘根目录,这样文件将安装在C:\SOFTWARE∙ 1.3 安装完毕∙ 1.4 以默认安装路径为例,目录结构为:o C: \SOFTWARE这是根目录,是所有软件相关的文件都放在这个目录下。

▪C:\SOFTWARE\BLOCKS子程序模块目录。

笔者将例子中μC/OS-II用到的与PC相关的函数模块编译以后放在这个目录下。

▪C:\SOFTWARE\TO这个目录中存放的是和范例TO相关的文件(请看附录D,HPLISTC和TO)。

源文件TO.C存放在C:\SOFTWARE\TO\SOURCE中,DOS下的可执行文件(TO.EXE)存放在C:\SOFTWARE\TO\EXE中。

注意TO需要一个TO.TBL文件,它必须放在根目录下。

用户可以在C:\SOFTWARE\TO\EXE目录下找到TO.TBL文件。

如果要运行TO.EXE,必须将TO.TBL复制到根目录下。

▪C: \SOFTWARE\uCOS-II与μC/OS-II 相关的文件都放在这个目录下。

▪C:\SOFTWARE\uCOS-II\EX1_x86L这个目录里包括例1的源代码,可以在DOS(或Windows 下的DOS窗口)下运行。

▪C:\SOFTWARE\uCOS-II\EX2_x86L这个目录里包括例2的源代码,可以在DOS(或Windows 下的DOS窗口)下运行。

▪C: \SOFTWARE\uCOS-II\EX3_x86L这个目录里包括例3的源代码,可以在DOS(或Windows下的DOS窗口)下运行。

▪C: \SOFTWARE\uCOS-II\Ix86L这个目录下包括依赖于处理器类型的代码。

此时是为在80x86处理器上运行uC/OS-II而必须的一些代码,实模式,在大模式下编译。

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。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

UC/OSⅡ基本函数123************************************************************************************************ 4* 事件标志管理 (EVENT FLAGS MANAGEMENT)5*6* OSFlagAccept() 检查事件标志组函数(标志组的指针、事件标志位、等待事件标志位的方式、错误码指针) 7* OSFlagCreate() 建立一个事件标志组(初值、错误码)8* OSFlagDel() 删除一个事件标志组(指针、条件值、错误值)9* OSFlagPend() 等待事件标志组的事件标志位(事件组指针、需要检查的标志位、等待事件标志位的方式、10* 允许等待的时钟节拍、出错代码的时钟节拍)11* OSFlagPost() 置位或清0事件标志组中的标志位(指针、标志位、条件值、错误码)12* OSFlagQuery() 查询事件标志组的当前事件标志状态(事件标志组的指针、错误代码的指针)13************************************************************************************************1415************************************************************************************************ 16* 消息邮箱管理 (MESSAGE MAILBOX MANAGEMENT)17*18* OSMboxAccept () 查看消息邮箱(消息邮箱指针)19* OSMboxCreate () 建立并初始化一个消息邮箱(msg 参数不为空含内容)20* OSMboxDel () 删除消息邮箱(消息邮箱指针、删除条件、出错代码指针)21* OSMboxPend () 等待一个消息邮箱函数(消息邮箱指针、允许等待的时钟节拍、代码错误指针)22* OSMboxPost () 发送消息函数(消息邮箱指针、即将实际发送给任务的消息)23* OSMboxPostOpt () 向邮箱发送一则消息(邮箱指针、消息、条件)24* OSMboxQuery () 查询一个邮箱的当前状态(信号量指针、状态数据结构指针)25************************************************************************************************ 26************************************************************************************************ 27* 内存管理项 (MEMORY MANAGEMENT)2829* OSMemCreate () 建立并初始化一块内存区(起始地址、需要的内存块数目、内存块大小、返回错误的指针) 30* OSMemGet () 从内存区分配一个内存块31* OSMemPut () 释放一个内存块,内存块必须释放回原先申请的内存区32* OSMemQuery () 得到内存区的信息33************************************************************************************************3435************************************************************************************************ 36* 互斥型信号量项管理 (MUTUAL EXCLUSION SEMAPHORE MANAGEMENT)37*38* OSMutexAccept () 无等待地获取互斥型信号量[任务不挂起](信号量指针、错误代码)39* OSMutexCreate () 建立并初始化一个互斥型信号量(优先级继承优先级(PIP)、出错代码指针)40* OSMutexDel () 删除互斥型信号量(信号指针、删除条件、错误指针)41* OSMutexPend () 等待一个互斥型信号量(指针、等待超时时限、出错代码指针)42* OSMutexPost () 释放一个互斥型信号量(互斥型信号量指针)43* OSMutexQuery () 查询一个互斥型信号量的当前状态(互斥型信号量指针、状态数据结构指针)44************************************************************************************************4546************************************************************************************************ 47* 消息队列管理 (MESSAGE QUEUE MANAGEMENT)48*49* OSQAccept () 检查消息队列中是否已经有需要的消息(消息队列的指针)50* OSQCreate () 建立一个消息队列(消息内存区的基地址(指针数组)、消息内存区的大小)51* OSQDel () 删除一个消息队列(消息队列指针、删除条件、错误指针)52* OSQFlush () 清空消息队列(指向得到消息队列的指针)53* OSQPend () 任务等待消息队列中的消息(消息队列指针、允许等待的时钟节拍、代码错误指针)54* OSQPost () 向消息队列发送一则消息FIFO(消息队列指针、发送的消息)55* OSQPostFront () 向消息队列发送一则消息LIFO(消息队列指针、发送的消息)56* OSQPostOpt () 向消息队列发送一则消息LIFO(消息队列指针、发送的消息、发送条件)57* OSQQuery () 查询一个消息队列的当前状态(信号量指针、状态数据结构指针)58************************************************************************************************5960/*********************************************************************************************** 61* 消息队列数据 (MESSAGE QUEUE DATA)1************************************************************************************************ 2*/3队列控制块是一个用于维护消息队列信息的数据结构,它包含了以下的一些域。

这里,仍然在各个变量前加入4一个[.]来表示它们是数据结构中的一个域。

5* 1).OSQPtr: 在空闲队列控制块中链接所有的队列控制块。

一旦建立了消息队列,该域就不再有用了。

6* 2).OSQStart: 是指向消息队列的指针数组的起始地址的指针。

用户应用程序在使用消息队列之前必须先定义7该数组8* 3).OSQEnd: 是指向消息队列结束单元的下一个地址的指针。

该指针使得消息队列构成一个循环的缓冲区。

9* 4).OSQIn: 是指向消息队列中插入下一条消息的位置的指针。

当.OSQIn和.OSQEnd相等时,.OSQIn被调整指向10消息队列的起始单元。

11* 5).OSQOut: 是指向消息队列中下一个取出消息的位置的指针。

当.OSQOut和.OSQEnd相等时,.OSQOut被调整12指向消息队列的起始单元。

13* 6).OSQSize: 是消息队列中总的单元数。

该值是在建立消息队列时由用户应用程序决定的。

在uC/OS-II中, 14该值最大可以是65,535。

15* 7).OSQEntries: 是消息队列中当前的消息数量。

当消息队列是空的时,该值为0。

当消息队列满了以后,该16值和 .OSQSize值一样。

在消息队列刚刚建立时,该值为0。

17***********************************************************************************************1819/*********************************************************************************************** 20* 信号量管理 (SEMAPHORE MANAGEMENT)21*22* OSSemAccept() 无条件地等待请求一个信号量函数23* OSSemCreate() 建立并初始化一个信号量(输入一个信号量值)24* OSSemDel() 删除一个信号量(信号指针、删除条件、错误指针)25* OSSemPend () 等待一个信号量函数(信号量指针、允许等待的时钟节拍、代码错误指针)26* OSSemPost () 发出一个信号量函数(信号量指针)27* OSSemQuery () 查询一个信号量的当前状态(信号量指针、状态数据结构指针)2829************************************************************************************************ 30* 任务管理 (TASK MANAGEMENT)31*32* OSTaskChangePrio () 改变一个任务的优先级(任务旧的优先级、任务新的优先级)33* OSTaskCreate () 建立任务(任务代码指针、传递参数指针、分配任务堆栈栈顶指针、任务优先级) 34* OSTaskCreateExt () 建立扩展任务(任务代码指针/传递参数指针/分配任务堆栈栈顶指针/分配任务优先35级36* //(未来的)优先级标识(与优先级相同)/分配任务堆栈栈底指针/指定堆栈的容量(检验用)37* //指向用户附加的数据域的指针/建立任务设定选项)38* OSTaskDel () 删除任务(任务的优先级)39* OSTaskDelReq () 请求一个任务删除其它任务或自身?(任务的优先级)40* OSTaskResume () 唤醒一个用OSTaskSuspend()函数挂起的任务(任务的优先级)41* OSTaskStkChk () 检查任务堆栈状态(任务优先级、检验堆栈数据结构)42* OSTaskSuspend () 无条件挂起一个任务(任务优先级)43* OSTaskQuery () 获取任务信息(任务指针、保存数据结构指针)44************************************************************************************************4546************************************************************************************************ 47* 时钟管理项 (TIME MANAGEMENT)48*49* OSTimeDly () 任务延时函数(时钟节拍数)50* OSTimeDlyHMSM () 将一个任务延时若干时间(设定时、分、秒、毫秒)51* OSTimeDlyResume () 唤醒一个用OSTimeDly()或OSTimeDlyHMSM()函数的任务(优先级)52* OSTimeGet () 获取当前系统时钟数值53* OSTimeSet () 设置当前系统时钟数值54************************************************************************************************555657/*********************************************************************************************** 58* 混杂函数定义59*60* OSInit() 初始化UCOS-II函数61* OSIntEnter() 中断函数正在执行1* OSIntExit() 中断函数已经完成(脱离中断)2* OSSchedLock() 给调度器上锁3* OSSchedUnlock() 给调度器解锁4* OSStart() 启动多个任务5* OSStatInit() 统计任务初始化6* OSVersion() 获得版本号7************************************************************************************************ 8/910/*********************************************************************************************** 11* 内部函数原型 INTERNAL FUNCTION PROTOTYPES12* 你在应用程序中不能使用它们 (Your application MUST NOT call these functions)13*14* OS_Dummy() 建立一个虚拟函数15* OS_EventTaskRdy() 使一个任务进入就绪态(OS_EVENT *pevent, void *msg, INT8U msk)16* OS_EventTaskWait() 使一个任务进入等待某事件发生状态(ECB指针)17* OS_EventTO() 由于超时而将任务置为就绪态(ECB指针)18* OS_EventWaitListInit() 事件控制块列表初始化(事件控制块指针)19* OS_FlagInit() 初始化事件标志结构20* OS_FlagUnlink() 把这个OS_FLAG_NODE从事件标志组的等待任务链表中删除(OS_FLAG_NODE *pnode) 21* OS_MemInit() 初始化内存分区22* OS_QInit() 初始化事件队列结构23* OS_Sched() 任务调度函数24* OS_TaskIdle() 空闲任务函数(指向一个数据结构)25* OS_TaskStat() 统计任务(指向一个数据结构)26* OS_TCBInit() 初始化任务控制块TCB(优先级指针、栈顶指针、栈底指针、任务标志符、27* 堆栈容量、扩展指针、选择项)28************************************************************************************************ 29*/303132OSTaskStkInit() 它负责建立任务的堆栈在OS_CPU_C.C文件中找到3334。

相关文档
最新文档