百道网
 您现在的位置:图书 > μC/OS-Ⅲ内核分析与应用开发
μC/OS-Ⅲ内核分析与应用开发


μC/OS-Ⅲ内核分析与应用开发

作  者:吴国伟,林驰,任健康,李照鑫

出 版 社:清华大学出版社

丛 书:清华开发者书库

出版时间:2018年10月

定  价:59.00

I S B N :9787302488064

所属分类: 专业科技  >  计算机/网络  >  软件应用与开发    

标  签:

[查看微博评论]

分享到:

TOP内容简介

μC/OSⅢ是一个基于优先级的可固化实时嵌入式操作系统内核,在各类嵌入式系统中有广泛的应用。本书对μC/OSⅢ内核结构和各种机制进行了详细分析,并设置了应用场景,给出了基于μC/OSⅢ的开发应用实例。全书共分10章,第1章介绍了μC/OSⅢ的架构、组成及内核源码的关键数据结构和相互关系; 第2章到第9章分别分析μC/OSⅢ的任务管理机制、内核调度机制、任务间同步机制、中断管理、定时器管理、时钟管理、内存管理和文件系统,并给出每种机制的应用实例; 第10章介绍了μC/OSⅢ的移植方法。在对μC/OSⅢ的每一部分机制的源码分析过程中,先介绍工作机制,然后提炼关键数据结构和相互关系,再结合关键数据结构和算法分析源码,最后给出应用实例,让读者明白原理及实际应用,达到理论和实战技能同步提升的效果。为方便教学和自学,所有章节配有思考题与习题,以方便慕课、微课、微视频、翻转课堂等现代教学资源的制作。
本书可作为软件工程、电子信息科学与技术、计算机科学与技术、电子信息工程、电气工程及自动化、测控技术与仪器等专业的教材和有关工程技术人员的参考用书。

TOP作者简介

吴国伟  教授,博士生导师,从事嵌入式系统研究和开发多年,在嵌入式操作系统、Linux内核分析与应用等领域有丰富经验,在嵌入式开发领域发表了多篇高质量论文,承担多项国家自然科学基金项目、“核高基”子课题,为本科生和研究生开设“嵌入式操作系统”“Linux内核分析”等课程,已出版嵌入式系统相关教材4部。

TOP目录

第1章μC/OSⅢ操作系统概述

1.1μC/OSⅢ概览

1.1.1os.h和os_type.h功能

1.1.2os_core.c概况

1.1.3os_task.c、os_prio.c和os_pend_multi.c概况

1.1.4os_flag.c概况

1.1.5os_sem.c和os_mutex.c概况

1.1.6os_q.c和os_msg.c概况

1.1.7os_tick.c、os_time.c和os_tmr.c概况

1.1.8os_int.c概况

1.1.9os_mem.c概况

1.1.10os_dbg.c、os_cfg_app.c和os_stat.c概况

1.1.11os_cfg.h概况

1.2μC/OSⅢ概览

1.2.1任务管理

1.2.2任务调度

1.2.3任务同步

1.2.4任务间通信

1.2.5中断

1.2.6时间管理

1.2.7内存管理

1.2.8错误检测

1.2.9性能测量

1.3总体数据结构关系及描述

1.3.1就绪任务管理

1.3.2事件标志和请求管理

1.3.3消息队列管理

1.3.4互斥信号量管理

1.3.5内存分区管理

1.4各关键数据结构描述

1.4.1os_mem成员定义

1.4.2os_flag_grp成员定义

1.4.3OSPrioTbl结构

1.4.4os_mutex成员定义

1.4.5os_tcb成员定义

1.5内核函数

1.5.1内核函数介绍

1.5.2关键代码分析

习题

第2章μC/OSⅢ任务管理

2.1μC/OSⅢ任务管理机制

2.2μC/OSⅢ内核任务管理分析

2.3μC/OSⅢ任务管理函数

2.3.1任务创建OSTaskCreate(),OSTaskCreateExt()

2.3.2任务删除OSTaskDel(),OSTaskDelReq()

2.3.3任务挂起OSTaskSuspend()

2.3.4任务恢复OSTaskResume()

2.4μC/OSⅢ任务管理应用开发

2.4.1场景描述

2.4.2设计总体架构和数据结构

2.4.3代码实现

习题

第3章μC/OSⅢ内核调度

3.1μC/OSⅢ内核调度机制

3.2μC/OSⅢ内核抢占优先级调度分析

