先展示一个操作系统运行动态图

1.操作系统内核关键知识点

本文将用一个实际的工程例子来剖析操作系统内核运行原理。在此之前我们先回顾一下之前文章讲述的重点知识点。

《嵌入式实时操作系统3——任务切换》中讲到任务切换5个步骤:保存现场,保存栈指针,找出最高优先级任务,读取栈指针,恢复现场。

《嵌入式实时操作系统4——任务调度》中讲到:操作系统总是运行最高优先级任务,一旦有更高优先级任务就绪,操作系统将立即暂停当前任务运行更高等级任务,相同优先级下的多个任务采取时间片轮询的方式依次运行。

《嵌入式实时操作系统5——就绪表》中讲到:操作系统内核会将就绪的任务存放在就绪表,内核总是从就绪表中找出最高优先级任务,并执行该任务。

《嵌入式实时操作系统8——等待表》中讲到:当多任务系统中有任务需要延时等待时,操作系统内核会将该任务从就绪表中移动到等待表中,等待表的作用就是帮助操作系统内核管理需要延时等待的任务。

《嵌入式实时操作系统10——系统时钟节拍》中讲到:系统时钟节拍服务被定时器中断程序调用,系统时钟节拍服务完成了:更新系统节拍时间,更新等待表和就绪表,处理时间片轮询,切换任务。

2.操作系统内核运行原理

操作系统内核运行的本质就是根据需求调度任务,在多个任务中找出最高优先级任务,并运行这个任务。

我们用驾校的例子,驾校只有一辆教学车,多名学生和一个教练。根据报名费的不同将学员分成了VIP等级和普通等级,每个等级有若干个学员。教练然后制定了2张表格:

1、就绪表:记录了正在排队的学员信息
2、等待表:记录了正在休息的学员信息

教练只需要关注就绪表,让就绪表中的学员上车练习。首先教练在就绪表中检查优先等级,判断VIP等级中有没有学员,如果VIP等级有学员,教练优先让VIP的学员上车练习,只有等VIP学员都完成练习放弃练习,才轮到普通学员上车练习

如果有一个学员需要去厕所20分钟,教练就把这个学员的名字从就绪表中移除,把他的名字放入等待表中,在此期间不会考虑让该学员上车练习。

20分钟后学员上完厕所回来,教练就把这个学员的名字从等待表中移除,把他的名字加入就绪表中。假设此时正在练车的是普通学员,而这位休息的学员是VIP学员(并且希望练车),敬业的教练就要立即让普通学员停止练习,让VIP级学员优先练习。如果这位休息的学员事普通等级,那就让这个他继续等待,相同等级的学员轮流执行。
动态如如下:

3.工程描述

通过驾校的例子大家对操作系统内核工作原理有了初步了解,接下来我们根据一个实际工程来深入研究操作系统内核是如何工作的。

该工程是应用于智能家具中的一个多功能空调面板,该面板的主要功能是控制家里的温度和湿度,多功能面板实物如下:

多功能空调面板工程硬件基于国产GD系列芯片,软件基于FreeRTOS操作系统。

多功能空调面板主要有LCD显示,按键输入,温湿度检查3个功能模块。软件工程设计为以下3个任务:

1、温湿度读取任务,优先级为高。任务设计为每间隔4ms读取一个温湿度传感器,读到温湿度数据后,将数据发送给显示任务。
2、按键任务,优先级为低。任务设计为持续扫描4个按键,监测按键是否按下,并能识别按键长按和连击,有按键触发后,将按键数据发给显示任务。
3、显示任务,优先级为低。任务设计为根据接收到的温湿度数据,显示温度和湿度;根据接收到的按键数据,进行显示界面切换。

4.操作系统运行分析

main函数中设置SysTick定时器为1ms周期定时,创建显示任务,按键任务和温湿度读取任务。main代码如下:

