uCOSII的主函数问题

合集下载

实时操作系统UCOS-II,学会RTOS给你的身价增值

实时操作系统UCOS-II,学会RTOS给你的身价增值

实时操作系统UCOS-II,学会RTOS给你的身价增值如果,你最近关注一些嵌入式招聘职位描述,你可能会经常看到看到使用过uCOS、Vxworks、QNX等RTOS者优先。

随便打开一个20K的嵌入式开发工作职责:你会发现熟悉RTOS的开发、移植、剪裁真的很吃香!今天,我们就来介绍一下实时操作系统UCOS-II。

一、嵌入式操作系统概览嵌入式操作系统的主要好处就是屏蔽了底层硬件的差别,给上层应用提供统一的接口,并管理进程调度和资源(如CPU时间、内存)分配等。

并且可以充分利用硬件资源,如在单任务时(大循环结构,如大部分51程序)遇到delay函数时,CPU在空转。

而在多任务系统,遇到delay或需等待资源时系统会自动运行下一个任务,等条件满足再回来运行先前的任务,这样就充分利用了CPU,提高了效率。

uC/OS操作系统与裸机程序的最大不同点就在于uC/OS有任务调度,可以根据任务的重要程度(优先级)优先执行重要的任务,从而确保能及时处理最重要的数据。

(所以对于一个系统有必要使用OS的判断是能否划分一个个的任务,并且各任务间的耦合很小)可以思考下裸机程序中断的时候发生的过程。

利用堆栈可以很自由的在A、B中切换,如果切换足够快,A、B看以来好像同时在执行,这就是并行,A、B就是任务。

如果这个切换操作放到定时器函数中来做,就可以严格按照时间来切换。

另外,各个任务之间有存在一定的关系,有逻辑上的先后等,必须引进全局的结构体、变量来标记一些信息,全局的这些数据是不会被释放的,所以所有的任务可以去通过读、写这些数据来实现各个程序块交流信息,实现所谓的同步、互斥。

这就是操作系统的原理,而这些不同的通信方式按功能细分就成事件管理、内存管理等。

ucosII功能函数大全(第九课)

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 // 全局变量,用以记录系统发生的时钟节拍。

ucos ii优先级反转问题

ucos ii优先级反转问题

在这里先假高已经创建了三个不同优先级的任务,任务0的优先级为5,任务1的优先级为6,任务2的优先级为7;在main()函数里创建一个二值信号量;mutex=OSSemCreate(1);函数OSSemCreate()的参数值的范围为:0~65535;下面例子已经在程序里安排好时序了。

每个任务里都有足够长的延时。

任务0与任务2一起使用这个二值信号量;任务1只执行打印输出语句;当任务2在使用这个二值信号量时,任务1与任务0都处于就绪态,任务2的程序执行到延时挂起时,任务0就会被系统调度执行。

执行到申请信号量的函数OSSemPend()时,由于该二值信号量正被任务2使用,所以任务0没有申请到该资源,因而任务0被阻塞,然后被系统挂起,系统再次进行任务调度,此时任务1的优先级最高,所以任务1就会进入运行态。

当任务1被挂起时,就算任务0已经处于就绪态,但仍然要等任务2释放这个二值信号量才到运行。

这样就出现了,当一个共享资源被低优先级占用时,高优先级就得等这个低优先级的任务释放这个共享资源时才能进入运行态。

所以在上面出现了,任务1与任务2的优先级都比任务0的优先的情况。

这就是优先级反转问题。

下面补充一些资料--摘自uC_OS-II内核实验指导书:1、OSSemCreate ();该函数建立并初始化一个信号量,信号量的作用如下:允许一个任务和其他任务或者中断同步取得设备的使用权标志事件的发生函数原型:OSSemCreate(INT16U value);参数说明:value是所建立的信号量的初始值,可以取0到65535之间的任意值。

返回值:OSSemCreate()函数返回指向分配给所建立的信号量的控制块的指针。

如果没有可用的控制块,OSSemCreate()函数返回空指针。

