免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 55060 | 回复: 1
打印 上一主题 下一主题

手把手教你写单片机RTOS 第一章&&第二章 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-23 03:25 |只看该作者 |倒序浏览

第一章 开发缘由

一直以来想亲手写出一个小型实时操作系统来,起初编程功力不够,且对操作系统原理了解甚少,所以迟迟没能实现。此后笔者抽出大量时间来研究邵贝贝那本uCOSII,多次试验代码,逐渐从中屡出一条可行的自行设计RTOS路线,于是整理下来,读者感兴趣的话可以跟着本书实验一步一步练下去,这样您在不知不觉中已经学会编写RTOS原理并最终写出属于你的RTOS来,这样才能真正体现出本文的价值。

此文将围绕大家最熟悉的51单片机平台展开整个RTOS内核的开发工作,意在让读者彻底学会如何写RTOS,降低RTOS在读者心中的难度。另外,该书所有代码均在Cool 51单片机开发板上调试通过,目前该RTOS支持51AVRSTM8S三种平台,并最终更名为RaySRTOS(光芒操作系统)。代码可以在http://im.blog.chinaunix.net上获取。若有问题可联系作者(光芒电子),或者加入QQ139218853详细讨论。

第二章 RTOS基础知识

2.1什么是RTOS

打个比方,若是单片机不跑RTOS,用主循环+中断处理程序完成功能(前后台系统),就好比老板一人开了一家公司,老板一人负责“研发”、“销售”、“售后”三种工作(任务)。比如老板正在搞研发,突然来客户了,老板就要暂停研发转而去搞“销售”,销售完后再回来继续研发(把销售看成一种中断)。那比如客户买的产品出了问题,那老板得暂停研发去做售后(售后是另一种中断)。问题就出来了,老板一个人始终无法同时顾及研发、销售、售后三个工作,导致公司运营不佳。这里读者们想到了,可以多顾几名员工啊?说对了,单片机跑RTOS就是相当于开公司多了很多员工。RTOS就是一个可以将单片机扩展成多个“相对独立小任务”的平台,老板可以顾3名员工,让3个员工分别负责“研发”、“销售”、“售后”三个工作,老板的工作就是负责将3名员工各自的任务分配好即可。

各个“相对独立小任务”宏观上来看是同时执行的,这是RTOS一个显著特点,可能有人要问“只有一个CPU,怎么能做到同时执行多个代码呢?”巧妙之处就在这里,RTOS在微观上是在各个“相对独立小任务”之间快速切换的,切换速度快到宏观上感觉小任务是同时运行的。这个“切换速度”,就是RTOS里边所说的系统节拍。

怎么理解“相对独立小任务”中“独立”二字呢?独立的意思就是各个小任务之间的执行过程是相对独立的,互不干扰。3名员工的工作是各不相同的,各执其责的。但为何要“相对独立”呢?比方搞研发的员工没有开发出产品,那么销售就没东西可卖,售后也相应没事儿做了,要想整体运行正确,则各个任务必须协调好,互相汇报进度。这就是RTOS中的任务间通信概念。

这三名员工的工作其实是有轻重缓急之分的。前期搞研发的优先级最高,搞出产品后销售就是主角了,销售完后呢?售后就要做的更好。要想经营好整个公司,老板就要决定哪个员工何时该抓点紧,哪个员工工作可以放慢些,总也有个任务分配策略。这个分配策略,就是RTOS中的调度算法。

相信读者对RTOS有个简单的概念了吧。RTOS从功能上是将单片机单一的执行结构扩展成了多个“相对独立小任务”。从开发角度上由原来的“主循环+中断处理程序”思想扩展成了“编写N个执行任务”思想。为我们开发复杂多任务程序提供了便利。


2.2 RTOS的优点与缺点

2.2.1 RTOS优点

1提高开发效率

RTOS使单片机开发多任务程序变得简单直观,用户只关心任务分配即可,比如我们要做一个电子时钟的程序,完全可以把“数码管刷新”、“秒计时”、“按键检测“、”调节时间程序”分为4个任务,这样程序会编写容易而且维护方便。

2运行效率高

我们平时编程用到延时是很常见的,在RTOS里面延时OS_Delay()和普通程序的Delay()是完全不一样的。普通的程序延时仅仅是CPU执行循环代码,是不是感觉做了很多无用功?在RTOS里边,延时其实是主动将CPU让给其他任务代码,等到延时时间一到,再将CPU“拽”回来。

3移植方便

各种平台之间程序大体风格是不变的,得益于RTOS的标准框架,使得程序整体代码风格趋于一致化,这将使程序移植变得简单可靠。

2.2.2 RTOS缺点

1需要占用额外的资源

单片机使用RTOS,由于要在各个任务代码之间进行快速切换,以达到“同时”运行的目的,执行调度函数最增加CPU负荷。

2使单片机中断响应变差

一般微型RTOS在切换任务时候需要关闭系统总中断,否则会错误的操作堆栈,这段时间是不响应任何中断的。从而使单片机在中断响应上要慢一些。

 

2.3单片机跑RTOS有必要吗?

这估计是爱好者们争论最多的了,既然看到了RTOS的利与弊,我们应当正确对待RTOS在单片机开发中的位置。

因为RTOS需要单片机提供额外的RAM ROM运行,并且会增加一些CPU负荷,如果一个单片机在项目上有很大余量,那么可以选择使用RTOS来做。如果单片机本身资源就很紧张,那就得不偿失了,不仅RTOS跑不起来,连基本功能代码都放不下了。

本文要在51上写一个小型RTOS,主要为了学习RTOS原理用,以后读者从51编程转ARM学习会容易很多。笔者曾将该RTOS移植在AVRSTM8上,占用200B ram 1KB rom,运行良好。

2.4 RTOS的一些基本概念

2.4.1 任务(TASK)

任务(Task)是RTOS中最重要的操作对象,每个任务在RTOS调用下由CPU分时运行。

2.4.2 调度(Sched)

调度是RTOS的核心,调度就是RTOS使CPU在各个任务之间进行切换,达到宏观上同时执行的效果,调度也称为“上下文切换”。

2.4.3 抢占和协作

21ic上有一个经典例子比喻,“你(小工)在用厕所,经理在外面排第一,老板在外面排第二。如果是前后台,不管是谁,都必须按排队的次序使用厕所;如果是协作式,那么可以等你用完厕所,老板就要比经理先进入;如果是占先式,只要有更高级的人在外面等,那么厕所里无论是谁,都要第一时间让出来,让最高级别的人先用。”

2.4.4 系统节拍

RTOS调度时候是一直在各个TASK之间切换的,切换的快慢就是系统节拍,如果系统节拍是100Hz,那么每秒TASK会被RTOS切换100次(不算主动切换次数)。

2.4.5 中断级调度和任务级调度

中断级调度就是由系统节拍引起的被动的调度,在当前执行任务即使还未释放CPU时也会发生的。任务级调度是任务主动去释放CPU而发生的调度。

2.4.6 任务堆栈

每个任务(TASK)执行都有自己的一个任务堆栈,存放着自己的入口,各个寄存器值、中间执行结果等。各个任务的任务环境都是独立私有的,互不干扰。比如TASK1有自己的堆栈Task1Stack[20]TASK2有自己的堆栈Task2Stack[20],两个堆栈内容是不一样的。

RTOS基本术语还有很多,就不一一罗列了,笔者尽量用简练的语言来让读者学会单片机RTOS的概念,争取也写出自己的RTOS

论坛徽章:
0
2 [报告]
发表于 2018-06-28 14:27 |只看该作者
nkjjkgkljhl
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP