μC/OS-II微小内核分析

μC/OS-II 嵌入式实时操作系统的源代码可以分成三部分:与硬件无关的内核代码、与处理器有关的移植代码和用户配置文件。

内核代码位于source目录下,提供了4个微小内核。它们分别位于source\SOURCE1(包含建立任务和延时功能)、source
\SOURCE2(增加删除任务功能)、source\SOURCE3(增加信号量文件)和source\SOURCE4(增加删除信号量功能)。它们的 功能依次增强,代码也依次增大。

μC/OS-Ⅱ是通过任务控制块来管理任务的。任务控制块是一个基于链表的数据结构,任务控制块主要用于记录任务的堆栈栈顶指针、指向下一个任务控制块的指针、任务等待的延迟时间、任务的当前状态标志与任务的优先级别等一些与任务管理有关的属性。

当任务的CPU使用权被剥夺时,μC/OS-Ⅱ用任务控制块来保存该任务的状态,从而保证任务重新获得CPU使用权时从断点处执行。

μC/OS-II必须通过函数OSInit()初始化后才可以使用,该仅调用OS_InitMisc()、OS_InitRdyList()、OS_InitTCBList()和OS_InitTaskIdle() 4个函数。

OSTaskCreate()调用了OSTaskStkInit()任务堆栈初始化函数和OS_TCBInit()函数获得并初始化一个OS_TCB。

任务调度小结:

可重入的代码指的是一段代码可以被多个任务同时调用,而不必担心数据被破坏。即就是说,可重入型函数在任何时候都可以被打断,一段时间以后又可以继续运行,而相应数据却不会丢失。可重入型函数或者只使用局部变量,即变量保存在CPU寄存器或堆栈中。如果使用全局变量,则要对全局变量予以保护。由此可见,代码的可重入性是保证完成多任务的基础。

μC/OS-Ⅱ为了处理临界区代码需要禁止中断,处理完毕后再允许中断,这使得μC/OS-Ⅱ能够避免同时有其它任务或中断服务进入临界段代码,两个宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来禁止中断和允许中断。

μC/OS-II将信号量、互斥信号量、消息邮箱、消息队列等统称为“事件”,然后通过一个称为“事件控制块(ECB)”的数据结构来管理事件,也就是说,任务和中断服务程序可以通过ECB向另外的任务程发送信号,任务也可以等待另一个任务或者中断服务程序给它发送信号。

在使用事件控制块之前,需要将所有事件控制块链接成一个空闲事件控制块链表。每当建立一个信号量、互斥信号量、消息邮箱、消息队列时,就从该链表中取出一 个空闲事件控制块,并对它进行初始化。当信号量、互斥信号量、消息邮箱、消息队列被删除时,对应的事件控制块也需要放回到空闲事件控制块链表中。

μC/OS-II支持对信号量的3种操作:创建信号量OSSemCreate()、发送信号量OSSemPost()和等待信号量OSSemPend()。

时间: 2024-09-05 04:36:52

μC/OS-II微小内核分析的相关文章

20135201李辰希《Linux内核分析》第三次 构造一个简单的Linux系统OS

李辰希 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第三周构造一个简单的Linux系统MenuOS 一.Linux内核源代码简介 三个法宝和两把宝剑: 三个法宝:存储程序计算机.函数调用堆栈.终断 操作系统的两把宝剑:中断上下文的切换(保存现场和恢复现场).进程上下文的切换 2.linux内核源代码简介 arch/x86目录下的代码是重点关注的 init目录:内核启动相关的代码基本都在init目录下

LINUX内核分析第四周学习总结——扒开应用系统的三层皮(上)

LINUX内核分析第四周学习总结——扒开应用系统的三层皮(上) 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.知识概要 (一)用户态.内核态和中断处理过程 (二)系统调用概述 系统调用概述和系统调用的三层皮 (三)使用库函数API和C代码中嵌入汇编代码触发同一个系统调用 使用库函数API获取系统当前时间 C代码中嵌入汇编代码的方法(复习) 使用C代码中嵌入汇编代码触发系统调

Linux内核分析第五周作业

分析system_call中断处理过程 这次的目标是通过gdb来跟踪上周选择的uname系统调用.因为系统调用是通过中断在内核态实现的,gdb无法调试本机的系统调用.所以必须像之前的内核跟踪那样,用gdb远程连接至qemu虚拟机进行跟踪. 1. 首先修改之前的MenuOS,添加一个myuname函数通过API的方式调用uname系统调用,直接复制了上周的代码,注意要在main函数中把这个函数添加到菜单中 用make命令编译以后,会生成一个test的可执行文件,可以先在本地运行试一试 可以看到命令

内核分析-第五周

刘文学 原创作品转载请注明出处 http://blog.csdn.net/wdxz6547/article/details/50993837<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 预备知识 内核态 用户态 为什么要划分系统级别? 如何区分内核和用户态? cs:eip 寄存器上下文 上下文切换 系统调用号 中断向量 调度时机 系统调用过程中一定发生中断, 在系统调用执行过程中可能有进程的切换. 系统调用分

20135327郭皓--Linux内核分析第四周 扒开系统调用的三层皮(上)

Linux内核分析第四周 扒开系统调用的三层皮(上) 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一.用户态.内核态和中断 用户态:当进程在执行用户自己的代码时,则称其处于用户态,即此时处理器在特权级最低的(3级)用户代码中运行. 内核态:当一个进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核态,此时处理器处于特权级最高的(0级)内核代码中执行. PS:CPU指令

Linux内核分析——扒开系统调用的三层皮(上)

马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.用户态.内核态和中断处理过程 1.用户通过库函数与系统调用联系起来. 2.在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态.而在相应的低级别执行状态下代码的掌控范围受到限制.只能在对应级别允许的范围内活动. 3.intel x86 CPU有四种不同的执行级别0-3.Linux只取两种,0级

“Linux内核分析”实验三

跟踪分析Linux内核的启动过程 作者:何振豪 原创作品转载请注明出处 http://www.cnblogs.com/scoyer/p/6516032.html <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 这节课讲了如何查看linux内核源代码,构造一个简单的linux系统(算不上构造,实际上就是编译内核,然后打包git上的根文件系统,然后启动这个简单系统而已),最后还讲了如何利用gdb来跟踪调试linu

Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质

原文:Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质 Linux内核分析(六) 昨天我们对字符设备进行了初步的了解,并且实现了简单的字符设备驱动,今天我们继续对字符设备的某些方法进行完善. 今天我们会分析到以下内容: 1.      字符设备控制方法实现 2.      揭秘系统调用本质 在昨天我们实现的字符设备中有open.read.write等方法,由于这些方法我们在以前编写应用程序的时候,相信大家已经有所涉及所以就没单独列出来分析,今天我们主要来分析一下我们以前接触

Linux内核分析之操作系统是如何工作的

在本周的课程中,孟老师主要讲解了操作系统是如何工作的,我根据自己的理解写了这篇博客,请各位小伙伴多多指正. 一.知识点总结 1. 三个法宝 存储程序计算机:所有计算机基础性的逻辑框架. 堆栈:高级语言的起点,函数调用需要堆栈机制. 中断机制:多道系统的基础,是计算机效率提升的关键. 2. 函数调用堆栈 堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间,即CPU内已经集成好了很多功能. 堆栈含以下元素: 函数调用框架 传递参数 保存返回地址(%eax) 提供局部变量空间 等等 C语言编译器