uC/OS-II操作系统分析 (一)

本文详细分析了uC/OS-II操作系统中的任务管理,包括任务创建、任务堆栈初始化、任务删除、任务优先级改变、任务挂起与恢复等功能。通过对源代码的深入解析,展示了每个函数的工作原理和流程,如OSTaskCreate()的栈初始化、OSTaskDel()的任务删除过程以及OSTaskSuspend()和OSTaskResume()的任务状态切换。文章还涵盖了任务调度、存储和编译器相关的内核修改,为理解和实现嵌入式系统任务管理提供了基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

uC/OS-II 操作系统分析

目 录

源文件体系结构 2

对内核中与处理器相关文件的修改 3

任务管理 3

OSTaskCreate() 任务创建函数 3

源代码分析 3

程序流程图 4

OSTaskStkInit() 任务堆栈初始化函数 4

源代码分析 4

堆栈增长方向 5

OSTaskDel() 5

源代码分析 5

程序流程图 6

OSTaskDelReq() 请求删除任务函数 7

源代码分析 7

程序流程图 8

任务 A 和任务 B 进行删除请求的代码分析 8

任务 A 和任务 B 的删除请求流程图 9

OSTaskChangePrio() 改变任务优先级函数 9

源代码分析 10

程序流程图 11

OSTaskSuspend() 任务挂起函数 12

源码分析 12

程序流程图 13

OSTaskResume() 任务恢复函数 14

源码分析 14

函数流程图 15

OSTaskQuery() 获得任务信息函数 15

源代码分析 15

用户获取任务信息源代码 16





























/////////*********////////// 指示需要补充,尚未完全领悟








源文件体系结构

SOURCE 文件夹: 与平台无关的代码,只需进行包含即可


OS_CORE.C

OS_FLAG.C

OS_MBOX.C

OS_MEM.C

OS_MUTEX.C

OS_Q.C

OS_SEM.C

OS_TASK.C

OS_TIME.C

uCOS_II.C

uCOS_II.H


ARM_PC 文件夹 :

PC.C

PC.H


ARM 文件夹 : 与具体处理器型号相关的设置,这里是与 ARM芯片相关的

OS_CPU_C.C

OS_CPU.H

OS_CPU_A.ASM


配置文件:

OS_CFG.H

INCLUDES.H




对内核中与处理器相关文件的修改

  1. #define 设置一个常量 ( 堆栈的生长方向 )

  2. 声明三个宏 ( 开中断、关中断和任务切换 )

  3. 声明 10 个与编译器相关的数据类型

  4. C 语言编写六个简单的函数 ( 任务堆栈初始化和五个钩子函数 )

  5. 用汇编语言编写的四个函数 OSStartHighRdy() OSCtxSw() OSIntCtxSw() OSIntCtxSw()

任务管理

OSTaskCreate() 任务创建函数

源代码分析

INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8Uprio)

task 任务代码的指针

pdata 是当任务开始执行时传递给任务的参数的指针

ptos 分配给任务的堆栈的栈顶指针

prio 分配给任务的优先级


INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8Uprio)

{

void *psp;

INT8U err;

if (prio > OS_LOWEST_PRIO) { // 如果优先级比最低的优先级还低则该优先级不可用

return (OS_PRIO_INVALID);

}

OS_ENTER_CRITICAL();

if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { //(OS_TCB *)0 实际上是通知编译器,这个 0 OS_TCB

// 数据类型的 NULL

OSTCBPrioTbl[prio] = (OS_TCB *)1; (3) //(OS_TCB *)1 那就是说有一个任务存在了,不再是 Nul

OS_EXIT_CRITICAL(); // 关中断

psp = (void *)OSTaskStkInit(task, pdata, ptos, 0); // 初始化任务堆栈 并返回栈顶指针

err = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0); (6) // 初始化 TCB

if (err == OS_NO_ERR) // 如果 TCB 池中有空 TCB 提供

{

OS_ENTER_CRITICAL(); // 开中断

OSTaskCtr++; (8) // 任务总数计数器加 1

OS_EXIT_CRITICAL(); // 关中断

if (OSRunning) // 如果 cpu 被占用

{

OSSched(); // 进行任务切换 }

}

else // 否则让该优先级可被其他任务占用

{

OS_ENTER_CRITICAL();

OSTCBPrioTbl[prio] = (OS_TCB *)0; (12)

OS_EXIT_CRITICAL();

}

return (err);

} else {

OS_EXIT_CRITICAL();

return (OS_PRIO_EXIST); // 返回优先级已存在

}

}


程序流程图

1 任务创建函数 OSTaskCreat() 流程图


注意,任务创建主要牵扯到三点:

  1. 优先级

  2. 任务堆栈

  3. 任务控制块 TCB

另外,若一切任务的初始化成功,还要判断 cpu是否被占用,调用任务切换函数进行任务切换。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值