目录

  • μC/OS-Ⅱ任务调度
    • 1.任务控制块
    • 2.任务管理
    • 3.任务状态
  • μC/OS-Ⅱ时间管理
  • μC/OS-Ⅱ内存管理
    • 内存控制块MCB
  • μC/OS-Ⅱ任务通信
    • 1.事件
    • 2.事件控制块ECB
    • 3.信号量
    • 4.邮箱
    • 5.消息队列

操作系统内核:在多任务系统中,提供任务调度与切换、中断服务
操作系统内核为每个任务分配CPU时间,并且负责任务之间的通信。

嵌入式操作系统核心内容:
1、进程调度
2、进程通信
3、内存管理
4、设备管理

嵌入式操作系统的结构:

μC/OS-Ⅱ任务调度

用户在建立操作系统的时候需要初始化操作系统。
任务调度的时候需要开始操作系统。
中断的代码不允许其他中断,需要进入代码临界段函数,临界段完成后使用退出代码临界段函数。
有些任务间一些处理过程比较重要,不希望被别的任务打断,需要使用任务调度上锁函数,完成之后需要使用任务调度解锁函数。

1.任务控制块

任务控制块是一个基于链表的数据结构,任务控制块主要用于记录任务的堆栈栈顶指针、指向下一个任务控制块的指针、任务等待的延迟时间、任务的当前状态标志与任务的优先级别等一些与任务管理有关的属性。
当任务的CPU使用权被剥夺时,μC/OS-Ⅱ用任务控制块来保存该任务的状态,从而保证任务重新获得CPU使用权时从断点处执行。
系统中的每一个任务都有一个任务控制快,用于存放该任务的状态。任务控制块中的各个单元的值一般不需要用户改动。

2.任务管理

任务分为两个形式:
1、无限循环