3.3μC/OSⅢ内核时间片轮转调度分析

3.4μC/OSⅢ内核调度管理函数

习题

第4章μC/OSⅢ任务间同步机制

4.1μC/OSⅢ任务同步机制

4.2μC/OSⅢ信号量机制分析

4.2.1μC/OSⅢ信号量数据结构

4.2.2μC/OSⅢ信号量管理函数

4.2.3μC/OSⅢ信号量应用开发

4.3μC/OSⅢ互斥体机制分析

4.3.1μC/OSⅢ互斥体管理函数

4.3.2μC/OSⅢ互斥体应用开发

4.4μC/OSⅢ事件标志组机制分析

4.4.1μC/OSⅢ事件标志组关键数据结构

4.4.2μC/OSⅢ事件标志组管理函数

4.4.3μC/OSⅢ事件标志组应用开发

4.5μC/OSⅢ消息队列

4.5.1μC/OSⅢ消息队列数据结构

4.5.2μC/OSⅢ消息队列操作函数

4.5.3μC/OSⅢ消息队列应用举例

习题

第5章中断管理

5.1μC/OSⅢ中断机制

5.2CPU中断处理

5.3中断服务程序

5.4直接发布和延迟发布

5.4.1直接发布

5.4.2延迟发布

5.4.3延迟提交信息记录块

5.5中断管理内部函数

5.5.1中断进入函数

5.5.2中断退出函数

5.5.3中断级任务切换函数

5.5.4临界区进入和退出宏

5.5.5中断延迟队列初始化函数

5.5.6中断延迟队列提交函数

5.5.7中断延迟队列真正提交函数

5.5.8中断队列管理任务

习题

第6章时钟管理

6.1总体描述

6.2时钟机制分析

6.2.1结构体os_tick_spoke

6.2.2时钟任务管理

6.2.3延时任务TCB

6.3时钟管理内核函数

6.3.1时钟节拍中断函数

6.3.2时钟节拍任务

6.3.3节拍链表任务插入函数

6.3.4节拍链表任务删除函数

6.4时钟管理函数

6.4.1延迟时钟节拍的延时函数

6.4.2延迟具体时间的延时函数

6.4.3延时取消函数

6.4.4时钟节拍设置函数

6.4.5时钟节拍设置函数

6.5时钟管理应用

6.5.1场景描述

6.5.2运行环境

6.5.3具体实现

6.5.4实验结果

习题

第7章定时器管理

7.1定时器机制

7.2定时器内部机制

7.2.1定时器状态

7.2.2定时器结构体os_tmr

7.2.3定时器分类

7.2.4定时器管理时序

7.2.5软件定时器的实现原理

7.2.6主要的数据结构分析

7.3定时器函数

7.3.1定时器创建函数

7.3.2定时器删除函数

7.3.3获取定时器的剩余时间

7.3.4定时器启动

7.3.5定时器状态获取函数

7.3.6定时器停止函数

7.4应用实例

7.4.1场景描述

7.4.2设计过程

7.4.3具体实现

习题

第8章内存管理

8.1内存管理机制

8.2内存管理机制分析

8.2.1内存控制块os_mem

8.2.2内存分区调试链表指针OSMemDbgListPtr

8.3内存管理函数

8.3.1内存初始化函数

8.3.2添加内存分区到调试列表

8.3.3内存分区创建函数

8.3.4内存块获取函数

8.3.5内存块释放函数

8.4内存管理应用开发

8.4.1场景描述

8.4.2设计环境

8.4.3具体实现

8.4.4实验结果

习题

第9章文件系统μC/FS

9.1文件系统概述

9.2机制方法

9.3关键数据结构

9.3.1文件及文件操作的数据结构

9.3.2文件夹数据结构

9.3.3其他的一些变量及数据结构

9.4内核函数

9.4.1_FS_fat_find_file()

9.4.2_FS_fat_create_file()

9.5应用函数介绍

9.5.1FS_Fopen()文件打开函数

9.5.2FS_FWrite()文件写入函数

9.5.3FS_FClose()文件关闭函数

9.6应用示例

9.6.1场景描述

9.6.2设计过程

9.6.3测试

习题

第10章μC/OSⅢ移植

10.1移植机制

10.2μC/OSⅢ与CPU相关的文件

10.2.1cpu.c文件

10.2.2cpu_a.asm文件

10.2.3cpu_cfg.h文件

10.2.4cpu_def.h文件

10.2.5cpu.h文件