/* github: liyinuo2017                 author:liwei */
int32_t main(void)
{/* 配置系统时钟 */system_clk_init(); /*显示任务*/                    xTaskCreate((TaskFunction_t )display_task,   (const char*   )"display",   (uint16_t       )SIZE_512,(void*            )NULL,(UBaseType_t  )LOW_PRIO,(TaskHandle_t*    )NULL); /*按键任务*/                xTaskCreate((TaskFunction_t )button_task,   (const char*    )"button",  (uint16_t     )SIZE_256,(void*            )NULL,(UBaseType_t  )LOW_PRIO,(TaskHandle_t*    )NULL); /*温湿度读取任务*/                 xTaskCreate((TaskFunction_t )temp_humi_task,    (const char*    )"temp_humi",  (uint16_t      )SIZE_256,(void*            )NULL,(UBaseType_t  )HIGH_PRIO,(TaskHandle_t*   )NULL); /* 任务调度 */          vTaskStartScheduler();              while(1);
}

显示任务,按键任务和温湿度读取任务这3个任务的代码如下:
/* github: liyinuo2017 author:liwei */

/*lcd显示任务 */
void display_task(void *pvParameters)
{/* 初始化 */display_init();for(;;){/* 数据更新     ,运行  时间1ms*/display_data_updata();/* 显示更新 ,    运行  时间1ms*/display_handle(); }
}/* 按键任务 */
void button_task(void *pvParameters)
{/* 初始化 */button_init();for(;;){/* 按键扫描 ,    运行  时间1ms*/button_scanf();/* 按键数据发送给显示任务     ,      运行  时间1ms*/button_data_send(); }
}/* 温湿度读取任务 */
void temp_humi_task(void *pvParameters)
{/* 初始化 */temp_humi_init();for(;;){/* 读取数据,    运行  时间1ms*/data_read_calc();/* 数据发送给显示任务     ,      运行  时间1ms*/temp_humi_data_send(); }
}

执行vTaskStartScheduler函数后,操作系统内核开始任务调度,操作系统的状态如下图:

操作系统启动运行,由于HIGH_PRIO优先级为任务最高优先级,因此操作系统内核让温度读取任务开始运行,当温度读取任务完成读取温湿度数据,并将数据发送给显示任务。

温度读取任务完成相应操作后执行延时等待,操作系统内核会将温度读取任务从就绪表中移除,将温度读取任务添加到等待表中,更新优先级表,切换任务。动态如如下:


当温度读取任务进入等待队列后,LOW_PRIO优先级为任务最高优先级,该优先级下有显示任务和按键任务,显示任务在就绪表前端,显示任务先运行。 动态如如下:


显示任务运行1ms后,定时器周期产生中断,系统时钟节拍服务被执行,更新系统时间,检查等待表,并执行时间片轮询操作,**显示任务被移动到就绪表末端,按键任务来到就绪表前端,**中断返回前执行任务切换,按键任务开始运行。

按键任务运行1ms后,定时器周期产生中断,系统时钟节拍服务被执行,更新系统时间,检查等待表,并执行时间片轮询操作,按**键任务被移动到就绪表末端,显示任务来到就绪表前端,**中断返回前执行任务切换,显示任务开始运行。动态如如下:


系统时钟节拍服务被执行后,更新系统时间,检查等待表,此时温度读取任务完成延时等待,操作系统内核会温度读取任务从等待表中移除,将温度读取任务添加到就绪表中,更新优先级表,由于HIGH_PRIO优先级为任务最高优先级,切换任务,温度读取任务开始运行。动态如如下:

软件工程运行的整个动态过程如下图:

未完待续…
实时操作系统系列将持续更新
创作不易希望朋友们点赞,转发,评论,关注。
您的点赞,转发,评论,关注将是我持续更新的动力
作者:李巍
Github:liyinuoman2017

