第2章uCOSII中的任务-

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void mytask(void *pdata) {
for (;;) { do something; waiting; do something; } }
3
从任务的存 储结构看, 任务由三个 部分组成:
1)任务概述
任务控制块
指向前一个任务控制块的指针 指向后一个任务控制块的指针 指向任务的指针 指向任务堆栈的指针 任务的优先级别 ……
19
2 任务堆栈--增长方向
对两个方向增长的堆栈都提供支持的代码
OS_STK TaskStack[TASK_STACK_SIZE];
#if OS_STK_GROWTH == 0 OSTaskCreate(task, pdata, &TaskStack[0], prio);
#else
OSTaskCreate(task, pdata, &TaskStack[TASK_STACK_SIZE-1], prio);
LDMFD sp!, {r4}
MSR CPSR_cxsf, r4
LDMFDsp!, {r0-r12, lr, pc }
; get new state from top of the stack ; CPSR should be SVC32Mode ; start the new task
15
2 任务堆栈--创建
1)堆栈创建
➢堆栈是在存储器中按数据“后进先出(LIFO)的 原则组织的连续存储空间。为满足任务切换和响应 中断时保存CPU寄存器中的内容及任务私有数据的 需要,每个任务都应该配有自己的堆栈。
➢uC/OS-II中堆栈的数据类型为为OS_STK( typedef unsigned int OS_STK )。
➢当 堆 栈 向 上 增 长 时 , 将 OS_STK_GROWTH 置 为 0 , 需 将 堆 栈 的 最低内存地址传递给任务创建函数。
堆栈向上增长(OS_STK_GROWTH=0)
OS_STK TaskStack[TASK_STACK_SIZE];
OSTaskCreate(task,
pdata,
➢空闲任务不可能被应用软件删除
11
3)系统任务
μC/OS-Ⅱ的空闲任务.
void OSTaskIdle (void *pdata) {
pdata = pdata; for (;;) { OS_ENTER_CRITICAL(); OSIdleCtr++; OS_EXIT_CRITICAL(); OSTaskIdleHook(); }
pstk = (OS_STK *)malloc(stack_size);
if (pstk != (OS_STK *)0) { Create the task;
}
17
2 任务堆栈--增长方向
2)堆栈增长方向 µC/OS-Ⅱ支持的堆栈既可以向上增长(低地址往高地 址) 也可以向下增长。用户在调用OSTaskCreate()或 OSTaskCreateExt() 的 时 候 必 须 知 道 堆 栈 是 怎 样 增 长 的,因为用户必须得把堆栈的栈顶传递给以上两个函 数,
➢用户可以静态分配堆栈空间(在编译的时候分配)也 可以动态地分配堆栈空间(在运行的时候分配)。
16
2 任务堆栈--创建
静态分配堆栈
Static OS_STK MyTaskStack[stack_size]; 或 OS_STK MyTaskStack[stack_size];
动态分配堆栈
OS_STK *pstk;
*--stk = 0;
/* r12 */
*--stk = 0;
/* r11 */
*--stkstk = 0;
/* r9 */
*--stk = 0;
/* r8 */
*--stk = 0;
/* r7 */
*--stk = 0;
/* r6 */
26
2 任务堆栈--初始化
任务控制块、
任务代码与 任务堆栈
任务
任务代码
void mytask () {
…..
for(;;) { ….. } }
任务堆栈
任务的存储结构
4
1)任务概述
任务 控制块
任务 代码
任务
任务1 堆栈
……
任务 控制块 任务
代码
任务
任务2 堆栈
任务控制块链表
任务 控制块
任务 代码
任务
任务n 堆栈
5
1)任务概述
stk = (unsigned int *)ptos;
/* Load stack pointer */
25
2 任务堆栈--初始化
/* build a context for the new task */
*--stk = (unsigned int) task; /* pc */
*--stk = (unsigned int) task; /* lr */
23
2 任务堆栈--初始化
4)任务堆栈的初始化
当处理器启动一个任务时,处理器的各寄存器总是需 要预置一些与待运行任务相关的初始数据,如指向任 务代码的指针、指向任务堆栈的指针、程序状态字 PSW等,这些初始数据从何而来?
系统在创建一个新任务时,应该把启动该任务所需的 初始数据(指向任务代码的指针、指向任务堆栈的指 针、程序状态字PSW等)事先存放到这个任务的堆 栈中。
就绪态(READY): 任务一旦建立,就进入就绪 态准备运行。一个任务可以通过调用 OSTaskDel()返回到睡眠态,或通过调用该函 数让另一个任务进入睡眠态。
7
2)任务状态
运行态(RUNNING): 正在使用CPU的状态称运行 态。就绪的任务只有当所有优先级高于自己的 任务转为等待状态,或者是被删除了,才能进 入运行态。
#endif
20
2 任务堆栈--检验
3)堆栈检验,OSTaskStkChk() ➢有时候确定任务实际所需的堆栈空间大小是 很有必要的。因为这样用户就可以避免为任 务分配过多的堆栈空间,从而减少自己的应 用程序代码所需的RAM(内存)数量。 ➢µC/OS-Ⅱ提供的OSTaskStkChk()函数可以为 用户提供这种有价值的信息。
等待态(WAITING):等待某事件发生的状态.
➢正在运行的任务可以通过调用OSTimeDly() 或OSTimeDlyHMSM()进入等待状态
➢调用OSSemPend()、OSMboxPend()或 OSQPend()进入等待状态(WAITING)。。
8
2)任务状态
中断服务态(ISR): ➢正在运行的任务被中断(除非中断是关闭的) 时就进入了中断服务态(ISR)。
*ptos, INT16U opt) #else void *OSTaskStkInit (void (*task)(void *pd), void *pdata, void *ptos,
INT16U opt) #endif {
unsigned int *stk ;
opt = opt;
/* 'opt' is not used, prevent warning */
}
12
3)系统任务
统计任务OSTaskStat()
➢任务OSTaskStat()是负责统计运行时间的任 务,如果用户将系统定义常数 OS_TASK_STAT_EN(见文件OS_CFG.H)设为1 ,这个任务就会建立。一旦得到允许,统计 任务每秒运行一次(OS_CORE.C)以计算当 前的CPU利用率。也即计算应用程序使用了 多少CPU时间,用百分比表示,这个值放在 一个有符号8位整数OSCPUsage中,精确度是 1个百分点。
13
第2章 uC/OS-II中的任务
1 任务的基本概念 2 任务堆栈 3 任务控制块 4 任务就绪表 5 任务调度
6 任务的创建 7 任务的挂起和恢复
8 其它任务管理函数 9 μC/OS-Ⅱ的初始化和任务的启动
14
2 任务堆栈
1) 堆栈创建 2) 堆栈增长方向 3) 堆栈检验 4) 堆栈的初始化
任务堆栈初始化函数OSTaskStkInit()完成上述工作 (其在OSTaskCreate()创建任务时被调用)。
24
2 任务堆栈--初始化
OSTaskStkInit ()
#if OS_VERSION >= 251 OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK
21
2 任务堆栈--检验
OSTaskStkChk()顺着堆 栈的栈底开始计算空闲的 堆栈空间大小。任务所用 的堆栈的空间大小等于 OSTaskCreateExt()中定 义的堆栈尺寸减去储存值 为0的连续堆栈入口数目。
Stack checking
22
2 任务堆栈--检验
用户应该使自己的应用程序运行足够长的时间 ,并且经历最坏的堆栈使用情况,这样才能得 到正确的数值。一旦OSTaskStkChk()提供给用 户最坏情况下堆栈的需求,用户就可以重新设 置堆栈的最后容量了。为了适应系统以后的升 级和扩展,用户应该多分配10%-100%的堆 栈空间。在堆栈检验中,用户所得到的只是一 个大致的堆栈使用情况,并不能说明堆栈使用 的全部实际情况。
&TaskStack[0],
prio);
18
2 任务堆栈--增长方向
➢当堆栈向下增长时,置OS_STK_GROWTH为1,需要将 堆栈的最高内存地址传递给任务创建函数,
堆栈向下增长(OS_STK_GROWTH=1)
OS_STK TaskStack[TASK_STACK_SIZE];
OSTaskCreate(task, pdata, &TaskStack[TASK_STACK_SIZE-1], prio);
*--stk = 0;
/* r5 */
*--stk = 0;
/* r4 */
*--stk = 0; *--stk = 0;
/* r3 */ /* r2 */
关于OSStartHighRdy
OSStartHighRdy LDR r4, addr_OSTCBCur ; Get current task TCB address LDR r5, addr_OSTCBHighRdy ; Get highest priority task TCB ;address
9
2)任务状态
10
3)系统任务
空闲任务(Idle Task)
➢μC/OS-Ⅱ总要建立一个空闲任务,这个任 务在没有其它任务进入就绪态时投入运行。 这个空闲任务OSTaskIdle()永远设为最低优 先级,即OS_LOWEST_PRI0。
➢空闲任务OSTaskIdle()什么也不做,只是在 不停地给一个32位的名叫OSIdleCtr的计数 器加1,统计任务使用这个计数器以确定现 行应用软件实际消耗的CPU时间。
➢C/OS –II 支持64个任务,每个任务有一个特定的 优先级。
➢任务的优先级别用数字表示,0表示的任务的优先 级最高,数字越大表示的优先级越低。
➢通过常数OS_LOWEST_PRIO (在OS_CFG.H中 )定义系统的最低优先级别,同时限定系统能容纳 的最多任务数量。
➢建议用户不要使用优先级为0、1、2、3、
OS_LOWEST_PRIO-3、 OS_LOWEST_PRIO-2、 OS_LOWEST_PRIO-1、 OS_LOWEST_PRIO-0的任务。 最低的两个已被目前版本的系统占用,将来版本可能会用 到其它的。
6
2)任务状态
睡眠态(DORMANT): 任务驻留在程序空间, 还没有交给μC/OS-Ⅱ管理,还没有配备任务控 制块,还没有创建。把任务交给μC/OS-Ⅱ是通 过调用下述两个函数之一来完成的: OSTaskCreate()或OSTaskCreateExt()。
第2章 uC/OS-II中的任务
1 任务的基本概念 2 任务堆栈 3 任务控制块 4 任务就绪表 5 任务调度
6 任务的创建 7 任务的挂起和恢复
8 其它任务管理函数 9 μC/OS-Ⅱ的初始化和任务的启动
1
1 任务的基本概念
1) 任务概述 2) 任务状态 3) 系统任务
2
1)任务概述
从程序设计角度看,uC/OS-II中的任务是一个 线程,其代码通常是一个无限循环结构/超循环 结构,看起来像其它C函数一样。
LDR r5, [r5] LDR sp, [r5]
; get stack pointer ; switch to the new stack
STR r5, [r4]
; set new current task TCB address
LDMFD sp!, {r4}
; YYY
MSR SPSR_cxsf, r4
相关文档
最新文档