![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
从1开始写一个操作系统
文章平均质量分 87
andylauren
嵌入式爱好者
展开
-
(1)从1开始写一个操作系统
第一章前言偶然间使用到了RTX51-tiny做一些东西,它是keil自带的51操作系统,以小巧占用资源少著称,这里不细谈它是如何实现的,反正是一个真正的基于时间片的多任务系统。往往我们在使用单片机做一些东西的时候都比较喜欢前后台的框架,这个方法好处就是整体逻辑简单,就是按循序执行,然后处理中断。缺点就是编程时无法使用任务的思想来划分功能,只能按照逻辑来实现功能,而且对于复杂功能就有点捉...原创 2019-09-20 22:27:55 · 637 阅读 · 0 评论 -
(11)从1开始写一个操作系统
第十一章小内存管理因为小内存的限制,不可能使用系统标准的malloc和free,这里介绍3种小内存管理方法。第一种就是预先申请一块大内存。然后使用这个内存来动态分配,并在分配时使用一个头来做分配记录。在使用过程中会出现碎片,也就是会发生不连续的可用内存。当有连续释放的内存是会进行合并。这种方法时最简单的方法也是小内存中最容易实现的,但是有一个致命的缺点就...原创 2019-09-23 19:08:58 · 228 阅读 · 0 评论 -
(10)从1开始写一个操作系统
第十章任务间同步和通信Inter-Task Communication,任务间通信多任务就会涉及到任务间共享资源的互斥操作和任务间通信。我们所需要完成的是能够提供这些功能的函数,来让用户更好的实现任务间同步和通信。我们将会实现互斥锁、信号量、消息队列以及事件标志。优先级翻转谈到任务间同步的机制就会涉及到优先级翻转的问题。首先说一下什么是优先级翻转。简单从字面上...原创 2019-09-23 18:58:18 · 559 阅读 · 0 评论 -
(9)从1开始写一个操作系统
第九章任务函数的补充前面讲的代码基本已经把我们的内核全部都实现完了,有一些需要有的函数没有在前面讲到,在这一章我们统一补充一下,让我们的内核更加完善。让出CPU当存在同级优先级任务的时候,任务希望把CPU让给其它同级优先级,担忧不想自己进入非就绪态的时候需要提供一个函数,来实现既能让出CPU,CPU又不改变自己的就绪状态。其实实现起来非常简单,就是任务调度函数,但是我们的void ...原创 2019-09-23 18:45:11 · 182 阅读 · 0 评论 -
(8)从1开始写一个操作系统
第八章抢占式概念抢占式内核:即当任务正在运行,有一个更高优先级的任务出现时,如果当前内核允许抢占,则可以将当前任务挂起,执行优先级更高的任务。在我们上一章的基础上我们已经做了这个工作。说白了就是在任务创建的时候进行了任务调度,已保证更高优先级的任务能够被及时运行。还有就是在更高优先级从非就绪态到就绪态的时候应该进行任务调度。这个场景是什么呢?比如高优先级的任务进入了sleep态,当sl...原创 2019-09-22 17:27:32 · 202 阅读 · 0 评论 -
(7)从1开始写一个操作系统
第七章时间片概念时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个任务被分配一个时间段,称作它的时间片,即该任务允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个任务。如果任务在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张任务先后运行的列表,当任务用完它的时间片后,它被插入到列表的前边,后面的任务顺序移动到队列的末尾。...原创 2019-09-22 17:20:54 · 232 阅读 · 0 评论 -
(6)从1开始写一个操作系统
第六章任务优先级及任务状态到现在为止我们其实已经实现了一些多任务的功能,而且我们也能从中总结出一些状态,比如正在运行,睡眠,挂起,就绪。这些状态都有他们特殊的逻辑,在之后我们还会设计支持时间片的方式,这时候我们只有就绪表就有些不够用了,我们需要在任务控制块中添加任务状态属性。在前面讲到的任务切换逻辑时间上是进行了任务ID从大到小的先后顺序进行调度,这就有点像优先级,只不过优先级与任务I...原创 2019-09-22 16:06:33 · 193 阅读 · 0 评论 -
(5)从1开始写一个操作系统
第五章这一张我们开始进行任务调度的相关实现,先从最简单的任务调度开始,任务主动释放cpu。主动释放CPU我们需要先准备两个任务,就是要进行这两个任务之间的主动释放,实现任务切换。我们为了观察结果,这里我们使用串口操作,需要把bsp中的串口部分打开。首先修改idle任务,让它在运行时打印一行log,并延时1秒,避免刷屏。void idle_task_0(void){...原创 2019-09-22 13:01:03 · 189 阅读 · 0 评论 -
(4)从1开始写一个操作系统
第四章任务就绪表我们有任务之后为了方便切换的时候判断需要读取那个任务的属性进行比较,我们就需要任务就绪表来记录哪个任务是就绪的,我们可以通过查表来找到这个就绪的任务。由于就绪表记录的状态只有就绪和未就绪两种,所以我们可以使用1位来表示一个任务的就绪状态。假如说我们有8个任务,那么我们可以使用一个字节表示这8个任务的就绪状态,第0位就是任务0的就绪状态,以此类推。代码中任务就绪表...原创 2019-09-22 12:48:00 · 210 阅读 · 0 评论 -
(3)从1开始写一个操作系统
第三章真正实现多任务前需要了解的寄存器知识当我们在做中断的时候会进行除了把PC入栈之外的动作,就是会把通用寄存器入栈,这是为什么呢?加入我们正在进行加法运算,使用了ACC寄存器,这时候进入了中断,我们的中断中也使用了ACC寄存器,当中断退出时原来的ACC已经被覆盖了,这样程序就出错了,这种事情在真实情况下是不会发生的。保证这个的方法就是在进入中断前,会把通用寄存器都一一入栈,在退出中断事在...原创 2019-09-21 20:42:35 · 233 阅读 · 0 评论 -
(2)从1开始写一个操作系统
第二章多任务的原理在开始写操作系统之前需要理解一个问题,一个cpu是如何做到“同时”做多个事情的,比如同一时间又亮灯又检测按键又串口输出。其实它不能,一个cpu在一个时间点只能执行一条指令,无法同时执行多个指令。但是从现象上看又确实是同时进行的,这是因为cpu执行指令比人类快很多,他在人类的一瞬间执行了多个指令,当然,这几个指令实现多个功能的时候就好像在这一瞬间这几个功能在同时执行。好...原创 2019-09-21 11:14:10 · 498 阅读 · 0 评论 -
(12)从1开始写一个操作系统
第十二章Shell移植命令行外壳(shell),提供一套供用户在命令行的操作接口,主要用于调试、查看系统信息。在大部分嵌入式系统中,一般开发调试都使用硬件调试器和printf日志打印,在有些情况下,这两种方式并不是那么好用。比如对于多任务系统,我们想知道某个时刻系统中的任务运行状态、手动控制系统状态。如果有一个shell,就可以输入命令,直接相应的函数执行获得需要的信息,或者控制程序的行为...原创 2019-09-23 19:25:46 · 414 阅读 · 0 评论