嵌入式实时操作系统11——操作系统内核运行原理相关推荐

  1. makefile的基本使用方法,使用bc编译文件的例子-参照任哲的《嵌入式实时操作系统μCOS-II原理及应用-任哲(第3版)》

    实验例子文件:(不一定需要,本文有所有内容,在此给出只是为了方便) makefile的基本使用方法,使用bc编译文件的例子-参照任哲的<嵌入式实时操作系统μCOS-II原理及应用-任哲(第3版) ...

  2. 嵌入式实时操作系统ucosii原理及应用(任哲)-- --阅读笔记2

    本文是<嵌入式实时操作系统ucosii原理及应用(任哲)>一书第三章的阅读笔记,知识点多为摘录,若希望深入了解,请购买该书认真研读.由于一些知识比较零散,记起来不大方便,又习惯画图辅助记忆 ...

  3. 嵌入式实时操作系统ucosii原理及应用(任哲)

    本文是<嵌入式实时操作系统ucosii原理及应用(任哲)>一书第三章的阅读笔记,知识点多为摘录,若希望深入了解,请购买该书认真研读.由于一些知识比较零散,记起来不大方便,又习惯画图辅助记忆 ...

  4. 参考任哲的《嵌入式实时操作系统μC_OS-II原理及应用》,对UCOS的任务调度做了下整理。

    参考任哲的< 嵌入式 实时操作系统μC_OS-II原理及应用>,对 UCOS 的任务调度做了下整理. UCOS有两种调度器,一种是任务级的调度器,一种是中断级的调度器.任务级的调度器由OS ...

  5. 《嵌入式实时操作系统 uc/OS-II 原理及应用》【任哲 主编】随书例程以及使用方法

    说明 uc/OS-II 是一款开源的实时操作系统,但是如果用于商业,是需要付费的.为了深入了解,找到任哲老师的<嵌入式实时操作系统 uc/OS-II 原理及应用>一书,总体还不错.但是书中 ...

  6. 嵌入式实时操作系统-VxWorks(基础)

    1.实时系统定义:是指那些产生系统输出的时间对于系统是至关重要的系统. 实时系统可根据时限对其性能(或效益)影响程度的不同,分为软实时系统SRT和硬实时系统HRT. 软时限是指时限的错过不会损害系统的 ...

  7. 嵌入式实时操作系统ucos-ii_「正点原子NANO STM32开发板资料连载」第三十六章 UCOSII 实验 1任务调度...

    1)实验平台:alientek NANO STM32F411 V1开发板2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第三十六章 ...

  8. 嵌入式实时操作系统4——任务调度

    任务调度 任务调度指的是操作系统内核根据某种方法,在多个用户任务中找到一个最佳任务进行运行. 我们通过现实生活中的例子来理解. 例1:现在我们去买一杯茶颜悦色的奶茶,到了店门口发现有很多人,作为文明市 ...

  9. 嵌入式实时操作系统1——初识嵌入式实时操作系统

    嵌入式实时操作系统是什么 嵌入式实时操作系统是一个特殊的程序,是一个支持多任务的运行环境.嵌入式实时操作系统最大的特点就是"实时性",如果有一个任务需要执行,实时操作系统会立即执行 ...

最新文章

  1. 【Go】Go基础(三):基本结构和基本数据类型
  2. python turtle循环图案-Python绘图Turtle库详解
  3. JSP+Servlet + JDBC 实现简单的登录验证模块
  4. C# 导出EXCEL文件
  5. numpy np.polyfit()(最小二乘多项式拟合曲线)(有待进一步研究)
  6. QPW 点评点赞日志表(tf_appraise_praise)
  7. Vue.js实战之Vuex的入门教程
  8. python变量生命周期_python 变量定义及变量生命周期
  9. 解决XShell连接时无法root用户登录问题【Linux】
  10. 103.及时清除缓存
  11. azure java_使用 Java 的 Azure 存储示例 | Microsoft Docs
  12. 使用ipop共享串口提高工作效率
  13. echarts地图迁徙图
  14. 【hbase】解决海量图片存储
  15. Git恢复被删除的文件
  16. QT读取局域网共享文件夹文件内容 解决不同网段无法访问共享文件夹问题
  17. 苹果前置摄像头拍出来是反的怎么调_iPhone 前镜头自拍会左右颠倒?如何开启前镜头镜像翻转设定...
  18. 插入排序一块说说-很合适~~~二分查找和折半
  19. MOS 转载 ORA-1555 诊断和分析
  20. 这些数据合并的神操作,你掌握几个?

热门文章

  1. Linux桌面录屏分享
  2. thinkphp(2)
  3. 电脑重装系统后如何给系统磁盘扩容空间
  4. 今日头条一面笔试面试题!!!!!完整
  5. 微信公众平台开发订阅号
  6. Description Resource Path Location Type Call requires API level 5 (解决方法)
  7. Python数据采集案例(1):微博热搜榜采集
  8. 2017年衢州联赛 T2
  9. 华为交换机 access,trunk,hybrid理解,需一点基础,应该是最完整的
  10. Js 怎么遍历json对象所有key及根据动态key获取值