uCOS-II任务讲解
- 格式:pdf
- 大小:181.04 KB
- 文档页数:3
例2-6 设计一个只有一个任务MyTask的应用程序,当程序运行后,任务MyTask的工作就是每秒在显示器上面显示一个字符“M”。
学习实验代码,分析实现过程,观测实验结果,并写出实验报告。
例2-7 在例2-6应用程序的任务MyTask中再创建一个任务YouTask,当程序运行后,任务MyTask的工作在显示器上面显示一个字符“M”;而任务YouTask则是在显示器上显示字符“Y”。
学习实验代码,分析实现过程,观测实验结果,并写出实验报告。
例2-8 修改例2-7应用程序的任务YouTask。
要求任务YouTask运行20次后,挂起任务MyTask;任务YouTask运行40次后,恢复任务MyTask。
学习实验代码,分析实现过程,观测实验结果,并写出实验报告。
例2-9 改造例2-7的任务MyTask,当任务MyTask运行10次时,用函数OSSchedLock( )对调度器进行加锁;而当任务MyTask运行到第80次时,再用函数OSSchedUnlock( )对调度器进行解锁,并运行该程序。
学习实验代码,分析实现过程,观测实验结果,并写出实验报告。
例2-10 修改例2-7的应用程序,使任务MyTask能删除任务YouTask。
学习实验代码,分析实现过程,观测实验结果,并写出实验报告。
例2-11 建立一个起始任务TaskStart,由它再建立4个任务Task1、Task2、Task3和TaskClk 来完成如下任务:●由Task2和Task3各自来完成一个动画显示任务:在屏幕上依次输出字符“|”、“\”、“-”、“/”,而产生一个向左转动和一个向右的动画标志;●由TaskClk来获取系统时间并显示;●由Task1来初始化屏幕,创建其他4个任务和检查所有5个任务的任务堆栈使用情况并显示出来。
学习实验代码,分析实现过程,观测实验结果,并写出实验报告。
例3-1 在例2-6应用程序的基础上,在OS_CPU_C文件中按如下代码定义函数OSTimeTickHook( ) ,然后运行并查看运行结果。
uCOS-II任务及其结构
正如前⾯所介绍,在uC/OS-II中,任务包括任务控制块、任务堆栈以及任务代码组成,
其中任务控制块包括程序控制块+链表(前⼀篇内容):指向前⼀个任务控制块的指针,后⼀⼽任务控制块的指针,指向任务指针,指向任务堆栈的指针以及任务的优先级等等,
任务堆栈是⽤来保存任务的环境,
任务代码即为需要执⾏的任务内容,
介绍下线程与进程的定义:
线程,不占有私有空间的任务
进程,占有私有任务的任务
在uC/OS-II中,任务可分为⽤户任务和系统任务,系统中,最多可以含有64个任务(包括系统任务和⽤户任务),其中⼀个具体的时刻只可以存在⼀个任务占⽤CPU(运⾏状态),⽽其他任务只可以出于其他状态,系统任务的状态主要有:
睡眠状态:没有配备任务控制块或被剥夺了任务控制块
就绪状态:配备了任务控制块且在任务就绪表中登记
运⾏状态:处于就绪状态且获得了CPU的使⽤权,
等待状态:正在运⾏的任务,需要等待⼀段时间或者需要等待⼀个事件的触发再运⾏,此时CPU的使⽤权将让给其他的任务:使该任务进⼊等待状态,
中断服务状态:⼀个正在运⾏的任务⼀旦响应中断申请就会中⽌运⾏,转⽽执⾏中断服务程序(需要保存断点)
任务代码是⼀个⽆限循环结构,并且在循环中可以响应中断,这种结构是超循环结构,⽤户任务是需要调度才会被执⾏的,操作系统在管理⽤户任务的同时会处理⼀些内部事务(系统任务),为了使CPU在没有⽤户任务可执⾏时,有事可做,uC/OS-II提供了⼀个空闲任务(OSTaskIdle())的系统任务(简单说就是任务运⾏次数计数器),还包含统计任务(CPU使⽤率),即每秒计算⼀次CPU在单位时间内被使⽤的时间,并把计算结果以百分⽐形式存放在OSCPUsage中。
Ucos-II基础原理讲解,任务创建及中断问题2013-6-26 周三Haibara AI Ucos-II在移植过程中的特性,首先要理解所加入的实时操作系统是一个给予定时器节拍的系统。
怎么理解这个问题呢,由该定时器产生脉冲来驱动不同的任务调度,且由于该系统是基于可剥夺内核类型,任务之间的切换时间间隔也由该定时器完成。
不宜过大,否则会造成CPU利用率不高,不宜过小,否则会造成CPU在执行任务时非常被动,时间特别赶。
就想人的心脏一样,动力是固定的,你非要去跑个100公里,心脏不加速你是会窒息而死的。
我们正常心脏跳动是60次左右,同样,单片机也需要一个这样的相对宽松的节拍驱动。
注:众所周知,脉冲本质上仍由晶振提供(或实时时钟),原理都一样,再次请各位不要较真,就暂时以晶振为例。
大家可以考虑一下,晶振的作用是否特别类似于人体的心脏呢?答案是很显然的。
心脏跳动给人体提供输送血液和养料的压力,晶振的设计原理也正是源于此。
他可以像人体心脏一样提供动力输送各个外设(相当于人体器官)所需要的能量。
说这么多,就是要大家理解,人可以实时做出反应,因为人是有生命的,也就是他有反应、判断和处理能力,可以决定什么时间应该做什么。
但是单片机是没有生命的,换句话说,他所谓的处理能力源于人们的代码和程序。
那么,怎么让单片机像人一样拥有生命呢?答案很简单,给他指令,帮助他决定什么时间该做什么,这也就是所谓的实时操作系统。
不只是ucos,其他实时操作系统也是这个道理。
下面我以代码为例,讲述一下ucos的工作流程,如有错误,还请各位前辈指点。
首先任务是怎么样开始执行的?os_err = OSTaskCreateExt((void (*)(void *)) App_TaskStart, */1 (void * ) 0, 2(OS_STK * )&App_TaskStartStk[APP_TASK_START_STK_SIZE - 1],3(INT8U ) APP_TASK_START_PRIO,4(INT16U ) APP_TASK_START_PRIO,5(OS_STK * )&App_TaskStartStk[0],6(INT32U ) APP_TASK_START_STK_SIZE,7(void * )0,8(INT16U )(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK));9这个东西好像是非常复杂,但是实际上并不需要细究(当然非要细究也是允许的,只不过是C语言而已,看也不是看不懂,对于初学者而言并不推荐而已)。
第1章范例 - - - - - - - - - - - - - - - - - - - - - - - - - - 11.00 安装µC/OS-II- - - - - - - - - - - - - - - - - - - - - - - - - - -11.01 INCLUDES.H- - - - - - - - - - - - - - - - - - - - - - - - - - - - 21.02 不依赖于编译的数据类型- - - - - - - - - - - - - - - - - - - - - - 21.03 全局变量- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 31.04 OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL()- - - - - - - - - - - - -51.05 基于PC的服务- - - - - - - - - - - - - - - - - - - - - - - - - - -51.05.01 字符显示- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 51.05.02 花费时间的测量- - - - - - - - - - - - - - - - - - - - - - - - - - 61.05.03 其他函数- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 61.06 应用µC/OS-II 的范例- - - - - - - - - - - - - - - - - - - - - - - 71.07 例1- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -81.07.01 main()- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 81.07.02 TaskStart()- - - - - - - - - - - - - - - - - - - - - - - - - - - -111.07.03 TaskN()- - - - - - - - - - - - - - - - - - - - - - - - - - - - -121.08 例2- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 131.08.01 main()- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 141.08.02 TaskStart()- - - - - - - - - - - - - - - - - - - - - - - - - - - - 15 1.08.03 TaskN()- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 16 1.09 例3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 191.09.01 main() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 20 1.09.02 任务 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 21 1.09.03 注意 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 24第2章实时系统概念- - - - - - - - - - - - - - - - - - - - - - - - - - 272.0 前后台系统(FOREGROUND/BACKGROUND SYSTEM) - - - - - - - - - - - - 27 2.1 代码的临界段- - - - - - - - - - - - - - - - - - - - - - - - - - - - 28 2.2 资源- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -28 2.3 共享资源- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -28 2.4 多任务- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -28 2.5 任务- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -29 2.6 任务切换(CONTEXT SWITCH OR TASK SWITCH) - - - - - - - - - - - - - - -30 2.7 内核(KERNEL)- - - - - - - - - - - - - - - - - - - - - - - - - - -302.8 调度(SCHEDULER)- - - - - - - - - - - - - - - - - - - - - - - - - 312.9 不可剥夺型内核(NON-PREEMPTIVE KERNEL)- - - - - - - - - - - - - - - 31 2.10 可剥夺型内核- - - - - - - - - - - - - - - - - - - - - - - - - - - - 32 2.11 可重入性(REENTRANCY)- - - - - - - - - - - - - - - - - - - - - - - 33 2.12 时间片轮番调度法- - - - - - - - - - - - - - - - - - - - - - - - - - 35 2.13 任务优先级- - - - - - - - - - - - - - - - - - - - - - - - - - - - -352.14 2.14静态优先级 - - - - - - - - - - - - - - - - - - - - - - - - - - 352.15 动态优先级 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 35 2.16 优先级反转 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 35 2.17 任务优先级分配 - - - - - - - - - - - - - - - - - - - - - - - - - - -37 2.18 互斥条件- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 39 2.18.1 关中断和开中断- - - - - - - - - - - - - - - - - - - - - - - - - - - 39 2.18.2 测试并置位- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 40 2.18.3 禁止,然后允许任务切换- - - - - - - - - - - - - - - - - - - - - - - - 40 2.18.4 信号量(SEMAPHORES) - - - - - - - - - - - - - - - - - - - - - - - - - 41 2.19 死锁(或抱死)(DEADLOCK (OR DEADLY EMBRACE))- - - - - - - - - - - - -46 2.20 同步- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 462.21 事件标志(EVENT FLAGS) - - - - - - - - - - - - - - - - - - - - - - - 482.22 任务间的通讯(INTERTASK COMMUNICATION) - - - - - - - - - - - - - - - - 482.23 消息邮箱(MESSAGE MAIL BOXES) - - - - - - - - - - - - - - - - - - - -492.24 消息队列(Message Queue) - - - - - - - - - - - - - - - - - - - - - - 502.25 中断- - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - 512.26 中断延迟- - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - 512.27 中断响应- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 52 2.28 中断恢复时间(Interrupt Recovery) - - - - - - - - - - - - - - - - - - 522.29 中断延迟、响应和恢复- - - - - - - - - - - - - - - - - - - - - - - - 532.30 中断处理时间- - - - - - - - - - - - - - - - - - - - - - - - - - - - 532.31 非屏蔽中断(NMI) - - - - - - - - - - - - - - - - - - - - - - - - - - 542.32 时钟节拍(Clock Tick) - - - - - - - - - - - - - - - - - - - - - - - - 562.33 对存储器的需求- - - - - - - - - - - - - - - - - - - - - - - - - - - 582.34 使用实时内核的优缺点- - - - - - - - - - - - - - - - - - - - - - - - 592.35 实时系统小结- - - - - - - - - - - - - - - - - - - - - - - - - - - - 60第3章内核结构- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 623.0 临界段(Critical Sections) - - - - - - - - - - - - - - - - - - - - - 623.1 任务- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 623.2 任务状态- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 643.3 任务控制块(Task Control Blocks, OS_TCBs)- - - - - - - - - - - - - - 653.4 就绪表(Ready List)- - - - - - - - - - - - - - - - - - - - - - - - 683.5 任务调度(Task Scheduling)- - - - - - - - - - - - - - - - - - - - - 713.6 给调度器上锁和开锁(Locking and UnLocking the Scheduler) - - - - - - - 723.7 空闲任务(Idle Task) - - - - - - - - - - - - - - - - - - - - - - - - 733.8 统计任务- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 743.9 μC/OS中的中断处理- - - - - - - - - - - - - - - - - - - - - - - - - -783.10 时钟节拍- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 823.11 μC/OS-Ⅱ初始化- - - - - - - - - - - - - - - - - - - - - - - - - - 843.12 μC/OS-Ⅱ的启动- - - - - - - - - - - - - - - - - - - - - - - - - - 853.13 获取当前μC/OS-Ⅱ的版本号- - - - - - - - - - - - - - - - - - - - - - 883.14 OSEvent???()函数- - - - - - - - - - - - - - - - - - - - - - - - - - 89第4章任务管理4.0 建立任务,OSTaskCreate() - - - - - - - - - - - - - - - - - - - - - 914.1 建立任务,OSTASKCREATEEXT() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 924.2 任务堆栈 94.3 堆栈检验,OSTASKSTKCHK() 114.4 删除任务,OSTASKDEL() 144.5 请求删除任务,OSTASKDELREQ() 174.6 改变任务的优先级,OSTASKCHANGEPRIO() 204.7 挂起任务,OSTASKSUSPEND() 234.8 恢复任务,OSTASKRESUME() 254.9 获得有关任务的信息,OSTASKQUERY() 26第5章时间管理5.0 任务延时函数,OSTIMEDLY() 15.1 按时分秒延时函数 OSTIMEDLYHMSM() 35.2 让处在延时期的任务结束延时,OSTIMEDLYRESUME() 45.3 系统时间,OSTIMEGET()和OSTIMESET() 6第6章任务之间的通讯与同步6.0 事件控制块ECB 26.1 初始化一个ECB块,OSEVENTWAITLISTINIT() 66.2 使一个任务进入就绪状态,OSEVENTTASKRDY() 76.3 使一个任务进入等待状态, OSEVENTTASKWAIT() 96.4 由于等待超时将一个任务置为就绪状态, OSEVENTTO() 96.5 信号量106.5.1 建立一个信号量, OSSemCreate() 116.5.2 等待一个信号量, OSSemPend() 126.5.3 发送一个信号量, OSSemPost() 146.5.4 无等待地请求一个信号量, OSSemAccept() 166.5.5 查询一个信号量的当前状态, OSSemQuery() 176.6 邮箱186.6.1 建立一个邮箱,OSMboxCreate() 196.6.2 等待一个邮箱中的消息,OSMboxPend() 206.6.3 发送一个消息到邮箱中,OSMboxPost() 226.6.4 无等待地从邮箱中得到一个消息, OSMboxAccept() 246.6.5 查询一个邮箱的状态, OSMboxQuery() 256.6.6 使用邮箱作为二值信号量266.6.7 使用邮箱实现延时,而不使用OSTimeDly() 276.7 消息队列286.7.1 建立一个消息队列,OSQCreate() 316.7.2 等待一个消息队列中的消息,OSQPend() 336.7.3 向消息队列发送一个消息(FIFO),OSQPost() 356.7.4 向消息队列发送一个消息(LIFO),OSQPostFront() 376.7.5 无等待地从一个消息队列中取得消息, OSQAccept() 396.7.6 清空一个消息队列, OSQFlush() 406.7.7 查询一个消息队列的状态,OSQQuery() 416.7.8 使用消息队列读取模拟量的值426.7.9 使用一个消息队列作为计数信号量43第7章内存管理7.0 内存控制块 17.1 建立一个内存分区,OSMEMCREATE() 37.2 分配一个内存块,OSMEMGET() 67.3 释放一个内存块,OSMEMPUT() 77.4 查询一个内存分区的状态,OSMEMQUERY() 87.5 USING MEMORY PARTITIONS 97.6 等待一个内存块 11第8章移植µC/OS-Ⅱ8.00 开发工具8.01 目录和文件8.02 INCLUDES.H8.03 OS_CPU.H8.03.01 与编译器相关的数据类型8.03.02 OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()8.03.03 OS_STK_GROWTH8.03.04 OS_TASK_SW()8.04 OS_CPU_A.ASM8.04.01 OSStartHighRdy()8.04.02 OSCtxSw()8.04.03 OSIntCtxSw()8.04.04 OSTickISR()8.05 OS_CPU_C.C8.05.01 OSTaskStkInt()8.05.02 OSTaskCreateHook()8.05.03 OSTaskDelHook()8.05.04 OSTaskSwHook()8.05.05 OSTaskStatHook()8.05.06 OSTimeTickHook()第9章µC/OS-II在Intel 80x86上的移植9.00 开发工具9.01 目录和文件9.02 INCLUDES.H文件9.03 OS_CPU.H文件9.03.01 数据类型9.0302 代码临界区第一章:范例在这一章里将提供三个范例来说明如何使用µC/OS-II。
uC/OS-II 的任务:从任务的存储结构来看,uC/OS-II的任务由三个部分构成:1任务程序代码,任务的执行部分2任务堆栈,用来保存任务工作环境3任务控制块,用来保存任务属性每一个任务都作为一个节点,组成一个双向的任务链表。
用户任务:从程序代码上看,用户任务似乎就是一个C语言函数,但是这个函数不是一般的C语言函数,它是一个任务(线程)。
因此,它不是被主函数或其他函数调用的,主函数mian()只是负责创建和启动它们,而由操作系统负责来调度它们。
系统任务:uC/OS-II预定义了两个为应用程序服务的系统任务:4空闲任务(OSTaskIdle)5统计任务(OSTaskStat)其中空闲任务是每个应用程序必须使用的。
OSTaskIdle由系统自动创建,在系统初始化时,∙OSInit --> OS_InitTaskIdle --> OSTaskIdle如果用户应用程序要使用统计任务,则必须把定义在OS_CFG.H 中的OS_TASK_STAT_EN设置为1,并且必须在创建统计任务之前调用函数OSStatInit( )对统计任务进行初始化。
任务优先级:优先级数目通过OS_CFG.H中的OS_LOWEST_PRIO配置。
固定地,系统总是把最低优先级别OS_LOWEST_PRIO自动赋给空闲任务。
如果应用程序中还使用了统计任务,则系统会把OS_LOWEST_PRIO - 1自动赋给统计任务。
由于每个任务都具有唯一的优先级别,因此uC/OS-II通常也用任务的优先级别来作为这个任务的标识。
任务堆栈:堆栈的增长方向随系统所使用的处理器不同而不同,为提高应用程序的可移植性,可利用OS_CFG.H中的OS_STK_GROWTH作为选择开关。
把CPU启动任务时所需的初始数据事先存放在任务的堆栈中,当任务获得CPU使用权时,就可以把堆栈中的初始数据复制到CPU 的各寄存器中,使任务顺利地启动并运行。
任务堆栈的初始化工作是由系统通过在OSTaskCreate ( )中调用OSTaskStkInit ( )来完成的。
1.uCos-II操作系统内核的主要工作就是对任务进行管理和调度. 在应用程序设计的角度来看,uCos-II的任务就是一个线程.
2.从任务的存储结构来看,uCOS-II的任务由三个部分组成: 1-任务程序代码(任务的执行部分). 2-任务堆栈(用于保存任务工作环境) 3-任务控制块(用于保存任务属性)
3.uCOS-II的任务有两种,用户任务和系统任务. 由应用程序设计者编写的任务叫做用户任务. 由系统提供的任务叫做系统任务. 用户任务是为解决应用问题而编写的,系统任务是为应用程序来提供某种服务的.
4,任务的5种状态
5.从等待状态不能直接进入运行状态.
6.从程序设计的角度来看,一个uCOS-II任务的代码就是一个C语的函数.为了可以传递各种不同类型的数据甚至是函数,任务的参数是一个void类型的指针.可以说uCOS-II任务是一个代码结构是带有临界段的无限循环.
7.用户任务他不是被主函数或其他函数调用的, 主函数main()只负责创建和启动它们,而操作系统负责来调度运行.
8.OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL用来做临界保护的.
9.OSTaskCreate()为操作系统uCOS-II提供的用来创建任务的函数.
10.OSStart()为操作系统提供启动各任务的函数.启动任务以后,任务就应由操作系统来管理和调度了.
11.uCOS-II预定义了两个为应用程序服务的系统任务:空闲任务和统计任务.其中空闲任务是每个应用程序必须使用的,而统计任务则是应用程序可以根据实际需要来选择使用的.
12.空闲任务:让CPU在没有用户任务可执行时有事可做.
OSTaskIdle():
void OSTaskIdle(void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
pdata = pdata; //定义了型参没有用,编译器会报警告或者错误
for(;;)
{
OS_ENTER_CRITICAL();
OSdleCtr++;
OS_EXIT_CRITICAL();
}
}
uCOS-II规定,一个用户应用程序必须使用这个空闲任务,而且这个任务是不能用软件来删除的.
13.统计任务(OSTaskStat())每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUUsage中. 如果用户应用程序要使用统计任务,则必须把定义在系统头文件OS_CFG.H中的系统配置常数OS_TASK_STAT_EN设置为1,并且必须在创建统计任务之前调用函数OSStatInit()对统计任务进行初始化.
14.通常一个应用程序的任务数小于64,数字0表示任务的优先级别最高;在文件OS_CFG.H中通过给表示最低优先级别的常数OS_LOWEST_PRIO赋值的方法,来说明应用程序中任务优级别的数目.
15.堆栈就是在存储器中按数据"后进先出"的原则组织的连续存储空间.
16.任务堆栈区的创建,在文件OS_CPU.H中专门定义了一个数据类型OS_STK. typedef unsigned int OS_STK.在应用程序中定义任务堆栈的栈区即定义一个OS_STK类型的一个数组即可.
17.因为不同的处理器的堆栈的成长方式可能不一样,我们可以使用OS_CFG.H中的常数OS_STK_GROWTH做为开关,以适应不同的堆栈增长方式的需求.
18.任务堆栈的初始化工作是在创建任务函数OSTaskCreate()通过调用任务堆栈初始化函数OSTaskStkInit()来完成.这个函应该是在用户移植是自己编写.
19.COS-II用两条链表来管理任务控制块. 一条是空任务块链表(其中所有任务控制块还没有分配给任务) 二条是任务块链表(其中所有任务控制块已经分配给任务)
20.uCOS-II允许用函数OSTaskDel()删除一个任务.删除一个任务,实质上就是把该任务从任务控制块链表中删掉,并把它归还给空任务控制块链表.
21.任务的任务控制块就如同人的身份证一样重要.
22.给用户任务分配任务控制块及对其进行初始化也是操作系统的职责.当应用程序调用函数OSTaskCreate创建一个任务时,这个函数会调用系统函数OSTCBInit()来为任务控制块进行初始化.这个函数首先被创建任务从空任务控制块链表获取珍上任务控制块,然后,用作任务的属性对任务控制块各个成员进行赋值;最后再把这个任务控制块链入到任务控制块链表的头部.
23.uCOS-II进行任务调度的思想是,每时每刻让优先级最高的就绪任务处于运行状态.
24.uCOS-II进行任务调度的依据就是任务就绪表.系统总是从处于就绪状态的任务中来选择一个任务运行.
25.想手动的将任务设计为就绪状态,修改就绪表就可以了.
26.任务调度器的主要工作有两项:一是在任务就绪表中查找具有最高优先级别的就绪任务,二是实现任务的切换.
27.uCOS-II有两种调度器:一种是任务级的调度器,另一种是中断级的调度器.任务级的调度器是由函数OSSched()实现,而中断级的调度器由函数OSIntExt()来实现.
28.uCOS-II允许应用程序通过调用函数OSScheLock()和OSSchedUnlock()给调度器上锁和解锁.定义一个变量OSLockNesting来记录调度器被锁和解锁情况.
29.任务切换就是中止正在运行的任务,转而去运行另外一个任务的操作.这个任务应该是就绪任务中优先级别最高的那个任务. 任务的切换就是断点数据的切换,断点数据的切换就是CPU堆栈指针切换,被中止运行任务的任务堆栈指针要保存到该任务的任务控制块中,待运行任务的任务堆栈指针要该任务控制块转存到CPU的SP中.
30.创建任务的工作实质上是创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务.
31.uCOS-II有两个用来创建任务的函数,OSTaskCreate(),OSTaskCreateExt(),其中函数OSTaskCreateExt()是OSTaskCreate()的扩展,并提供了一些附加功能.
32.uCOS-II有规定,在调用启动任务函数OSStart()之前,必须已经创建了至少一个任务.
33.所谓挂起一个任务就是停止这个任务的运行,用户任务可以调用OSTaskSuspend()来挂起自身或空闲任务之外的其他任务.
34.在使用uCOS-II所有的服务之前,必段调用初始化函数OSInit();对自身的运行环境进行初始化.
35.小结: 任务由任务控制块,任务堆栈和任务代码三部组成.系统通过任务控制块来感知和控制任务.任务堆栈主要用来保护断点和恢复断点,任务代码是一个超的循环结构,它描述了任务的执行过程.在创建一个任务时,函数负责给任务分配任务控制块和任务堆栈.并对它们进行初始化.然后把任务控制块,任务堆栈,任务代码三者关联起来形成一个完整的任务. 系统是按任务就绪表和任务的优先级别来调度任务的.执行任务工作的是调度器,它负责查找具有最高优先级别的就绪任务并运行它.同时把这个任务TCB的指针存放在OSTABCur中,通常,系统在调用API函数和运行中断服务程序之后都要调用函数OSSched()来进行一次任务调度. 任务切换的核心工作是任务堆栈指针的切换. 任务的优先级别也是任务的标识. 应用程序首先应该调用函数OSInit()对全局变量和数据结构进行初始化,以建立uCOS-II的运行环境. 应用程序是通过函数OSSstart开始进入多任务管理的.但在调用函数OSStart之前,必须至少创建一个任务.(扣扣1138474382)。