嵌入式系统原理课程第四讲
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
15
ptcb->OSTCBStkPtr = ptos;
16
ptcb->OSTCBPrio
= prio;
17
ptcb->OSTCBStat
= OS_STAT_RDY;
18
ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
19
ptcb->OSTCBDly
= 0;
4.1r05 初始化任务控制块函数OS_TCBInit(3)
4.1q04 创建任务的步骤(3)
然后,为要创建的任务定义堆栈,必须使用 OS_STK类型定义堆栈,例如 OS_STK AppTask_1_Stk[200]
4.1q05 创建任务的步骤(4)
最后,调用OSTaskCreate或 OSTaskCreateExt函数创建任务。例如
OSTaskCreate (AppTask_1, (void *)0, &AppTask_1_Stk[199], AppTask_1_Prio);
4.1q02 创建任务的步骤(1)
程序段S4-1 任务的函数体
1 void AppTask_1(void *pdata)
2{
3 INT8U err;
4 task
// Some Process here,Only once when first running
5 OSTaskNameSet(OS_PRIO_SELF,"AppTask_1",&err);
4.1 任务管理
任务管理类函数位于os_task.c文件中,用 于实现任务创建、删除、挂起、恢复、改 变任务优先级、查询任务信息、查询任务 堆栈信息、设置任务名或查询任务名等操 作。这里主要讲述OSTaskCreate、 OSTaskCreateExt、OSTaskDel和 OSTaskStkChk函数的工作原理。
4.1q06 OSTaskCreate函数(1)
1 #if OS_TASK_CREATE_EN > 0 2 INT8U OSTaskCreate (void (*task)(void *p_arg),
void *p_arg, OS_STK *ptos, INT8U prio) 3{ 4 OS_STK *psp; 5 INT8U err; 6 #if OS_CRITICAL_METHOD == 3 7 OS_CPU_SR cpu_sr = 0; 8 #endif
或 OSTaskCreateExt(AppTask_1,
(void *)0, &AppTask_1_Stk[199], AppTask_1_Prio, 6, &AppTask_1_Stk[0], 200, (void *)0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
37 #endif
38
39 #if OS_LOWEST_PRIO <= 63
40
ptcb->OSTCBY
= (INT8U)(prio >> 3);
41
ptcb->OSTCBX
= (INT8U)(prio & 0x07);
42
ptcb->OSTCBBitY
= (INT8U)(1 << ptcb->OSTCBY);
6 for(;;)
7{
8
LED_Flash(1); // Your work, here
9
10
OSTimeDlyHMSM(0,0,1,0);
11 }
12 }
4.1q03 创建任务的步骤(2)
其次,为要创建的任务指定优先级号,每个 任务都有唯一的优先级号,取值范围从0至 OS_LOWEST_PRIO(为文件os_cfg.h中的 宏定义常量,最大为254),一般地,用户 任务优先级从4至OS_LOWEST_PRIO-4。
24
25
OS_EXIT_CRITICAL();
26
psp = OSTaskStkInit(task, p_arg, ptos, 0);
27
err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);
28
if (err == OS_ERR_NONE) {
4. µC/OS-II组件
4. µC/OS-II组件
任务管理 信号量管理 互斥信号量管理 事件标志组管理 消息邮箱管理 消息队列管理 多事件请求管理 中断管理宏函数 定时器管理 动态内存管理
什么是µC/OS-II组件 ?
µC/OS-II组件是指µC/OS-II操作系统向用 户应用程序提供的服务,主要有任务管理、 信号量管理、互斥信号量管理、事件标志 组管理、消息邮箱管理、消息队列管理、 多事件请求管理、中断管理、定时器管理、 内存管理等,每种服务都包括一些系统函 数。
4.1r04 初始化任务控制块函数OS_TCBInit(2)
10 OS_ENTER_CRITICAL();
11 ptcb = OSTCBFreeList;
12 if (ptcb != (OS_TCB *)0) {
13
OSTCBFreeList
= ptcb->OSTCBNext;
14
OS_EXIT_CRITICAL();
38 }
39 OS_EXIT_CRITICAL();
40 return (OS_ERR_PRIO_EXIST);
41 }
42 #endif
4.1r01初始化任务堆栈函数OSTaskStkInit(1)
1 OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
29
if (OSRunning == OS_TRUE) {
30
OS_Sched();
Biblioteka Baidu
31
}
32
} else {
33
OS_ENTER_CRITICAL();
34
OSTCBPrioTbl[prio] = (OS_TCB *)0;
35
OS_EXIT_CRITICAL();
36
}
37
return (err);
4.1q07 OSTaskCreate函数(2)
12 #if OS_ARG_CHK_EN > 0
13 if (prio > OS_LOWEST_PRIO) {
14
return (OS_ERR_PRIO_INVALID);
15 }
16 #endif
17 OS_ENTER_CRITICAL();
18 if (OSIntNesting > 0) {
INT8U newprio); INT8U OSTaskSuspend(INT8U prio); INT8U OSTaskResume(INT8U prio);
4.1p03 任务管理函数(OS_TASK.C中) (3)
INT8U OSTaskQuery(INT8U prio, OS_TCB *p_task_data);
4.1r03 初始化任务控制块函数OS_TCBInit(1)
1 INT8U OS_TCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size,void *pext, INT16U opt)
2{ 3 OS_TCB *ptcb; 4 #if OS_CRITICAL_METHOD == 3 5 OS_CPU_SR cpu_sr = 0; 6 #endif
19
OS_EXIT_CRITICAL();
20
return (OS_ERR_TASK_CREATE_ISR);
21 }
4.1q08 OSTaskCreate函数(3)
22 if (OSTCBPrioTbl[prio] == (OS_TCB *)0) {
23 OSTCBPrioTbl[prio] = OS_TCB_RESERVED
4.1q01 创建任务的步骤(1)
µC/OS-II系统中有二种创建任务的函数,即 OSTaskCreate和OSTaskCreateExt。
首先,编写一个带有无限循环的函数,由于 具有无限循环,故函数没有返回值。该函 数具有一个void *类型的指针,该指针可以 指向任何类型的数据,通过该指针在任务 创建时向任务传递一些数据,这种传递只 能发生一次,一旦任务开始工作,就无法 通过函数参数向任务传递数据了。
INT8U OSTaskStkChk(INT8U prio, OS_STK_DATA *p_stk_data);
INT8U OSTaskNameGet(INT8U prio, INT8U *pname, INT8U *perr);
void OSTaskNameSet(INT8U prio, INT8U *pname, INT8U *perr);
void *p_arg, OS_STK *ptos, INT8U prio, INT16U id, OS_STK *pbos, INT32U stk_size, void *pext, INT16U opt);
4.1p02 任务管理函数(OS_TASK.C中) (2)
INT8U OSTaskDel(INT8U prio); INT8U OSTaskDelReq(INT8U prio); INT8U OSTaskChangePrio(INT8U oldprio,
2{ 3 OS_STK *stk; 4 INT32U task_addr; 5 6 7 opt = opt; 8 stk = ptos; 9 task_addr = (INT32U)task & ~1; 10 *(stk) = (INT32U)task_addr; 11 *(--stk) = (INT32U)0x14141414L; 12 *(--stk) = (INT32U)0x12121212L; 13 *(--stk) = (INT32U)0x11111111L; 14 *(--stk) = (INT32U)0x10101010L; 15 *(--stk) = (INT32U)0x09090909L; 16 *(--stk) = (INT32U)0x08080808L;
4.1r02初始化任务堆栈函数OSTaskStkInit(2)
17 *(--stk) = (INT32U)0x07070707L; 18 *(--stk) = (INT32U)0x06060606L; 19 *(--stk) = (INT32U)0x05050505L; 20 *(--stk) = (INT32U)0x04040404L; 21 *(--stk) = (INT32U)0x03030303L; 22 *(--stk) = (INT32U)0x02020202L; 23 *(--stk) = (INT32U)0x01010101L; 24 *(--stk) = (INT32U)p_arg; 25 if ((INT32U)task & 0x01) { 26 *(--stk) = (INT32U)ARM_SVC_MODE_THUMB; 27 } else { 28 *(--stk) = (INT32U)ARM_SVC_MODE_ARM 29 } 30 31 return (stk); 32 }
= id;
27 #else
28
pext
= pext;
29
stk_size
= stk_size;
30
pbos
= pbos;
31
opt
= opt;
32
id
= id;
33 #endif
4.1r06 初始化任务控制块函数OS_TCBInit(4)
35 #if OS_TASK_DEL_EN > 0
36
ptcb->OSTCBDelReq = OS_ERR_NONE;
4.1p01 任务管理函数(OS_TASK.C中)(1)
INT8U OSTaskCreate(void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT8U prio);
INT8U OSTaskCreateExt(void (*task)(void *p_arg),
21 #if OS_TASK_CREATE_EXT_EN > 0
22
ptcb->OSTCBExtPtr = pext;
23
ptcb->OSTCBStkSize = stk_size;
24
ptcb->OSTCBStkBottom = pbos;
25
ptcb->OSTCBOpt
= opt;
26
ptcb->OSTCBId