2、OSSemPend()该函数用于任务试图取得设备的使用权、任务需要和其他任务或中断同步、任务需要等待特定事件的发生场合。

如果任务调用OSSemPend()函数时,信号量的值大于零,OSSemPend()函数递减该值并返回该值。

ucOS-II入门教程(任哲) 我见过的讲得最好的RTOS讲解ppt

ucOS-II入门教程(任哲) 我见过的讲得最好的RTOS讲解ppt

应用:通讯录中的一条记录、
操作系统中经常使用 的数据结构(链表)
struct Student{ Student*next int age; char*name; char sex; };
两个元素的链表
next next
使用上的特点: 1。同数据类型数据的集合; 2。不占用连续内存空间。
1。分类存放,但 需要大量的连续存 2。检索速度慢, 定;
处理器中的运行环境和内存中的运行环境任务代码任务堆栈内存处理器pcsp多任务时的问题任务代码任务堆栈内存任务代码任务堆栈当有多个任务时处理器中的运行环境应该怎寄存器组程序运行环境程序虚拟处理器pcsp虚拟处理器pcsp虚拟处理器pcsp虚拟处理器pcsp调度器多任务时任务与处理器之间关系的处理程序处理器pcsp在内存中为每个任务创建一个虚拟的处理器处理器部分的运行环境由操作系统的调度器按某种规则来进行这两个复制工作复制当需要运行某个任务时就把该任务的虚拟处理器复制到实际处理器中复制当需要中止当前任应的虚拟处理器复制到内存复制再把另一个需要运行的任务的虚拟处理器复制到实寄存器组寄存器组也就是说任务的切换是任务虚拟处理器虚拟处理器应该存储的主要信息
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
3
4 5 6 7 y
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
应用软件 操 作 系 统
用户可以调用(普 •通过提供函数(应用程序接 通调用或系统调用) 口(API)),从而使应用程 它们来对系统资源 序的设计人员得以在一个友 好的平台上进行应用程序的 进行操作。

uCOSII的主函数问题

uCOSII的主函数问题