10.2.6cpu_core.h文件

10.2.7cpu_core.c文件

10.3μC/OSⅢ系统与CPU接口文件

10.3.1os_cpu.h文件

10.3.2os_cpu_c.c文件

10.3.3os_cpu_a.asm文件

习题

参考文献




TOP书摘

第3章μC/OSⅢ内核调度

3.1μC/OSⅢ内核调度机制
μC/OSⅢ内核调度主要是协调任务之间对CPU的使用权。具体而言,μC/OSⅢ任务调度分为抢占式调度和时间片轮转调度。其中抢占式调度根据发生的时间又分为任务级任务调度OSSched()和中断级任务调度OSIntExit(),由于调度的时机不同,这两种任务调度对应的上下文切换也有所不同,后面的章节会详细介绍。
时间片轮转调度,本身可以通过编译开关的配置选择启用或者不启用。启用状态下,当用于提供系统时钟的定时器发生中断(一个时钟节拍过去)时,该中断服务函数会调用OSTimeTick()函数,在该函数内部系统会更新时基的相关数据结构,同时调用时间片轮转调度函数OS_SchedRoundRobin()。
在优先级调度的过程中离不开数据结构: 任务就绪表OSPrioTbl。μC/OSⅢ对优先级的数量无限制,由宏定义OS_CFG_PRIO_MAX确定。然而,配置μC/OSⅢ的优先级在32~256之间已经能满足大多数的应用。OSPrioTbl结构如图3.1所示,最高优先级0处于OSPrioTbl[0]中,最低优先级OS_CFG_PRIO_MAX-1处于OSPrioTbl[OS_PROI_SIZE-1]中。


图3.1任务优先级表结构


3.2μC/OSⅢ内核抢占优先级调度分析
μC/OSⅢ中比较常用的两个抢占式任务调度函数是OSSched()和OSIntExit(),这两个函数的抢占时机分别是正常运行状态和退出中断时。二者的函数主体比较相似,都是先判断是否满足调度条件,之后通过调用函数OS_PrioGetHighest()来获取当前就绪队列中最高优先级任务所持有的优先级,然后根据任务TCB进行上下文切换。
一个简单的抢占过程如图3.2所示。


图3.2抢占过程



其中,获取最高优先级函数OS_PrioGetHighest()源码如下:



OS_PRIOOS_PrioGetHighest (void)

{

CPU_DATA*p_tbl;

OS_PRIOprio;



prio= (OS_PRIO)0;

p_tbl = &OSPrioTbl[0];

//通过位映像表查找最高优先级

while (*p_tbl == (CPU_DATA)0) {

//计算 CPU_DATA入口

prio += DEF_INT_CPU_NBR_BITS;

p_tbl++;

}

//找到入口处第一个位组

prio += (OS_PRIO)CPU_CntLeadZeros(*p_tbl);

return (prio);

}





当最高优先级的任务被确定后,执行上下文切换,OSSched()调用的是宏OS_TASK_SW(),这里实际上调用的是汇编函数OSCtexSw(),而OSIntExit()调用的是汇编函数OSIntCtxSw()。
OSSched()源代码如下:



voidOSSched(void)

{

CPU_SR_ALLOC();



if (OSIntNestingCtr  (OS_NESTING_CTR)0) {

return;

}

//调度器上锁

if (OSSchedLockNestingCtr  (OS_NESTING_CTR)0) {

return;

}



CPU_INT_DIS();

//就绪最高优先级任务

OSPrioHighRdy= OS_PrioGetHighest();

OSTCBHighRdyPtr = OSRdyList[OSPrioHighRdy].HeadPtr;

//当前任务优先级是否最高

if (OSTCBHighRdyPtr == OSTCBCurPtr) {

CPU_INT_EN();

return;

}



#if OS_CFG_TASK_PROFILE_EN  0u

OSTCBHighRdyPtr-CtxSwCtr++;//上下文切换计数

#endif

OSTaskCtxSwCtr++;

OS_TASK_SW();//执行任务级上下文切换

CPU_INT_EN();

}





OSIntExit()源代码如下:



voidOSIntExit(void)

{

CPU_SR_ALLOC();



if (OSRunning != OS_STATE_OS_RUNNING) {

return;

}



CPU_INT_DIS();

if (OSIntNestingCtr == (OS_NESTING_CTR)0) {

CPU_INT_EN();

return;

TOP 其它信息

装  帧:平装

页  数:187

开  本:16

加载页面用时:77.1116