如何学习一个嵌入式系统?学这些精髓!
时间:2021-10-13 14:09:13
手机看文章
扫描二维码
随时随地手机看文章
[导读]关注「Linux大陆」,一起进步!这个是在网上看到的一篇文档,作者的目的是设计一个简单的嵌入式操作系统,只实现一个基本任务调度器的功能。正如作者所说,虽然不能称为操作系统,但已体现了小型嵌入式操作系统的精髓。对于我们来说是很好的学习资料,可以从中一窥操作系统的面目,今天分享给大家...
关注「Linux大陆」,一起进步! 这个是在网上看到的一篇文档,作者的目的是设计一个简单的嵌入式操作系统,只实现一个基本任务调度器的功能。正如作者所说,虽然不能称为操作系统,但已体现了小型嵌入式操作系统的精髓。对于我们来说是很好的学习资料,可以从中一窥操作系统的面目,今天分享给大家。
多任务机制
其实在单一CPU 的情况下,是不存在真正的多任务机制的,存在的只有不同的任务轮流使用CPU,所以本质上还是单任务的。但由于CPU执行速度非常快,加上任务切换十分频繁并且切换的很快,所以我们感觉好像有很多任务同时在运行一样。这就是所谓的多任务机制
。实时系统的特征是延时可预测,能够在一个规定的时间内(通常是 ms 级别的)对某些信号做出反应。任务的状态
任务有下面的特性:任务并不是随时都可以运行的,而一个已经运行的任务并不能保证一直占有 CPU 直到运行完。一般有就绪态,运行态,挂起态等。- 运行态:一个运行态的任务是一个正在使用 CPU 的任务。任何时刻有且只有一个运行着的任务。
- 就绪态:一个就绪态任务是可运行的,等待占有 CPU 的任务释放 CPU。
- 挂起态:某些条件不满足而挂起不能运行的状态。
如何转化为就绪态
INT32U OSRdyTbl; /* 就绪任务表 */
上面定义一个 32 位变量,每一位代表一个任务,0 表示挂起状态,1 表示就绪状态。它记录了各任务的就绪与否状态,称它为 就绪表
。OSRdyTbl 定义为 32 位变量,对应32 个任务。当然,定义为 64 位的话,便最多能支持 64 个任务。这样,可以定义两个宏,实现把任务的状态变为就绪或挂起态。/* 在就绪表中登记就绪任务 */
#define OSSetPrioRdy(prio) { OSRdyTbl |= 0x01/把相应位置1
/* 从就绪表中删除任务 */
#define OSDelPrioRdy(prio) { OSRdyTbl