//
OS_TASK_IDLE_ID,
&OSTaskIdleStk[0],
//
OS_TASK_IDLE_STK_SIZE,
(void *)0,
//
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);//
#else
OSTaskCreate(OSTaskIdle, (void *)0,
//任务堆栈栈顶指针
#if OS_TASK_CREATE_EXT_EN
void
*OSTCBExtPtr;
OS_STK
INT32U INT16U INT16U #endif
*OSTCBStkBottom;
OSTCBStkSize; OSTCBOpt; OSTCBId;
//栈底指针
//堆栈单元数量
struct os_tcb *OSTCBNext;
第四章:OSStart()
void OSStart (void)
{
INT8U y; INT8U x;
//任务的开始
if (OSRunning == FALSE) 一次调度,既运行优先级最高的任务
{
y = OSUnMapTbl[OSRdyGrp];
//如果操作系统未运行,则进行
x = OSUnMapTbl[OSRdyTbl[y]];
&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
#endif
#else
#if OS_TASK_CREATE_EXT_EN
OSTaskCreateExt(OSTaskIdle,
(void *)0,

ucos-ii操作系统练习题

ucos-ii操作系统练习题

ucos-ii操作系统练习题一.填空题1.uC/OS-II是一个简洁、易用的基于优先级的嵌入式【抢占式】多任务实时内核。

2.任务是一个无返回的无穷循环。

uc/os-ii总是运行进入就绪状态的【最高优先级】的任务。

3.因为uc/os-ii总是运行进入就绪状态的最高优先级的任务。

所以,确定哪个任务优先级最高,下面该哪个任务运行,这个工作就是由【调度器(scheduler)】来完成的。

4.【任务级】的调度是由函数OSSched()完成的,而【中断级】的调度是由函数OSIntExt() 完成。

对于OSSched(),它内部调用的是【OS_TASK_SW()】完成实际的调度;OSIntExt()内部调用的是【OSCtxSw() 】实现调度。

5.任务切换其实很简单,由如下2步完成:(1)将被挂起任务的处理器寄存器推入自己的【任务堆栈】。

(2)然后将进入就绪状态的最高优先级的任务的寄存器值从堆栈中恢复到【寄存器】中。

6.任务的5种状态。

【睡眠态(task dormat) 】:任务驻留于程序空间(rom或ram)中,暂时没交给ucos-ii处理。

【就绪态(task ready)】:任务一旦建立,这个任务就进入了就绪态。

【运行态(task running)】:调用OSStart()可以启动多任务。

OSStart()函数只能调用一次,一旦调用,系统将运行进入就绪态并且优先级最高的任务。

【等待状态(task waiting)】:正在运行的任务,通过延迟函数或pend(挂起)相关函数后,将进入等待状态。

【中断状态(ISR running)】:正在运行的任务是可以被中断的,除非该任务将中断关闭或者ucos-ii将中断关闭。

7.【不可剥夺型】内核要求每个任务自我放弃CPU的所有权。

不可剥夺型调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。

8.当系统响应时间很重要时,要使用【可剥夺型】内核。

最高优先级的任务一旦就绪,总能得到CPU的控制权。

uCOSII函数说明之–OSTaskCreate()与OSTaskCreateExt()

uCOSII函数说明之–OSTaskCreate()与OSTaskCreateExt()

uCOSII函数说明之–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 CPU status 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-II源码详解

uCOS-II源码详解

uC/OS-II源码分析(总体思路一)首先从main函数开始,下面是uC/OS-II main函数的大致流程:main() {OSInit();TaskCreate(...);OSStart(); }首先是调用OSInit进行初始化,然后使用TaskCreate创建几个进程/Task,最后调用OSStart,操作系统就开始运行了。

OSInit最先看看OSInit完成哪些初始化:void OSInit (void){#if OS_VERSION >= 204OSInitHookBegin();#endifOS_InitMisc();OS_InitRdyList();OS_InitTCBList();OS_InitEventList();#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)OS_FlagInit();#endif#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)OS_MemInit();#endif#if (OS_Q_EN > 0) && (OS_MAX_QS > 0)OS_QInit();#endifOS_InitTaskIdle();#if OS_TASK_STAT_EN > 0OS_InitTaskStat();#endif#if OS_VERSION >= 204OSInitHookEnd();#endif#if OS_VERSION >= 270 && OS_DEBUG_EN > 0OSDebugInit();#endif}OS_InitMisc()完成的是一些其其他他的变量的初始化:OSIntNesting = 0;OSLockNesting = 0;OSTaskCtr = 0;OSRunning = FALSE;OSCtxSwCtr = 0;OSIdleCtr = 0L;其中包括:中断嵌套标志OSIntNesting,调度锁定标志OSLockNesting,OS标志OSRunning 等。

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,不管有没有其他高优先级的就绪任务。

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

uCOS-II原理2

uCOS-II原理2

一个正在运行的 。 任务一旦响应中 断申请就会中止 运行而去执行中 断服务程序,这 时任务的状态叫 做中断服务状态
任务控制块结构的主要成员
任务控制块——任务在系统中的身份证
由于系统存在着多个任务,于是
typedef struct os_tcb { 系统如何来识别并管理一个任务就是 //指向任务堆栈栈顶的指针 *OSTCBStkPtr; OS_STK *OSTCBStkPtr …… 一个需要解决的问题。识别一个任务 INT8 OSTCBStat; INT8U OSTCBStat //任务的当前状态标志 基于上述原因,系统必须为每个任务创建 的最直接的办法是为每一个任务起一 INT8 OSTCBPrio; INT8U OSTCBPrio //任务的优先级别 一个保存与该任务有关的相关信息的数据 个名称。 …… 结构,这个数据结构就叫做该任务的任务 } OS_TCB; 由于µC/OS-II中的任务都有一个 控制块(TCB)。
任务的优先权 及优先级别
void main(void) typedef unsigned int OS_STK; { 在应用程序中定义任务堆栈的栈区非常简单, //这是系统定义的一个数据类型 在创建用户任务时,要 …… 即定义一个OS_STK类型的一个数组并在创建 传递任务的堆栈指针和 OSTaskCreate( 任务优先级别 一个任务时把这个数组的地址赋给该任务就 MyTask, //任务的指针 可以了。 &MyTaskAgu, //传递给任务的参数 例如: & MyTaskStk[MyTaskStkN-1],//任务堆栈栈顶地址 20 //任务的优先级别 //定义堆栈的长度 ); #define TASK_STK_SIZE 512 …… }任务Leabharlann 优先级别。任务在内存中的结构

关于DSP2812上uCOS-II操作系统的说明

关于DSP2812上uCOS-II操作系统的说明

关于uCOS-II操作系统的说明一、工程文件的说明工程的所有文件在ucos目录下,打开工程文件后可以看到下面一些源文件·cmd文件工程的CMD文件与一般程序中的CMD 文件相同。

由F2812.cmd和DSP281x_Headers_nonBIOS.cmd两个文件组成。

其中对F2812.cmd文件进行了一些修改,将代码段定义在FLASH中,.bss和.ebss段都定义在低64K的数据空间中,以保证定义在.ebss段中的人物堆栈可以通过堆栈指针被访问。

·C语言和汇编源文件这部分文件在CCS窗口的Source文件夹下可以看到,主要有下面一些文件:Ucos_ii.c:操作系统的头文件包含文件。

OS_TickISR.asm:主要是OSTickISR( )函数,是操作系统时钟节拍中断的服务函数。

OS_Sw.asm:主要是OSCtxSw( )函数,非中断级任务切换函数,也是系统完成任务切换调用的30号中断(即USER 11 软中断)的中断服务函数。

OS_StartHighRdy.asm:主要是OSStartHighRdy()函数,在操作系统开始运行后(OSStart()函数开始执行以后)启动优先级最高的任务,一般情况下该任务是TaskStart任务。

OS_ISR.asm:中断服务程序的汇编源文件,尽量把要使用的中断服务程序放在这个文件中,使用汇编语言按照OS_SCIARXISR( )的结构编写。

关于中断服务程序后面会进一步加以说明。

OS_IntSw.asm:主要包含中断级任务切换函数OSIntCtxSw( ),完成中断级任务切换。

OS_GlobalStack.c:该文件中主要是全局任务堆栈的定义。

OS_cpu_c.c:该文件中主要是任务堆栈初始化函数OSTaskStkInit( )及其他一些与CPU相关的C语言函数的定义。

Ex1l.c:工程的主函数文件。

DSP281x_xxxx.c:例程中DSP2812外设操作的一些源代码,可以在这些文件中添加必要的操作外设的函数。

ucos中的main函数

ucos中的main函数

任务可选项 接收错误码的变量
开始多任务系统的管理
}

BSP_IntDisAll(); OSInit(&err); if(err!=OS_ERR_NONE){ /.*Something didn't get initialized correctly… /*…check os.h for the mean of the error code .see OS_ERR_xxxx } OSTaskCreat((OS_TCB *)&AppTaskStartTCB,
void main(void) { OS_ERR err; 调用BSP函数关闭所有中断,确保启动期间中断是关闭 的 初始化uC/OS-III */ */ 调用OSTaskCreat函数创建一个任务。第一个参数为分 配给该任务的任务控制块(OS_TCB)的地址 给要创建的任务指定一个名字 任务代码的起始地址 任务第一次运行时会接收到的参数 任务优先级 分配给该任务的栈空间的基地址 该任务栈的深度标记 该任务栈的大小
(CPU_CHAR *)"App Task Start", (OS_TASK_PTR)AppTaskStart, (void *)0, (OS_PRIO)APP_TASK_START_PRIO, (CPU_STK *)&AppTaskStartSTK[0], (CPU_STK_SIZE)APP_TASK_START_STK_SIZE/10, (CPU_STK_SIZE)APP_TASK_START_STK_SIZE, (OS_MSG_QTY)0, (OS_TICK)0, (void *)0, (OS_OPT)(OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR), (OS_ERR *)&err); if(err!=OS_ERR_NONE){ /*The task didn't get created.Lookup the value of the error code…*/ /*…in os.h for the meaning of the error */ } OSStart(&err); if(err!=OS_ERR_NONE){ /*Your code is NEVER supposed to come back to this point. */ }

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);

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。

UCOS-II系统结构及调用

UCOS-II系统结构及调用

内容介绍1、介绍uC/OS-II嵌入式操作系统2、基于uC/OS-II的用电管理终端软件的设计书籍:《嵌入式实时操作系统uC/OS-II》作者:Jean LabrosseuC/OS-II V2.52 通过了美国航空航天管理局(FAA)的安全认证;安全性、可靠性是得到认证的。

我们为什么会选择uC/OS-II嵌入式操作系统?1、与终端硬件平台相适应全部源代码5500行,可裁减定制,生成的可执行代码占15~20k,可以移植到多种系列单片机上,包括ARM;2、考虑成本,免费的源代码公开;3、uC/OS-II代码简单,容易掌握和使用;具有多任务调度的基本功能;uC/OS-II嵌入式操作系统的缺点:1、缺少技术支持,相关的支持软件少;2、和商业软件比,功能较弱(如不支持时间片轮转,最大任务数为64等);对应用开发的支持不够;uC/OS内核介绍和基于RTOS的设计介绍一、概述●使用嵌入式RTOS的优点1 将复杂的系统分解为多个相对独立的任务,采用“分而治之”的方法降低系统的复杂度。

通过将应用程序分割成若干独立的任务,RTOS使得应用程序的设计过程大为简化;2 使得应用程序的设计和扩展变得容易,无需较大的改动就可以增加新的功能;3 用户给系统增加一些低优先级的任务,则用户系统对高优先级的任务的响应时间几乎不受影响;4 实时性能得到提高。

使用可剥夺型内核,所有时间要求苛刻的事件都得到了尽可能快捷有效的处理;5 通过有效的服务,如信号量、邮箱、队列、延时及超时等,RTOS使资源得到更好的利用;●使用嵌入式RTOS的缺点1 使用RTOS增加了系统的内存和CPU等使用开销,例如任务之间的通讯、RTOS的调度程序等;2 需要采用一些新的软件设计方法,对系统设计人员的要求高一些。

例如驱动程序的设计要考虑到共享资源的互斥问题;3 系统任务的划分是比较复杂的过程,需要设计人员对业务和RTOS操作系统都很熟悉。

●uC/OS操作系统的特点uC/OS是一个完成的,可移植、可固化、可裁减的抢占式实时多任务操作系统内核。

ucosii面试题

ucosii面试题

ucosii面试题可剥夺型内核?答:根据优先级可占用当前CPU的使用权一个应用程序为什么一定要使用空闲任务?答:为了让CPU在没有用户任务可执行时有事可做从存储结构上看,任务是如何组成的?答:从存储结构上看,任务由任务控制块、任务堆栈、任务代码三个部分组成。

系统通过任务控制块感知和控制任务;任务堆栈主要用于保护断点和恢复断点;任务代码是一个超循环结构,描述了任务的执行过程。

在创建一个任务时,函数OSTaskCreate()或OSTaskCreateExt()负责给任务分配任务控制块和任务堆栈,并对他们进行初始化,然后将任务控制块、任务堆栈、任务代码三者关联起来形成一个完整的任务。

系统是按照任务就绪表和任务的优先级来调度任务的。

执行任务调度工作的是调度器,它负责查找具有最高优先级别的就绪任务并运行它,同时将该任务的TCB指针存放至OSTCBCur(即获取该任务的TCB指针)。

通常系统在调用API函数和运行中断服务函数程序之后都要调用OSShed()来进行一次任务调度。

什么是空任务控制块链表?什么是任务控制块链表?答:在任务控制块的管理上,ucosii采用两条链表进行管理:一条空任务块链表(其中所有任务控制块还未分配给任务)和一条任务控制块链表(其中所有任务控制块已分配给任务)。

具体做法:系统在进行初始化时,先在RAM中建立一个OS_TCB结构类型的数组OSTCBTbl[ ],然后将各个元素链接成一个链表,从而形成一个空任务块链表。

当系统创建一个任务时,就会将空任务控制块链表表头指针指向的任务控制块分配给该任务。

在给任务控制块中各成员赋值后,系统将按任务控制块链表的表头指针将其加入到任务控制块链表中。

注:空任务控制块链表为单向链表,任务控制块链表为双向链表应用程序首先通过调用OSInit()函数对全局变量以及数据结构进行初始化,以建立ucosii的运行环境,通过调用OSStart()函数开始进入多任务管理的,但在调用OSStart()函数之前必须创建至少一个用户任务。

uCOS-II函数之任务相关函数

uCOS-II函数之任务相关函数

uCOS-II函数之任务相关函数获得更多资料欢迎进⼊或者或者对于有热⼼的⼩伙伴在上私信我,说我的篇幅有些过于长应该分开介绍。

应⼩伙伴的要求,特此将⽂章分开进⾏讲解。

上⽂主要介绍了OSInit()初始化函数,本⽂介绍任务相关的函数:OSTaskCreate()任务创建函数1,OSTaskCreateExt任务创建函数2,OSTaskSuspend()任务挂起,OSTaskResume()唤醒任务OSTaskCreate()任务创建函数1、主要作⽤:建⽴⼀个新任务。

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

中断处理程序中不能建⽴任务;注意,ISR中禁⽌建⽴任务,⼀个任务必须为⽆限循环结构。

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

void *pdata:指向⼀个数据结构,该结构⽤来在建⽴任务时向任务传递参数。

OS_STK *ptos: 指向堆栈任务栈顶的指针INT8U prio:任务优先级4、返回值介绍:OS_NO_ERR:函数调⽤成功。

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

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

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

5、函数主体在os_task.c中OSTaskCreateExt任务创建函数21、主要作⽤:建⽴⼀个新任务。

与OSTaskCreate()不同的是,OSTaskCreateExt()允许⽤户设置更多的细节内容。

任务的建⽴可以在多任务环境启动之前,也可以在正在运⾏的任务中建⽴,但中断处理程序中不能建⽴新任务。

,且不2、函数原型:NT8U OSTaskCreateExt (void (*task)(void *pd),void *pdata, OS_STK *ptos,INT8U prio ,INT16U id, OS_STK*pbos,INT32U stk_size,void pext,INT16U opt)3、参数说明:void (task)(void *pd):指向任务代码⾸地址的指针。

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

//
OS_TASK_IDLE_ID,
&OSTaskIdleStk[0],
//
OS_TASK_IDLE_STK_SIZE,
(void *)0,
//
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);//
#else
OSTaskCreate(OSTaskIdle, (void *)0,
}
OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
OSEventFreeList
= &OSEventTbl[0];
#endif
#if OS_Q_EN && (OS_MAX_QS >= 2) OSQInit();
#endif
#if OS_MEM_EN && OS_MAX_MEM_PART >= 2 OSMemInit();
//
初始化一个任务控制块
if (err == OS_NO_ERR) { OS_ENTER_CRITICAL(); OSTaskCtr++;
OSTaskCreateHook(OSTCBPrioTbl[prio]); OS_EXIT_CRITICAL();
if (OSRunning) {
//如果 OS 已经运行,则
//建立主任务
OSStart(); //任务开始 }
第二章:OSInit() (初始化函数)
void OSInit (void) {
INT16U i;
OSTime
= 0L;
OSIntNesting = 0;
OSLockNesting = 0;
//系统的一些
参数清 0
#if OS_TASK_CREATE_EN || OS_TASK_CREATE_EXT_EN || OS_TASK_DEL_EN
#else
OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[0],
OS_IDLE_PRIO);
#endif
#endif
#if OS_TASK_STAT_EN
#if OS_TASK_CREATE_EXT_EN
#if OS_STK_GROWTH == 1
OSTCBPrioTbl[i] = (OS_TCB *)0;
}
for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) {
OSTCBTbl[i].OSTCBNext = &OSTCBTbl[i + 1]; } OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB
第一章:OS的主函数
//"..." 表示未知内容,根据系统不同的需要而定
#include "..."
//包含一些头文件
#define TASK_STACK_SIZE ... //定义堆栈大小
OS_STK Main_Stack[TASK_STACK_SIZE]= {0, };
//定义堆栈
void Main_Task(void *...);
//
OS_IDLE_PRIO,
//
OS_TASK_IDLE_ID,
&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1],
//
OS_TASK_IDLE_STK_SIZE,
(void *)0,
//
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);//
*OSTCBEventPtr;
#endif
#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN
void
*OSTCBMsg;
#endif
INT16U
OSTCBDly;
ADY 时,任务进入就绪态
INT8U
OSTCBPrio;

OSStatRdy = FALSE;
未就绪
#endif
OSCtxSwCtr = 0;
换次数清 0
OSRdyGrp
= 0;
务列表
for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
OSRdyTbl[i] = 0;
}
//系统利用 //统计任务
//任务切 //就绪任
OSPrioCur = 0;
OSPrioHighRdy = (INT8U)((y << 3) + x);
OSPrioCur = OSPrioHighRdy;
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
OSTCBCur
= OSTCBHighRdy;
OSStartHighRdy(); }
//开始运行优
//任务延时节拍
//任务状态,当它等于
//任务优先级
*)0;
OSTCBFreeList
=
&OSTCBTbl[0];
#if OS_MAX_EVENTS >= 2 for (i = 0; i < (OS_MAX_EVENTS - 1); i++) {
OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
//当
前任务优先级
OSPrioHighRdy = 0;
//将
要运行任务优先级
OSTCBHighRdy = (OS_TCB *)0;
//将要
运行任务的控制块(TCB)
OSTCBCur
= (OS_TCB *)0;
//
当前任务控制块
OSTCBList = (OS_TCB *)0;
for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) {
OSTCBPrioTbl[prio] = (OS_TCB *)1;
OS_EXIT_CRITICAL();
psp = (void *)OSTaskStkInit(task, pdata, ptos, 0); //堆栈初 始化函数,从这里获得任务堆栈的物理栈顶
err = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0);
&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
#endif
#else
#if OS_TASK_CREATE_EXT_EN
OSTaskCreateExt(OSTaskIdle,
(void *)0,
//
&OSTaskIdleStk[0],
void *psp; INT8U err;
if (prio > OS_LOWEST_PRIO) {
//任务的优先级必须小于最低
任务的优先级,因为 OS 的任务优先级是从低到高的.
return (OS_PRIO_INVALID); }
OS_ENTER_CRITICAL(); if (OSTCBPrioTbl[prio] == (OS_TCB *)0) {
先级最高的任务,这个函数涉及到 CPU 寄存器的操作,所以针对具体
不同环境会有所不同
}
第五章:任务控制块 os_tcb
任务控制块里保存任务的一些参数,只有拥有任务控制块的任务
才有运行的可能,当然运行还需要一些其他条件
typedef struct os_tcb {
OS_STK
*OSTCBStkPtr;
//定义主任务
#define Main_PRIO
...
void Main_Task(void *Id)
{
...
}
void Main(void) { ... //系统的一些初始化 OSInit(); //OS 初始化
//Create the Main Task OSTaskCreate(Main_Task, (void *)0, (OS_STK *)&Main_Stack[TASK_STACK_S IZE-1], Main_PRIO);
进行一次任务调度
OSSched(); } } else { OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = (OS_TCB *)0;//任务创建失败,则列表
中重新写为 0
OS_EXIT_CRITICAL(); } return (err); } else { OS_EXIT_CRITICAL(); return (OS_PRIO_EXIST); } }
//
OS_STAT_PRIO);
//
#endif #endif #endif }
第三章:OSTaskCreate()
这是OS里创建任务的一种函数,另外一种是OSTaskCreateExt,创建扩展的任务.
INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio) //这里有 4 个参数,第一个:要创建的任务函数,第二个:传递给任 务的指针,第三个:任务堆栈的栈顶个只是,第四个:任务的优先级. 这四个参数 是创建普通任务所必须的. {
相关文档
最新文档