void Task1()
{for(;;){//用户任务代码}osdelay();
}

2、任务在运行完毕后自我删除

void Task2()
{//用户任务代码//自我删除osTaskDel(OS_PRIO_SELF);osdelay();
}

3、基本的应用任务框架:

int main()
{//目标板初始化OsInit();  //创建任务1、2、3......osTaskCreate(Task1,(void*)0,(os_stk *)&Task1_Stack[TASK_STACK_SIZE - 1],Task1_PRIO);osTaskCreate(Task2,(void*)0,(os_stk *)&Task1_Stack[TASK_STACK_SIZE - 1],Task2_PRIO);//开始任务osStart();//进入调度
}

3.任务状态

μC/OS-Ⅱ任务共有4种状态:
1、睡眠态:任务处于该状态时,仅有任务代码,并没有操作系统处理
2、就绪态:任务处于该状态时,随时可以准备运行
3、运行态:正在运行的任务,一般是运行就绪优先级最高的任务
4、挂起态:当任务处于该状态时,任务不会运行,只有当任务返回就绪状态时,才可以运行
每个任务的切换如下:

uC/OS-II OS_TASK.C中有关任务管理的函数

μC/OS-Ⅱ时间管理

μC/OS-Ⅱ内核要求用户提供定时中断来实现延时和超时控制等功能。此定时中断叫做时钟节拍。时钟节拍频率越高,系统的负载越重。
主要用到的函数:

函数 用途
OSTimeDly() 任务延时函数
OSTimeDlyHMSM() 按时分延时函数
OSTimeDlyResume() 让处在延时期的任务结束延时
OSTimeGet() 得到系统时间
OSTimeSet() 设置系统时间

1、OSTimeDly():
调用该函数会进行一次任务调度,并且执行下一个优先级最高的就绪态任务。
调用函数之后,一旦规定的时间期满或者有其他任务通过调用OSTimeDlyResume()取消延时,它就会立马进入就绪状态。
本函数是将处于运行状态的转入挂起状态,当延时结束的时候,任务重新返回到就绪状态。

2、OSTimeDlyResume()
使用任务延迟函数OSTimeDly()和任务挂起函数OSTaskSuspend()的任务都是处于挂起状态,但是两个处理方法不同:
任务的时间延时与恢复是通过设置任务控制块TCB中的OSTCBDly表示。
OSTaskSuspend通过设置任务控制块TCB中的OS_STAT_SUSPEND标志来表示任务正在被挂起。
所以通过任务回复函数OSTaskResume()不能恢复处于被时间延时的任务

μC/OS-Ⅱ内存管理

malloc和free函数可以动态分配内存和释放内存,但是多次这样做会把原来很大的一块连续内存区域逐渐地分割成许多非常小而且彼此不相邻的内存区域,也就是内存碎片
操作系统把连续的大块内存按照分区:

μC/OS-Ⅱ对malloc和free进行了改进,使它们可以分配和释放固定大小的内存块。用户应用程序可以从不同的内存分区中得到不同大小的内存块,特定的内存块在释放时必须重新放回它以前所属于的内存分区。使用这样的内存管理算法,内存碎片问题得以解决。

内存控制块MCB

内存控制块MCB是一个数据结构,μCOSII用它对内存进行管理,来表示每个内存分区的信息,系统中的每个内存分区都有它自己的内存控制块,MCB包括以下内容:

μC/OS-Ⅱ任务通信

1.事件

μC/OS-Ⅱ提供三种特殊的数据共享和任务通信的方法:信号量、邮箱、消息队列。统称为事件。
μC/OS-Ⅱ用事件控制块ECB表示事件的信息。
任务或中断服务子程序可以通过ECB向另外的任务发事件。
任务可以等待另一个任务或者中断服务子程序给它发事件。
只有任务可以等待事件发生,中断服务子程序不能。
1、对于等待的任务,可指定一个最长等待事件,以免无限期等待。中断服务程序不能等待事件

2、多个任务同时等待一个事件,优先级最高的任务得到该时间并进入就绪态

2.事件控制块ECB

ECB是描述事件的数据结构,它由以下几个部分构成:

  1. OSEventPtr 当事件是邮箱或者消息队列时,是指向邮箱或消息队列的的指针
    2.OSEventCnt 当事件是一个信号量时,是信号量的计数器。
    3.OSEventTbl[] 和 .OSEventGrp 等待该事件的任务表和组。
    4.OSEventType定义了事件的具体类型,可以是信号量(OS_EVENT_SEM)、邮箱(OS_EVENT_TYPE_MBOX)或消息队列(OS_EVENT_TYPE_Q)中的一种。

3.信号量

信号量由两部分组成:该信号量的计数器的值、等待该信号量的任务组成的等待任务列表。
信号量的接口分为:

建立一个信号量
等待一个信号量
发送一个信号量
无等待地请求一个信号量
查询一个信号量的当前状态

信号量的使用规范:

任何时刻都可以建立信号量
只有任务可以等待信号量
中断和任务可以发送信号量
中断和任务可以无等待地请求一个信号量
只有任务可以查询一个信号量的当前状态

工作原理
在使用一个信号量之前,首先调用函数建立该信号量,对信号量的初始计数值赋值。
如果信号量用来表示一个或者多个事件的发生,那么该信号量的初始值设为0;
如果信号量用来对共享资源的访问,那么该信号量的初始值设为1;
如果信号量是用来表示允许任务访问n个相同的资源,那么初始值应为n,并作为可计数的信号量使用。
任务根据信号量的值来判断是否可以运行(比如是否对公共资源可以访问)
几个任务往往只建立一个信号量sem:

任务一先执行任务二后执行的信号量变化顺序:任务一先P操作信号量排斥任务二的执行,完成后再V操作信号量放行任务二

4.邮箱

邮箱的接口分为:

建立一个邮箱
等待一个邮箱中的消息
发送一个消息到邮箱中
无等待地从邮箱中得到一个消息
查询一个邮箱的状态

邮箱使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。该指针指向一个包含特定“消息”的数据结构。
如果使用邮箱的目的是通知一个事件的发生(发送一条消息),那么就要初始化该邮箱为NULL,因为在开始时,事件还没有开始。
如果用邮箱来共享某些资源,那么就要初始化该邮箱为一个非NULL的指针,这种情况,邮箱作为一个二值信号使用。

邮箱的使用规范:

1、任何时刻都可以建立邮箱
2、中断和任务可以无等待地请求邮箱的消息
3、中断和任务可以发送消息到消息
4、只有任务可以等待一个邮箱的消息
5、只有任务可以查询一个邮箱的当前状态
6、邮箱中的消息可以被读出

5.消息队列

一个任务通过消息队列向另一个任务发送“一串”指针型的变量,该些指针指向各个包含“消息”的数据结构
消息队列可以看成多个邮箱组成的队列,但这些邮箱使用同一个等待任务列表

消息队列的接口分为:

建立一个消息队列
等待一个消息队列中的消息
发送一个消息到消息队列中
无等待地从消息队列中得到一个消息
查询一个消息队列的状态
清空一个消息队列

消息队列的使用规范:

任何时刻都可以建立消息队列中的消息
只有任务可以等待一个消息队列中的消息
中断和任务可以发送消息到消息队列中
中断和任务可以无等待地请求消息队列中的消息
只有任务可以查询一个消息队列的当前状态
中断和任务可以清空消息队列

μC/OS-Ⅱ 操作系统内核知识相关推荐

  1. 操作系统内核知识介绍

    什么是内核? 说到操作系统,就必须说内核.内核是操作系统中应用连接硬件设备的桥梁. 内核的能力 对于一个现代的操作系统来说,它的内核至少应该提供以下 4 种基本能力: 管理进程.线程(决定哪个进程.线 ...

  2. 【OS学习笔记】二十二 保护模式六:保户模式下操作系统内核如何加载用户程序并运行 对应的汇编代码之用户程序

    本汇编代码对应文章:保户模式下操作系统内核如何加载用户程序并运行中的实际用户程序代码. 对应的主引导扇区代码:主引导扇区代码 对应的内核代码:内核代码 ;代码清单13-3;文件名:c13.asm;文件 ...

  3. 【OS学习笔记】二十一 保护模式六:保户模式下操作系统内核如何加载用户程序并运行 对应的汇编代码之内核代码

    本汇编代码对应文章保户模式下操作系统内核如何加载用户程序并运行 中的实际内核代码 对应的主引导扇区代码:主引导扇区代码 对应的用户程序代码:用户程序代码 ;代码清单13-2;文件名:c13_core. ...

  4. 【OS学习笔记】二十 保护模式六:保户模式下操作系统内核如何加载用户程序并运行 对应的汇编代码之主引导扇区程序

    本汇编代码对应保户模式下操作系统内核如何加载用户程序并运行 的实际主引导扇区代码: 对应的内核代码在:内核代码 对应的用户程序代码在:用户程序代码 ;代码清单13-1;文件名:c13_mbr.asm; ...

  5. 嵌入式操作系统内核原理和开发

    嵌入式操作系统内核原理和开发(开篇) 操作系统是很多人每天必须打交道的东西,因为在你打开电脑的一刹那,随着bios自检结束,你的windows系统已经开始运行了.如果问大家操作系统是什么?可能有的人会 ...

  6. 操作系统内核Hack:(二)底层编程基础

    操作系统内核Hack:(二)底层编程基础 在<操作系统内核Hack:(一)实验环境搭建>中,我们看到了一个迷你操作系统引导程序.尽管只有不到二十行,然而要完全看懂还是需要不少底层软硬件知识 ...

  7. java写linux内核,基于mykernel 2.0编写一个操作系统内核

    一.实验要求 1.按照https://github.com/mengning/mykernel 的说明配置mykernel 2.0,熟悉Linux内核的编译: 2.基于mykernel 2.0编写一个 ...

  8. 操作系统内核的绝佳学习材料——JOS

    操作系统内核的绝佳学习材料--JOS 前言:关于JOS和一些经验之谈 这一学期的操作系统课使用的是MIT用于教学的JOS操作系统,并且StonyBrook在其基础上做了大量改动,最重要的变化就是从32 ...

  9. 特权级转移之 高,低特权级互相转移,模拟操作系统内核态与用户态切换以及应用程序调用系统资源

    TSS中保存的栈信息,是在特权级转移的时候被用到,具体就是在从低特权级转移到高特权级的时候会用.注意 从低到高 问题:为什么要保存 段寄存器值和通用寄存器的值? 既然是为了实现多任务,那么任务之间显然 ...

  10. 深入理解操作系统内核架构(送书)!

    近年来,我国自主研发操作系统被反复提及.近期,一个计算机领域内非常专业的词来到了几乎所有人的视线内,这就是--微内核.人们对操作系统内核的讨论越来越热烈,甚至有人说我不懂什么叫微内核,什么是宏内核,接 ...

最新文章

  1. 《自然语言处理入门》不是 NLP 学习路上的万能药
  2. java.lang.OutOfMemoryError及解决方案
  3. 2015国内征信机构大数据整合能力对比
  4. Openstack(二)基本环境准备--网络、时间、yum源等
  5. ASP在 Web.config 中创建数据库连接字符串
  6. c++ string 无法通过下标访问_数组下标1你见过吗?
  7. pic单片机c语言读eeprom,PIC单片机的EEPROM读写实例及说明
  8. 一次比较麻烦的性能问题诊断及解决
  9. mysql中的select into 与insert into语句用于备份数据
  10. 正向代理和反向代理详解(纯小白必看 最好懂的白话文教程)
  11. MATLAB设置使用语言为中文
  12. 微信网页video播放视频不全屏的解决方法
  13. 使用信号量机制解决家庭吃水果问题。
  14. 谷歌:但使龙城飞将在 不教算法度阴山
  15. 互联网赚钱的逻辑是什么?
  16. OpenVINO工具套件高级课程第一课:如何充分使用OpenVINO工具套件?
  17. Ansys electronics desktop 2020R1安装之后出现了很大的问题
  18. 一、编程语言与Python介绍
  19. 常见的5种保护电路(含电路图)
  20. 文档中如何插入计算机剪贴画,在Word 2007文档中插入剪贴画 -电脑资料

热门文章

  1. 前端开发——移动端及响应式布局解决办法总结(适配)
  2. 新版本阿里云网站的云服务器添加安全组规则
  3. 页面添加锚点后如何点击不改变URL?
  4. Vue $nextTick
  5. spring data jpa 分页查询
  6. WeScale 技术篇 —— mpvue 与微信小程序的火花
  7. 分享几道经典的javascript面试题
  8. 比较好的一些 ConcurrentHashMap讲解博客
  9. awk----基本用法
  10. JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象...