程序小白
认证:优质创作者
所在专题目录 查看专题
闲话内核——一切皆为程序片服务
可抢占式内核带来的挑战——并发
裸奔、事件驱动、传统多任务到底孰优孰劣?
RTOS中的断言机制——assert
作者动态 更多
小小调度器——开局default,优雅总藏于细节之中
04-02 09:23
小小调度器——调度器核心的纯C实现
04-01 14:09
小小调度器——原来C代码还能这么写,原作者没少挨打吧!
03-27 15:42
解析由系统库引发的hardfault血案(RT-Thread+ESP32)
2023-07-17 16:04
TINA瞬时现象仿真分析——运放缓冲器振铃
2023-02-28 11:38

闲话内核——一切皆为程序片服务

      操作系统有多难?说实话它挺难的。但是站在用户角度来看,他费了很多的功夫,内部各种算法与调度,只为达到一个简单的目的,一切皆为程序片服务。

      嵌入式操作系统有如雨后春笋,吃不完,就算能吃完你也嚼不完,就算你能嚼得完,也消化不完,这时候我们会遇到很多问题,我们精力有限到底该学哪一款?其实也没必要因为此而苦恼,因为虽然他们各有千秋,但是当你真正的解开其外衣以后,你会发现其实每一款RTOS其核心都是差不多的,不同的是在实时性、精简性、组件丰富性、、移植性上会各有千秋,偏向不同,等你掌握其内核以后对于任意一款都可以轻松上手。

      但是要想掌握内核却并不是那么容易的,需要你在实战中不断地遇到坑,填坑,你填的越多,你对他的理解就越深,掌握的就越牢固,这里我想换一种形式来聊聊关于内核那些事,在这方面我也是个新手(高手直接绕行,没啥意思),与大家一起学习一起分享。

切入正题,开篇就讲一切皆为程序片服务,那什么是程序片,如图:

        从图中可以看到,一段可执行代码就是一个程序片,至于多长怎么拆分,完全看你,一般来讲都是按功能拆分,专业一点来讲都是按照资源管理来拆分。

2.在裸奔的情况下,所有的程序片都是按顺序执行,这种方式有着得天独厚的优势,就是一切都是按顺序发生,完全可控,所以这种情况全局变量(也叫共享变量)的威力就显现出来了,便于控制,便于定义和使用,不要跟我讲什么封装艺术,什么管道机制,在这种路子下,梭哈最为实在。他的劣势也自然很明显,他们之间都是排着队执行的,想要突然插队,那几乎是不可能的,当然也能做但是会随着需求的爆发(越来越多插队情况)变得越来越难控制,因为他从生下来就注定了是个顺序结构。

这种结构能解决很大一部分问题,尤其是在嵌入式领域,深耕多年任劳任怨,但是很遗憾,他很难解决所有问题,不然也不会有后来的操作系统出现了。

内核的本质就是调度这些程序片,让他们可以再任意位置被其它程序片打断,转而去执行其它的时间片。

要完成这个调度任务,我们来分析一下,需要做哪些工作:1.得给每个程序片起个名字吧,方便确认谁是谁,好调度,学名:线程名或任务名。

2.既然定义了很多的程序片,如何调度呢?起跑线一样的情况下,先让谁跑总得有个先后顺序,学名:线程优先级或任务优先级。

3.程序片要被切换,那么程序片最起码要有两种状态,停止态和运行态,实际比这要复杂很多,至少有四种,运行态、就绪态、阻塞态、挂起态。

4.程序片在运行时被切换,如何保存现场呢?想想中断是怎么运行的,你需要一个给每一个程序片定义一个栈,在程序片被抢占的时候保存执行的现场。学名:线程栈或任务栈。

内核想要管理许多程序片,他该怎样做呢,一张图带你读懂内核管理机制:

      除此以外还会遇到一个问题,程序片是应用开发者的主战场,但是内核要实现管理功能,需要在程序片级做一些操作,于是程序片又被拆分了两类出来,系统级和应用级,系统线程IDLE ,应用线程。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 4
收藏 5
关注 115
成为作者 赚取收益
全部留言
0/200
  • chaochao1545 2021-01-18 09:46
    精彩,很多东西还没接触到
    回复
  • jlh213 2020-12-16 13:24
    看肥肥姐的文章,很精彩,以小见大,见微知著,给人以沐浴春风,拨云见日的感觉,令人茅厕顿开,听君一席话,胜读十连输,肥肥姐文章犹如迷失方向的小船,看到了指路的明灯,犹如满天星空的繁星,而你却是那指引方向的北极,文章幽默诙谐而不失技术含量,期待肥肥姐的佳作!
    回复 1条回复