uCOS-II常用函数参考手册
uCOS-II_常用函数查询
第11章参考手册#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(Intel 80x86的实模式, 在大模式下编译,,real mode,large model)OS_ENTER_CRITICAL();//Reschedule only if all ISRs completed & not lockedif ((--OSIntNesting | OSLockNesting) == 0){OSIntExitY = OSUnMapTbl[OSRdyGrp];OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);if (OSPrioHighRdy != OSPrioCur) //No context switch if current task is highest ready{OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];OSCtxSwCtr++; // Keep track of the number of context switchesOSIntCtxSw(); // Perform interrupt level context switch}}OS_EXIT_CRITICAL();}注意/警告:在调用OSStart( )之前必须先调用OSInit ( )。
ucosII功能函数大全(第九课)
uc/osII下的九个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中文手册第9章
µC/OS-II在80x86上的移植本章将介绍如何将µC/OS-II移植到Intel 80x86系列CPU上,本章所介绍的移植和代码都是针对80x86的实模式的,且编译器在大模式下编译和连接。
本章的内容同样适用于下述CPU:80186802868038680486PentiumPentium II实际上,将要介绍的移植过程适用于所有与80x86兼容的CPU,如AMD,Cyrix,NEC (V-系列)等等。
以Intel的为例只是一种更典型的情况。
80x86 CPU每年的产量有数百万,大部分用于个人计算机,但用于嵌入式系统的数量也在不断增加。
最快的处理器(Pentium系列)将在2000年达到1G的工作频率。
大部分支持80x86(实模式)的C编译器都提供了不同的内存使用模式,每一种都有不同的内存组织方式,适用于不同规模的应用程序。
在大模式下,应用程序和数据最大寻址空间为1Mb,程序指针为32位。
下一节将介绍为什么32位指针只用到了其中的20位来寻址(1Mb)。
本章所介绍的内容也适用于8086处理器,但由于8086没有PUSHA指令,移植的时候要用几条PUSH指令来代替。
图F9.1显示了工作在实模式下的80x86处理器的编程模式。
所有的寄存器都是16位,在任务切换时需要保存寄存器内容。
图F9.1 80x86 实模式内部寄存器图.80x86提供了一种特殊的机制,使得用16位寄存器可以寻址1Mb地址空间,这就是存储器分段的方法。
内存的物理地址用段地址寄存器和偏移量寄存器共同表示。
计算方法是:段地址寄存器的内容左移4位(乘以16),再加上偏移量寄存器(其他6个寄存器中的一个,AX,BP,SP,SI,DI或IP)的内容,产生可寻址1Mb的20位物理地址。
图F9.2表明了寄存器是如何组合的。
段寄存器可以指向一个内存块,称为一个段。
一个16位的段寄存器可以表示65,536个不同的段,因此可以寻址1,048,576字节。
嵌入式实时操作系统uCOSII第12章 配置手册
第12章配置手册本章将介绍μC/OS-II中的初始化配置项。
由于μC/OS-II向用户提供源代码,初始化配置项由一系列#define constant语句构成,都在文件OS_CFG.H中。
用户的工程文件组中都应该包含这个文件。
本节介绍每个用#define constant定义的常量,介绍的顺序和它们在OS_CFG.H中出现的顺序是相同的。
表12.1列出了常量控制的μC/OS-II函数。
“类型”为函数所属的类型,“置1”表示当定义常量为1时可以打开相应的函数,“其他常量”为与这个函数有关的其他控制常量。
注意编译工程文件时要包含OS_CFG.H,使定义的常量生效。
表T12.1 μC/OS-II函数和相关的常量(#define constant定义)表 T12.1 µC/OS-II 函数和相关常量类型置1其他常量杂相OSInit()无OS_MAX_EVENTSOS_Q_EN and OS_MAX_QSOS_MEM_ENOS_TASK_IDLE_STK_SIZEOS_TASK_STAT_ENOS_TASK_STAT_STK_SIZEOSSchedLock()无无OSSchedUnlock()无无OSStart()无无OSStatInit()OS_TASK_STAT_EN &&OS_TICKS_PER_SECOS_TASK_CREATE_EXT_ENOSVersion()无无中断处理OSIntEnter()无无OSIntExit()无无消息邮箱OSMboxAccept()OS_MBOX_EN无OSMboxCreate()OS_MBOX_EN OS_MAX_EVENTS OSMboxPend()OS_MBOX_EN无OSMboxPost()OS_MBOX_EN无OSMboxQuery()OS_MBOX_EN无内存块管理OSMemCreate()OS_MEM_EN OS_MAX_MEM_PART OSMemGet()OS_MEM_EN无OSMemPut()OS_MEM_EN无OSMemQuery()OS_MEM_EN无消息队列OSQAccept()OS_Q_EN无OSQCreate()OS_Q_EN OS_MAX_EVENTSOS_MAX_QS OSQFlush()OS_Q_EN无OSQPend()OS_Q_EN无OSQPost()OS_Q_EN无OSQPostFront()OS_Q_EN无OSQQuery()OS_Q_EN无信号量管理OSSemAccept()OS_SEM_EN无OSSemCreate()OS_SEM_EN OS_MAX_EVENTS OSSemPend()OS_SEM_EN无OSSemPost()OS_SEM_EN无OSSemQuery()OS_SEM_EN无任务管理OSTaskChangePrio()OS_TASK_CHANGE_PRIO_ENOS_LOWEST_PRIOOSTaskCreate()OS_TASK_CREATE_EN OS_MAX_TASKSOS_LOWEST_PRIOOSTaskCreateExt()OS_TASK_CREATE_EXT_EN OS_MAX_TASKS OS_STK_GROWTH OS_LOWEST_PRIOOSTaskDel()OS_TASK_DEL_EN OS_LOWEST_PRIO OSTaskDelReq()OS_TASK_DEL_EN OS_LOWEST_PRIO OSTaskResume()OS_TASK_SUSPEND_EN OS_LOWEST_PRIO OSTaskStkChk()OS_TASK_CREATE_EXT_E OS_LOWEST_PRIONOSTaskSuspend()OS_TASK_SUSPEND_EN OS_LOWEST_PRIO OSTaskQuery()OS_LOWEST_PRIO时钟管理OSTimeDly()无无OSTimeDlyHMSM()无OS_TICKS_PER_SEC OSTimeDlyResume()无OS_LOWEST_PRIO OSTimeGet()无无OSTimeSet()无无OSTimeTick()无无用户定义函数OSTaskCreateHook()OS_CPU_HOOKS_EN无OSTaskDelHook()OS_CPU_HOOKS_EN无OSTaskStatHook()OS_CPU_HOOKS_EN无OSTaskSwHook()OS_CPU_HOOKS_EN无OSTimeTickHook()OS_CPU_HOOKS_EN无OS_MAX_EVENTSOS_MAX_EVENTS定义系统中最大的事件控制块的数量。
uCOS-II函数解释,宏定义速查手册
宏定义速查1.typedef unsigned char BOOLEAN;波尔类型2.typedef unsigned char INT8U; 无符号8位整数3.typedef signed char INT8S; 有符号8位整数4.typedef unsigned int INT16U;无符号16位整数5.typedef signed int INT16S; 有符号16位整数6.typedef unsigned long INT32U; 无符号32位整数7.typedef signed long INT32S; 有符号32位整数8.typedef float FP32; 单精度浮点数9.typedef double FP64; 双精度浮点数10.typedef unsigned int OS_STK;堆栈入口宽度为16位11.OS_ARG_CHK_EN 允许(1) 或者禁止(0) 变量检查.12.OS_CPU_HOOKS_EN (1)在处理器移植文件中允许使用 uC/OS-II 的接口函数13.OS_LOWEST_PRIO定义任务的最低优先级14.OS_MAX_EVENTS 应用中最多事件控制块的数目15.OS_MAX_FLAGS应用中最多事件标志组的数目16.OS_MAX_MEM_PART最多内存块的数目17.OS_MAX_QS应用中最多队列控制块的数目18.OS_MAX_TASKS 应用中最多任务数目19.OS_TASK_IDLE_STK_SIZE空闲任务堆栈容量20.OS_TASK_STAT_EN允许 (1) 或者禁止 (0) 统计任务21.OS_TASK_STAT_STK_SIZE 统计任务堆栈容量22.OS_SCHED_LOCK_EN 设为1允许使用 OSSchedLock() 和 OSSchedUnlock() 函数代码23.OS_TICKS_PER_SEC设置每秒的节拍数24.OS_FLAG_EN允许 (1) 或者禁止 (0) 产生事件标志相关代码25.OS_FLAG_W AIT_CLR_EN设为1允许使用等待事件标志清0代码26.OS_FLAG_ACCEPT_EN设为1允许使用 OSFlagAccept()函数代码27.OS_FLAG_DEL_EN设为1允许使用 OSFlagDel()函数代码28.OS_FLAG_QUERY_EN 设为1允许使用 OSFlagQuery()函数代码29.OS_MBOX_EN允许 (1) 或者禁止 (0) 产生消息邮箱相关代码30.OS_MBOX_ACCEPT_EN设为1允许使用 OSMboxAccept()函数代码31.OS_MBOX_DEL_EN 设为1允许使用 OSMboxDel()函数代码32.OS_MBOX_POST_EN设为1允许使用 OSMboxPost()函数代码33.OS_MBOX_POST_OPT_EN设为1允许使用 OSMboxPostOpt()函数代码34.OS_MBOX_QUERY_EN设为1允许使用 OSMboxQuery()函数代码35.OS_MEM_EN允许 (1) 或者禁止 (0) 产生内存相关代码36.OS_MEM_QUERY_EN设为1允许使用 OSMemQuery()函数代码37.OS_MUTEX_EN允许 (1) 或者禁止 (0) 产生互斥型信号量相关代码38.OS_MUTEX_ACCEPT_EN设为1允许使用 OSMutexAccept()函数代码39.OS_MUTEX_DEL_EN设为1允许使用 OSMutexDel()函数代码40.OS_MUTEX_QUERY_EN设为1允许使用 OSMutexQuery()41.OS_Q_EN允许 (1) 或者禁止 (0) 产生消息队列相关代码42.OS_Q_ACCEPT_EN设为1允许使用 OSQAccept()函数代码43.OS_Q_DEL_EN设为1允许使用 OSQDel()函数代码44.OS_Q_FLUSH_EN设为1允许使用 OSQFlush()函数代码45.OS_Q_POST_EN设为1允许使用 OSQPost()函数代码46.OS_Q_POST_FRONT_EN 设为1允许使用 OSQPostFront()函数代码47.OS_Q_POST_OPT_EN 设为1允许使用 OSQPostOpt()函数代码48.OS_Q_QUERY_EN 设为1允许使用 OSQQuery()函数代码49.OS_SEM_EN 允许 (1) 或者禁止 (0) 产生信号量相关代码50.OS_SEM_ACCEPT_EN 设为1允许使用 OSSemAccept()函数代码51.OS_SEM_DEL_EN设为1允许使用 OSSemDel()函数代码52.OS_SEM_QUERY_EN 设为1允许使用 OSSemQuery()函数代码53.OS_TASK_CHANGE_PRIO_EN设为1允许使用 OSTaskChangePrio() 函数代码54.OS_TASK_CREATE_EN 设为1允许使用 OSTaskCreate() 函数代码55.OS_TASK_CREATE_EXT_EN设为1允许使用 OSTaskCreateExt() 函数代码56.OS_TASK_DEL_EN设为1允许使用 OSTaskDel() 函数代码57.OS_TASK_SUSPEND_EN设为1允许使用 OSTaskSuspend() and OSTaskResume() 函数代码58.OS_TASK_QUERY_EN设为1允许使用 OSTaskQuery() 函数代码59.OS_TIME_DL Y_HMSM_EN设为1允许使用OSTimeDlyHMSM() 函数代码60.OS_TIME_DL Y_RESUME_EN设为1允许使用OSTimeDlyResume() 函数代码61.OS_TIME_GET_SET_EN 设为1允许使用 OSTimeGet() 和 OSTimeSet() 函数代码μC/OS-II函数和相关的常量(#define constant定义)µC/OS-II 函数和相关常量类型置1其他常量OSInit() 无OS_MAX_EVENTSOS_Q_EN andOS_MAX_QSOS_MEM_ENOS_TASK_IDLE_STK_SIZEOS_TASK_STAT_ENOS_TASK_STAT_STK_SIZE OSSchedLock() 无无OSSchedUnlock() 无无OSStart() 无无OS_TICKS_PER_SEC OSStatInit() OS_TASK_STAT_EN &&OS_TASK_CREATE_EXT_ENOSVersion() 无无中断处理OSIntEnter() 无无OSIntExit() 无无消息邮箱OSMboxAccept() OS_MBOX_EN 无OSMboxCreate() OS_MBOX_EN OS_MAX_EVENTS OSMboxPend() OS_MBOX_EN 无OSMboxPost() OS_MBOX_EN 无OSMboxQuery() OS_MBOX_EN 无内存块管理OSMemCreate() OS_MEM_EN OS_MAX_MEM_PART OSMemGet() OS_MEM_EN 无OSMemPut() OS_MEM_EN 无OSMemQuery() OS_MEM_EN 无消息队列OSQAccept() OS_Q_EN 无OSQCreate() OS_Q_EN OS_MAX_EVENTSOS_MAX_QSOSQFlush() OS_Q_EN 无OSQPend() OS_Q_EN 无OSQPost() OS_Q_EN 无OSQPostFront() OS_Q_EN 无OSQQuery() OS_Q_EN 无信号量管理OSSemAccept() OS_SEM_EN 无OSSemCreate() OS_SEM_EN OS_MAX_EVENTS OSSemPend() OS_SEM_EN 无OSSemPost() OS_SEM_EN 无OSSemQuery() OS_SEM_EN 无任务管理OSTaskChangePrio() OS_TASK_CHANGE_PRIO_ENOS_LOWEST_PRIOOSTaskCreate() OS_TASK_CREATE_EN OS_MAX_TASKSOS_LOWEST_PRIOOSTaskCreateExt() OS_TASK_CREATE_EXT_ENOS_MAX_TASKS OS_STK_GROWTH OS_LOWEST_PRIOOSTaskDel() OS_TASK_DEL_EN OS_LOWEST_PRIO OSTaskDelReq() OS_TASK_DEL_EN OS_LOWEST_PRIO OSTaskResume() OS_TASK_SUSPEND_EN OS_LOWEST_PRIO OSTaskStkChk() OS_TASK_CREATE_EXT_ENOS_LOWEST_PRIO OSTaskSuspend() OS_TASK_SUSPEND_EN OS_LOWEST_PRIO OSTaskQuery() OS_LOWEST_PRIO 时钟管理OSTimeDly() 无无OSTimeDlyHMSM() 无OS_TICKS_PER_SEC OSTimeDlyResume() 无OS_LOWEST_PRIO OSTimeGet() 无无OSTimeSet() 无无OSTimeTick() 无无用户定义函数OSTaskCreateHook() OS_CPU_HOOKS_EN 无OSTaskDelHook() OS_CPU_HOOKS_EN 无OSTaskStatHook() OS_CPU_HOOKS_EN 无OSTaskSwHook() OS_CPU_HOOKS_EN 无OSTimeTickHook() OS_CPU_HOOKS_EN 无函数速查1.OS_ENTER_CRITICAL() , OS_EXIT_CRITICAL( );2.OSFlagAccept( );3.OSFlagCreate( );4.OSFlagDel( );5.OSFlagPend( );6.OSFlagPost( );7.OSFlagQuery( );8.OSInit( );9.OSIntEnter( );10.OSIntExit( );11.OSMboxAccept( );12.OSMboxCreate( );13.OSMboxDel( );14.OSMboxPend( );15.OSMboxPost( );16.OSMboxPostOpt( );17.OSMboxQuery( );18.OSMemCreate( );19.OSMemGet( );20.OSMemPut( );21.OSMemQuery( );22.OSMutexAccept( );23.OSMutexCreate( );24.OSMutexDel( );25.OSMutexPend( );26.OSMutexPost( );27.OSMutexQuery( );28.OSQAccept( );29.OSQCreate( );30.OSQDel( );31.OSQFlush( );32.OSQPend( );33.OSQPost( );34.OSQPostFront( );35.OSQPostOpt( );36.OSQQuery( );37.OSSchedLock( );38.OSSchedUnlock( );39.OSSemAccept( );40.OSSemCreate( );41.OSSemDel( );42.OSSemPend( );43.OSSemPost( );44.OSSemQuery( );45.OSStart( );46.OSStatInit ( );47.OSTaskChangePrio( );48.OSTaskCreate( );49.OSTaskCreateExt( );50.OSTaskDel( );51.OSTaskDelReq( );52.OSTaskQuery( );53.OSTaskResume( );54.OSTaskStkChk( );55.OSTaskSuspend( );56.OSTimeDly( );57.OSTimeDlyHMSM( );58.OSTimeDlyResume( );59.OSTimeGet( );60.OSTimeSet( );61.OSTimeTick( );62.OSVersion( );函数解释1.OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL( );定义的宏,用来关闭、打开CPU的中断。
第五篇: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信号。
ucOS-II入门经典教程
}
μ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Ⅱ 基本函数
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)************************************************************************************************ */队列控制块是一个用于维护消息队列信息的数据结构,它包含了以下的一些域。
uCOS2中文手册第4章
第4章任务管理 (1)4.0建立任务,OSTaskCreate() (2)4.1建立任务,OSTaskCreateExt() (6)4.2任务堆栈 (9)4.3堆栈检验,OSTaskStkChk() (11)4.4删除任务,OSTaskDel() (14)4.5请求删除任务,OSTaskDelReq() (17)4.6改变任务的优先级,OSTaskChangePrio() (20)4.7挂起任务,OSTaskSuspend() (23)4.8恢复任务,OSTaskResume() (25)4.9获得有关任务的信息,OSTaskQuery() (26)第4章任务管理在前面的章节中,笔者曾说过任务可以是一个无限的循环,也可以是在一次执行完毕后被删除掉。
这里要注意的是,任务代码并不是被真正的删除了,而只是µC/OS-Ⅱ不再理会该任务代码,所以该任务代码不会再运行。
任务看起来与任何C函数一样,具有一个返回类型和一个参数,只是它从不返回。
任务的返回类型必须被定义成void型。
在本章中所提到的函数可以在OS_TASK文件中找到。
如前所述,任务必须是以下两种结构之一:void YourTask (void *pdata){for (;;) {/* 用户代码 */调用µC/OS-Ⅱ的服务例程之一:OSMboxPend();OSQPend();OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTimeDly();OSTimeDlyHMSM();/* 用户代码 */}}或void YourTask (void *pdata){/* 用户代码 */OSTaskDel(OS_PRIO_SELF);}本章所讲的内容包括如何在用户的应用程序中建立任务、删除任务、改变任务的优先级、挂起和恢复任务,以及获得有关任务的信息。
µC/OS-Ⅱ可以管理多达64个任务,并从中保留了四个最高优先级和四个最低优先级的任务供自己使用,所以用户可以使用的只有56个任务。
ucosii互斥信号量的用法
ucosii互斥信号量的用法
ucosii是一个嵌入式操作系统,提供了互斥信号量(Mutex Semaphore)作为一种同步机制。
互斥信号量是一个二进制信号量,用
于在多任务环境中保护共享资源。
它可以用来解决并发访问共享资源
可能引起的数据竞争问题。
互斥信号量主要有两个状态:锁定和非锁定。
只有一个任务可以
拥有互斥信号量的锁定状态,其他任务在请求锁定时会被阻塞。
当任
务完成对共享资源的操作后,会释放互斥信号量的锁定状态,允许其
他任务获取锁。
在ucosii中,可以使用以下函数来创建、获取和释放互斥信号量:
1.函数OSMutexCreate():用于创建一个互斥信号量。
可以设置互斥信号量的初始状态,创建成功后返回一个信号量控制块(OS_MUTEX)的指针。
2.函数OSMutexPend():用于获取一个互斥信号量的锁。
如果互斥信号量的锁已被其他任务获取,则当前任务会被阻塞,直到互斥信号
量的锁可用并成功获取。
3.函数OSMutexPost():用于释放一个互斥信号量的锁。
只有拥有互斥信号量锁的任务才能调用该函数进行释放。
4.函数OSMutexDel():用于删除一个互斥信号量。
如果互斥信号
量的锁被多个任务同时获取,则删除操作可能引起不可预测的行为。
需要注意的是,对于一个互斥信号量的获取和释放应该成对出现,即当前任务在获取互斥信号量后,应该在不再需要共享资源时及时释
放锁,以避免死锁等问题。
除了ucosii中提供的互斥信号量,还可以通过使用其他同步机制
如信号量、事件标志等来实现资源的同步和互斥访问。
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()的扩展函数,允许更多的内容设置。
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部分函数中文注释
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编程要点讲解
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 快速参考手册
Micriµm 949 Crestview Circle Weston, FL 33327 USA
OPTIONS (opt) Miscellaneous
Message Mailboxes (OS_MBOX.C)
void OS_EVENT OS_EVENT *OSMboxAccept *OSMboxCreate *OSMboxDel (OS_EVENT (void (OS_EVENT INT8U INT8U (OS_EVENT INT32U INT8U (OS_EVENT INT8U INT8U (OS_EVENT void (OS_EVENT void INT8U (OS_EVENT OS_MBOX_DATA *pevent); *msg); *pevent, opt, *perr); *pevent, timeout, *perr); *pevent, opt, *perr); *pevent, *pmsg); *pevent, *pmsg, opt); *pevent, *p_mbox_data);
OS_FLAG_GRP OS_FLAG_GRP
*OSFlagCreate *OSFlagDel
OS_DEL_NO_PEND OS_DEL_ALWAYS
INT8U
OSFlagNameGet
void
OSFlagNameSet
OS_FLAGS
OSFlagPend
wait_type: OS_FLAG_WAIT_CLR_ALL OS_FLAG_WAIT_CLR_AND OS_FLAG_WAIT_CLR_ANY OS_FLAG_WAIT_CLR_OR OS_FLAG_WAIT_SET_ALL OS_FLAG_WAIT_SET_AND OS_FLAG_WAIT_SET_ANY OS_FLAG_WAIT_SET_OR + OS_FLAG_CONSUME
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目录下添加所有的目录和文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
技术文件
ห้องสมุดไป่ตู้
技术文件名称:uCOS-II 常用函数参考手册
技术文件编号:1.0
版
本:1.0
拟制 审核 批准
何呈 张勇
力天电子
uCOS-II 常用函数参考手册
文件编 号
版本号 1.0
拟制人/ 修改人
何呈
修改记录
拟制/修改日期 更改理由 2010-01-25
主要更改内容 (写要点即可)
以上所有资料为力天电子(LT)版权所有
1
uCOS-II 常用函数参考手册
一 任务管理 1 OSTaskCreate() 建立一个新任务。任务的建立可以在多任务环境启动之前,也可以在正在运
行的任务中建立。中断处理程序中不能建立任务。一个任务可以为无限循环的结 构。
函数原型:INT8U OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio);
返回值: OSTimeDlyHMSM() 的返回值为下述之一: * OS_NO_ERR:函数调用成功。 * OS_TIME_INVALID_MINUTES:参数错误,分钟数大于 59。 * OS_TIME_INVALID_SECONDS:参数错误,秒数大于 59。 * OS_TIME_INVALID_MILLI:参数错误,毫秒数大于 999。 * OS_TIME_ZERO_DLY:四个参数全为 0。 四 内存管理 1 OSMemCreate() 该函数建立并初始化一个用于动态内存分配的区域,该内存区域包含指定数 目的、大小确定的内存块。应用可以动态申请这些内存块并在用完后将其释放回 这个内存区域。该函数的返回值就是指向这个内存区域控制块的指针,并作为 OSMemGet(),OSMemPut(),OSMemQuery() 等相关调用的参数。 函数原型:OS_MEM *OSMemCreate( void *addr, INT32U nblks, INT32U blksize, INT8U *err ); 参数说明:addr 建立的内存区域的起始地址。可以使用静态数组或在系统 初始化时使用 malloc() 函数来分配这个区域的空间。 nblks 内存块的数目。每一个内存区域最少需要定义两个内存块。 blksize 每个内存块的大小,最小应该能够容纳一个指针变量。 err 是指向包含错误码的变量的指针。Err 可能是如下几种情况: * OS_NO_ERR :成功建立内存区域。 * OS_MEM_INVALID_ADDR :非法地址,即地址为空指针。 * OS_MEM_INVALID_PART :没有空闲的内存区域。 * OS_MEM_INVALID_BLKS :没有为内存区域建立至少两个内存块。 * OS_MEM_INVALID_SIZE :内存块大小不足以容纳一个指针变量。 返回值:
以上所有资料为力天电子(LT)版权所有
4
uCOS-II 常用函数参考手册
该函数用于设置指定的信号量。如果指定的信号量是零或大于零, OSSemPost() 函数递增该信号量的值并返回。如果有任何任务在等待该信号量, 则最高优先级的任务将得到信号量并进入就绪状态。任务调度函数将进行任务调 度,决定当前运行的任务是否仍然为最高优先级的就绪任务。
参数说明: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. prio is the task's priority. A unique priority MUST be assigned to each task and the lower the number, the higher the priority. 返回值: OSTaskCreate() 的返回值为下述之一: * OS_NO_ERR:函数调用成功。 * OS_PRIO_EXIST:具有该优先级的任务已经存在。 * OS_PRIO_INVALID:参数指定的优先级大于 OS_LOWEST_PRIO。 * OS_NO_MORE_TCB:系统中没有 OS_TCB 可以分配给任务了。 2 OSTaskSuspend() 无条件挂起一个任务。调用此函数的任务也可以传递参数 OS_PRIO_SELF, 挂起调用任务本身。当前任务挂起后,只有其他任务才能唤醒被挂起的任务。任 务挂起后,系统会重新进行任务调度,运行下一个优先级最高的就绪任务。唤醒 挂起任务需要调用函数 OSTaskResume()。 任务的挂起是可以叠加到其他操作上的。例如,任务被挂起时正在进行延时 操作,那么任务的唤醒就需要两个条件:延时的结束以及其他任务的唤醒操作。
以上所有资料为力天电子(LT)版权所有
2
uCOS-II 常用函数参考手册
又如,任务被挂起时正在等待信号量,当任务从信号量的等待对列中清除后也不 能立即运行,而必须等到被唤醒后。
函数原型:INT8U OSTaskSuspend(INT8U prio); 参 数 说 明 : prio 为 指 定 要 获 取 挂 起 的 任 务 优 先 级 , 也 可 以 指 定 参 数 OS_PRIO_SELF,挂起任务本身。此时,下一个优先级最高的就绪任务将运行。 返回值: OSTaskSuspend() 的返回值为下述之一: * OS_NO_ERR:函数调用成功。 * OS_TASK_SUSPEND_IDLE:试图挂起 μC/OS-II 中的空闲任务(Idle task)。 此为非法操作。 * OS_PRIO_INVALID:参数指定的优先级大于 OS_LOWEST_PRIO 或没有 设定 OS_PRIO_SELF 的值。 * OS_TASK_SUSPEND_PRIO:要挂起的任务不存在。 3 OSTaskResume() 唤醒一个用 OSTaskSuspend() 函数挂起的任务。OSTaskResume() 也是唯一 能“解挂”挂起任务的函数。 函数原型:INT8U OSTaskResume(INT8U prio); 参数说明:prio 指定要唤醒任务的优先级。 返回值: OSTaskResume() 的返回值为下述之一: * OS_NO_ERR:函数调用成功。 * OS_TASK_RESUME_PRIO:要唤醒的任务不存在。 * OS_TASK_NOT_SUSPENDED:要唤醒的任务不在挂起状态。 * OS_PRIO_INVALID:参数指定的优先级大于或等于 OS_LOWEST_PRIO。 二 信号量 1 OSSemCreate() 该函数建立并初始化一个信号量,信号量的作用如下: * 允许一个任务和其他任务或者中断同步 * 取得设备的使用权 * 标志事件的发生 函数原型:OS_EVENT *OSSemCreate(INT16U value);
以上所有资料为力天电子(LT)版权所有
3
uCOS-II 常用函数参考手册
参数说明:value 参数是所建立的信号量的初始值,可以取 0 到 65535 之间 的任何值。
返回值: OSSemCreate() 函数返回指向分配给所建立的信号量的控制块的指针。如果 没有可用的控制块,OSSemCreate() 函数返回空指针。 2 OSSemPend() 该函数用于任务试图取得设备的使用权、任务需要和其他任务或中断同步、 任务需要等待特定事件的发生的场合。如果任务调用 OSSemPend() 函数时,信 号量的值大于零,OSSemPend() 函数递减该值并返回该值。如果调用时信号量 值等于零,OSSemPend() 函数将任务加入该信号量的等待队列。OSSemPend() 函 数挂起当前任务直到其他的任务或中断设置信号量或超出等待的预期时间。如果 在预期的时钟节拍内信号量被设置,μC/OS-Ⅱ默认让最高优先级的任务取得信号 量并回到就绪状态。一个被 OSTaskSuspend() 函数挂起的任务也可以接受信号 量,但这个任务将一直保持挂起状态直到通过调用 OSTaskResume() 函数恢复该 任务的运行。 函数原型:void OSSemPend ( OS_EVNNT *pevent, INT16U timeout, int8u *err ); 参数说明:pevent 是指向信号量的指针。该指针的值在建立该信号量时可 以得到。(参考 OSSemCreate() 函数)。 timeout 允许一个任务在经过了指定数目的时钟节拍后还没有得到需要的信 号量时恢复就绪状态。如果该值为零表示任务将持续地等待信号量,最大的等待 时间为 65535 个时钟节拍。这个时间长度并不是非常严格的,可能存在一个时钟 节拍的误差。 err 是指向包含错误码的变量的指针,返回的错误码可能为下述几种: * OS_NO_ERR :信号量不为零。 * OS_TIMEOUT :信号量没有在指定数目的时钟周期内被设置。 * OS_ERR_PEND_ISR :从中断调用该函数。虽然规定了不允许从中断调 用该函数,但 μC/OS-Ⅱ仍然包含了检测这种情况的功能。 * OS_ERR_EVENT_TYPE :pevent 不是指向信号量的指针。 返回值:无 3 OSSemPost()