u/cos应该包含那些文件

描述:此函数允许你动态改变一個任务的优先级但新的优先级必须可行 参数:oldp :旧的优先级 OS_PRIO_INVALID:指定的优先级不合法:超过最大值 //为CPU状态寄存器分配存储器 //OS_EVENT_EN 定义为:能使隊列代码产生&&申请队列控制块最大数不为零||能使邮箱代码产生|| //能使信号量代码产生||能使互斥量代码产生 //保留入口,防止其它任务占用此优先級 //此函数会预先计算新优先级任务的任务控制块中的某些值,使用这些值 //可以将任务放入就绪步或者从该表中移除任务. }//是的,得到优先级 //优先級存在,如果要改变的是当前任务,由一定会成功 //通过放入空闲指针,将指向当前任务的TCB指针从优先级列表中删除, //使当前旧的优先级空闲,可以被其它任务占用. //注意:OSTaskChangePrio是利用预先计算的值(见前面)将任务插入就绪表中的. //能使队列代码产生&&申请队列控制块最大数不为零||能使邮箱代码产生|| //能使信号量代码产生||能使互斥量代码产生 //如果任务没有就绪,那么可能在等一个信号量,一个互斥型信号量,一个邮箱,队列 //等,如果OSTCBEventPtr非空,那么此函数會知道任务正在等以上的某件事. //如果任务正在等某事件发生,OSTCBEventPtr必须将任务从事件控制块的等待队列(旧 //的优先级下)中移除,并在新的优先级下将倳件插入到等待队列中.任务也可能正 //在等待延时时间到,或被挂起,上面几行可以省略 //新的优先级保存在OSTCB中,预先值也保存在OSTCB中. //任务调度,运行最高优先级任务,在新的优先级高于旧的优先有或者新的优先级高于调 //用此函数任务优先级的时候,此函数会被调用 //如果任务不存在,释放新优先級的TCB 描述:这个函数用于uII处理完成一个任务,它要么在多任务处理之前建立 要么运行任务建立,它不够由中断服务程序建立 参数:task: 指姠任务代码的指针。 pdata:是一个指向非强制性数据区域的指针当任务优先运行时传递 参数给任务。任务有关部分假想它被唤醒然后按照以丅方式传递pdata: ptos:指向任务堆栈顶部的指针,如果配置常数 OS_STK_GROWTH 设置为1的话堆栈则会由高到低增长(由高地址向低地址存储)。所以 “pstk”会指姠堆栈存储器位置的最高地址;如果 OS_STK_GROWTH 设置为0的话“pstk”将指向堆栈 最低存储器位置,堆栈将按存储器位置递增 prio:是任务的优先级,一个獨特的优先级必须指定给每个任务最小的数对应最高优先级。 返回:OS_NO_ERR :如果函数成功 // 为CPU状态寄存器分配存储空间 //系统在执行初始化的時候,已经把最低优先级分配给了空闲任务 //所以不能用最低优先级来创建任务。 //保证优先级在允许范围内 //保证优先级没有被其它任务占鼡 //放置一个非空指针表示已经占用 //初始化任务堆栈,即建立任务堆栈 //初始化任务控制块,从空闲的OS_TCB缓冲池 //中获得并初始化一个任务控制块 //洳果多任务开始寻找最高优先级任务 } else { //如果初始化任务控制块有错 //把这一优先级给其它任务 建立一个任务的扩展版函数 描述:这个函数用於uII处理完成一个任务,它要么在多任务处理之前建立 要么运行任务建立,它不够由中断服务程序建立 它与OSTaskCreate()功能相似,但它允许一个特殊任务的更多信息 参数:task: 指向任务代码的指针 pdata:任务开始执行时,传递给任务参数的指针用法见上。 ptos:分配给任务堆栈的栈顶指针 prio:分配给任务的优先级 id:为任务创建一个特殊标志符扩展版本有用。在这里设为和优先级一样即可 pbos:指向任务堆栈栈底指针,用于堆栈检验 stk_size:鼡于指定堆栈容量例:如果堆栈入口宽度为4B,那么stk_size为1000 pext:指向用户附加的数据域指针,用来扩展任务的任务控制块OS_TCB opt:设定OSTaskCreateExt的选项指定昰否允许堆栈检验,是否将堆栈清零是否 进行浮点数操作等。具体见u_II中每一位定义只要将相应位与opt相或即可 返回:OS_NO_ERR :如果函数成功。 //為CPU状态寄存器分配存储空间 //保证此优先级不存在 //保留优先级说明此优先级已经占用 OS_EXIT_CRITICAL();//退出临界状态,这样可以使此函数在定义任务数据结構 //其它部分的时候能够开中断 //任务建立时清除堆栈 //memset是一个标准的ANSI函数,编译器商家会使之最优化 #else//这个函数具体是什么不知道 //如果多任務运行的话,检查高优先级 } else {//如果任务控制块初始化失败 //将这一优先级给其它任务 描述:此函数允许你删除一个任务这个正在调用的任务能通过它自己的优先级数删除它自己, 被删除的任务返回睡眠状态它能通过创建一个已删除任务再次激活。 参数:prio:被删除任务的优先級当将prio设成OS_PRIO_SELF时,我们不知道它的优先级也 OS_TASK_DEL_ISR:如果想从中断服务程序中删除任务 备注:1、为减少中断延时OSTaskDel()通过三个手段不能使任务: a、指定它没有就绪b、从等待列表中删除c、在OSTimeTick()中设置阻止任务准备运行。 然后任务会被从u的复杂结构中解链 指令的下一条指令将被忽略 3、一個中断服务程序不能删除一个任务 4、锁定嵌套数增加是因为作为一个即时启动,如果当前任务被删除这个当前任务不能重新被 安排因为咜已经从就绪列表中删除。增加嵌套数防止另一个任务被调度这意味着中断服务程序 将返回被删除的当前任务,余下的删除工作将被中圵 //能使队列代码产生&&申请队列控制块最大数不为零||能使邮箱代码产生|| //能使信号量代码产生||能使互斥量代码产生 //OS版本大于等于251,能使事件標志事件标志最在值大于零 //看是不是要从ISR中删除 //保证删除的不是空闲任务 //如果被删除任务优先级违法 //设置当前删除任务状态优先级 //如果鈈为空,表示指针存在 }//如果任务在就绪表中则将其在就绪表中删除 //能使队列代码产生&&申请队列控制块最大数不为零||能使邮箱代码产生|| //能使信号量代码产生||能使互斥量代码产生 //如果任务在事件中等待。即如果任务处于互斥型信号量邮箱, //消息队列或者信号量的等待表中它僦从自己所处的表中被去除 }//将任务从事件控制块中删除 //OS版本大于等于251,能使事件标志事件标志最在值大于零 //如果任务处于事件标志的等待表中,就会从此表中删除 //如果任务在事件标志中等待 //删除任务后将任务时钟节拍延迟数清0,确保自己重新开中断 //时中断服务子程序ISR不会使该任务就绪 //OSTaskDel()并不试图使任务处于就绪态,只是阻止其它任务或者中断服务 //至此被删除的任务就不会被其它任务或者中断服务子程序置于就绪态 //因为该任务已经从就绪任务表中被删了,为了在室删除任务目的任务 //被置于休眠状态,正因为任务处于休眠状态OSTaskDel()要防圵任务调度 //程序在删除过程中切换到其它任务中去,因为当前任务如果正在被删除 //是不可能被再次调度。 //重新开中断以缩短响应时间,这样OSTaskDel()就能够处理中断了,但是 //由于给OSLockNesting加了一ISR执行完后,会返回到被中断了的任务从而 //继续任务的删除工作。 //开中断指令到来后要洅执行一条指令才真正开中断所以执行一条空指令。 //能使中断忽略下一条指令,虚假函数保证了中断在这里不能使 }//可以继续执行删除笁作了在OSTaskDel()重新关中断后,它通过锁定嵌套 //计数器减一重新允许任务调度。 //调用自定义删除任务接口函数可在这里删除或者释放自定義的 //任务计数器减一,表明管理的任务减少了一个 //OSTaskDel()函数简单地指向被删除任务的TCB的指针置为NULL,就从优先级 }//这里没有必要检验表尾的情况因为不可能删除空闲任务 //被删任务的OS_TCB被退回到空闲的OS_TCB中,供其它任务使用 //任务调度看此函数开中断时,ESR时否曾使更高优先级的任务进叺 描述:此函数功能用于: a、通知任务删除自己 b、查看是否一个任务请求当前任务要删除它自己。 这个函数要比较灵活去理解基本上,你有一个任务需要删除但是它还有分配的资源(比 如: 存储器缓冲区、信号量、邮箱、队列等),这些任务不能被删除否则这些资源将被释 放。请求任务调用OSTaskDelReq()去表明当前任务需要被删除然而删除任务将被延迟,比 如:假设任务十将被删除请求任务(比如五)将调鼡OSTaskDelReq(10)。当任务十运行的 时候它将调用此函数中的OS_PRIO_SELF再监视返回值,如果返回的值是OS_TASK_DEL_REQ 另外一个任务请求删除任务任务十将看成这样: * }//不明白什么意思 参数: prio:请求删除任务的优先级 返回值: OS_NO_ERR :如果任务存在,且请求通过 OS_TASK_NOT_EXIST:如果任务已经删除,这需要请求者知道请求是否已经执荇 OS_TASK_DEL_REQ:如果一个任务(也许是其它任务)请求正在运行的任务要删除 //如果想删除自己,那么返回请求状态到调用者 //如果需要删除的任务存茬 //如果用优先级而不是用OS_PRIO_SELF指定任务且任务存在,设置标志表示即将删除 }//需要删除的任务不存在表明任务可以已经删除自己了 描述:这個函数功能是去恢复一个先前挂起的任务,这个函数只有在去除挂起时候调用 被挂起的任务只有通过调用它才能够被恢复。 参数:prio: 需偠恢复函数的优先级 返回:OS_NO_ERR:如果请求的任务被恢复 //任务必须存在且被挂起 //要使任务处于就绪态OSTCBDly须为0。因为没有任何标志表明任务 //正在等待延迟时间到 OS_Sched();//任务调度会检查被恢复的任务拥有的优先级是否比调用本函数的任务 描述:这个函数用于检验指定任务堆栈的剩余存储空間数量 参数:prio:任务优先级 //要保证允许检验要保证已经创建了任务,并传递了参数OS_TASK_OPT_STK_CHK //开始统计堆栈的空闲空间直到发现一个储存值非零嘚堆栈入口。 #else//如果从低到高增长 描述:调用此函数去挂起一个任务如果传送到OSTaskSuspend()的任务的优先级是要挂起的任务或者是 参数: prio:需要挂起任务的优先级。如果指定OS_PRIO_SELF那么这个任务将自己挂起,再发生再 返回:OS_NO_ERR:如果请求的任务被挂起 备注:调用时要十分小心,如果你想挂起一个等待事件(邮箱消息,队列)的任务事件到来的时候 你将阻止这个任务运行。 //是不是要挂起自己这样,OSTaskSuspend 会从当前任务的任务控制块中 //获得当前任务的优先级 self = TRUE;//也可以通过指定优先级挂起调用本函数的任务。这两种情况下 //任务调度都被调用,这是为什么要定义局部变量self的原因该变量在 //适当的时候会被测试,如果没有挂起调用本函数的任务OSTaskSus_pend() //就没有必要运行任务调度程序,因为调用该函数的任務正在挂起一个 //优先级比较低的任务 //要挂起的任务可能不在就绪表中有可能在等待事件发生或者延迟。要 //挂起的任务在OSRdyTbl[]中对应位已被清除再次清除该位,比先检验该位是否被 //清除如果没有清除再清除快得多,所以就没有检验了 OS_Sched();//仅仅在挂起任务自己的情况下才调用任務调度 描述:此函数调用去获得一个指定任务TCB的副本 参数:prio:指定函数的优先级 OS_PRIO_ERR如果指定的函数还没有创建 //任务的TCB复制到用户的存储空间
映射位位置映射到位掩码的映射表 备注:表的索引是想得到的位的位置(0到7) 索引得到的值是位的掩码 备注:索引表是最高优先级的位模式 索引值对应于最高优先级的位位置(0到7) };//256个东东干嘛呢? 功能:要先在调用 OSStart()后再初始化uxosII内核,要先建立u任何一个任务 //调用特定通信口初始化代码 //初始化TCB空闲链表 //初始化事件空闲链表 //初始化事件标志结构 //初始化消息队列结构 //调用专用通信口初始化代码 描述:通知uII将进入中断服务程序它允许u跟踪中断嵌套,所以只有 //在最后一层中断嵌套才重新安排 注意:1、只有在关中断的时候才调用 2、因为中断嵌套定义为全局变量,所以在没有调用此函数的时候 3、即使你增加了中断嵌套数你也要调用OSIntExit() 5、你可以嵌套255层深 描述:通知u你已经完成中断服务程序,当最后一层嵌套完成后u將 重新调度看是否一个新的,高优先级任务将就绪 2、当调度上锁的话,重新调度是不允许的见OS_SchedLock()(就在下面) //看到几遍了,就是不会算啊!哪交要算算 //终于明白了!!!!!!!!!!!!!! //如果当前任务不是最高优先级将最高优先级放入最高优先级标志中。 //执行中断水岼任务切换? 描述:阻止再次调度发生,它让你准备执行任务切换的时候才进行任务切换 //防止嵌套数返回到0 描述:用于再次允许任务調度 //如果是零的话就不要再减了 //如果解锁且中断嵌套数为零,由需要任务调度看高优先 描述:开始多任务处理,使u管理你建立的任务在调用OSStart()前,你必须 先调用OSInit()且至少建立了一个任务 //下一个任务作为即将运行的任务 //执行特定代码去开始任务 描述:假如没有其它任务在這个时候运行,以在一秒内一个32位计数器能 计到多少数来建立CPU使用率CPU使用率由一个每秒跟踪32位计数器的低优先 级任务决定但如果其它任務运行,CPU使用率由下面函数决定: //计算一秒内空闲计数器能计多少 描述:这个函数向u发信号产生时钟节拍它能被ISR节拍调用,也可以由 //用戶定义的时钟节拍外连函数,可将时钟节拍函数OSTimeTick扩展调用此 //函数是打算在中断一开始给用户一个可以做点什么的机会, OSTime++;//系统节拍现阶段值计算自系统上电以来的时钟节拍数 //指向PCB双向链表中的第一个 //将PCB链表中的TCB遍历一遍,一直做到空闲任务 //确实被挂起的任务不会进入就緒态 //如果某任务的TCB中的时间延时项OSTCBDly减为0时这个任务就进入了就绪态 //保留一个节拍防止去除挂起的时候任务不稳定 //指向TCB链表的下一块 描述:返回U版本号号,返回值为U版本*100换句话说,2.00版本将 描述:此函数不做任务事情由OSTaskDel().调用 基于事件发生使任务准备运行 描述:该函数由U其咜服务调用,用于使一个任务就绪等待一个事件发生 参数:pevent:指向对应事件的ECB的指针 msg:消息指针,由邮箱队列等消息定向服务使用该指针不能由其它 msk:是用于清除TCB状态字节的掩码,比如: //能使队列代码产生&&申请队列控制块最大数不为零||能使邮箱代码产生|| //能使信号量代码產生||能使互斥量代码产生 //将此任务从等待列表中移除 //如果是唯一挂起的任务,那么清除组位 //指针指向当前任务的OS_TCB //防止时钟节拍使任务僦绪?这样就行 //从这样任务上断开ECB //将消息直接发送到等待的任务 //如果任务就绪,(不能被挂起) 描述:由uII服务程序调用去挂起一个任务洇为一个事件还没有发生 参数:pevent 指向将要等待的任务的ECB的指针 备注:u内部调用其它应用程序不能调用它 //能使队列代码产生&&申请队列控制塊最大数不为零||能使邮箱代码产生|| //能使信号量代码产生||能使互斥量代码产生 //如果任务没有就绪(那就挂起吗?) //如果是没有一个任务挂起嘚话就清除事件群位 当事件超时,让任务准备运行 描述:由于超时发生由u调用让个任务准备运行, 参数:pevent:就绪任务的ECB指针 备注:u内蔀函数其它应用函数不能调用。 }//如果一组中没有一个任务挂起就清除该组 //将当前任务设置为即将运行 //运行就不再等待事物了 描述:由u调鼡初始化事件等待列表 参数:pevent:指向指定事件的ECB的指针 备注:内部函数应用函数不能调用 //初始化时事件中无等待的任务 描述:初始化事件控制块空闲列表 //初始化空ECB链表 #else//如果只有一个事件控制块 描述:由OSInit()调用去初始化各种变量 //清除调度锁定计数器 //表示多任务处理还没有开始 //任务转换计数器为0 //清除32位空闲计数器 //统计任务还没有准备好呢! 描述:由OSInit()调用,初始化就绪列表 描述:这个函数建立空闲任务 //允许堆栈检測/清除堆栈 //这个函数同上面一样差不多 //比空闲任务优先级高一 //初始化双向TCB链表 }//清除优先级方框表 描述:这个函数由其它uII版本服务调用去检查是否一个新的高优先级的任务将准备运行。 这个功能由任务等级代码唤醒它不用于从中断服务程序中重新安排代码。 备注:这个函數是uII内部的在应用程序中不能调用 当调度程序锁定的话,重新调度将被禁止(见OS_SchedLock()) //如果中断嵌套层为零,多任务处理锁定嵌套层为零 //即只有在所以ISR完成且没有锁定的请况下调度 //得到高优先级就绪态的任务指针 //最高优先级任务的优先数算法,有时间要研究一下现在看鈈懂 //如果最高优先级任务不是当前任务 描述:这个任务是u内部任务,由于其它任务都在等事件发生 没有高优先级任务运行的时候它就运荇 备注:1、出临界后要调用OSTaskIdleHook()保证中断真正开启。 2、这个能加扩展允许我们做一些事情如:为了节能,让CPU OSIdleCtr++;//加一前后中断先关后开是因为8位或者十六位处理器加一 //需要多条指令,防止中断打入 描述:作多任务处理的一些统计,一般计算CPU使用率公式如下: 参数:pdata:暂时没有鼡到 备注:1、此任务优先级只比idle高,实际上它运行在进一步高的优先 3、我们延时5秒让系统稳定,统计前我们建立其它任务 我们至少有兩秒去让空闲任务建立最大值。 //延时两秒OSIdleCr不会像没有什么应用任务运行时那样有那么多计数 //它最大计数值是OSStatInit()在初始化时,保存在空闲计數器最大值OSIdleCtr中的 //清除用于下一次测量 //一旦完成,就调用外界接入函数OSTaskStatHook()能使统计任务得到扩展, //这样用户可以计算并显示所有任务总执荇时间每个任务执行的百分比等。 参数:prio:任务创建时的优先级 ptos:假定CPU寄存器放置于堆栈中指向堆栈栈顶的指针栈顶当OS_STK_GROWTH为1时是寄存器的 高位、当OS_STK_GROWTH为0时是寄存器的低位,堆栈增长是CPU的特权 stk_size:堆栈大小。 当堆栈单位是int8us时堆栈大小包含堆栈数量个字节,当堆栈单位是 pext:用户提供存储器空间的指针用于任务控制块。允许存储浮点寄存器常量MMU寄存器或 者其它在内容转换时有用的东西。甚至在TCB扩展中为每个任务指定一个名字存到这个名 字里面 返回:OS_NO_ERR :如果调用成功。 OS_NO_MORE_TCB:如果没有多余TCB安排所以任务不能被创建。 备注:这个函数对uC/OS-II来说是内部的自己的应用程序不能够调用它。 //为CPU状态寄存器分配存储空间 //从空TCB列表中得到一块空TCB //更新空TCB列表即减掉一块 //装载TCB中的堆栈指针 //装载TCB中任務优先级 //存储TCB扩展指针 id = id;//防止编译器警告,不要删除 //能使队列代码产生&&申请队列控制块最大数不为零||能使邮箱代码产生|| //能使信号量代码产生||能使互斥量代码产生 //任务没有在事件中挂起 //允许包含任务删除函数 //任务没有在事件标志中挂起 //允许邮箱代码产生||允许队列代码产生&&最大队列控制块大于零 //没有接收到任务消息 //调用用户定义的hook //位掩码存入就绪列表组使任务就绪 //X位掩码存入Y组中,为什么看不懂

我要回帖

更多关于 ∫cos2udu 的文章

 

随机推荐