(1)实时体系和前/后台体系;
前/后台体系:一个大循环,循环查询各种标志位。假如标志方位位,就履行相应的服务程序。标志位便是标志事情的产生,事情呼应延时处于不行猜测状况。最坏的状况是循环中所有其他的事情服务程序履行完,才呼应当时事情。中止服务虽然能即时/优先呼应,可是它们和主循环的通讯,也是经过置主循环中相应的标志位来完结的。
实时体系(uCOS):整个程序分红一个个看起来好象是并行的使命,每个使命都在等候事情的产生。除了最低优先级使命(在uCOS中是IDLE使命)是死循环以外,其他的使命都不能死循环,只能在驱动事情驱动下作业。任何驱动事情的产生,都使优先级最高的安排妥当使命运转。使命和使命/使命和中止的通讯,是经过相应事情驱动来完结的。
驱动事情:
不管是什么体系,CPU不行能一直在作业。CPU的作业是在各种驱动事情的驱动下作业的。CPU在完结一次驱动事情事情服务程序今后,进入IDLE形式等候新的驱动事情的产生。包括实时体系和前/后台体系都是在驱动事情的驱动下运转的。
依照uCOS中的观念,驱动事情分为三类:
1、事情 (Event)。包括信号量(Semaphores)、事情标志组(Flag)、邮箱(Message Box)、邮箱行列(Message Queue)。
2、时刻(Time Tick)。包括时刻延时和事情超时。
3、中止(Interrupt)。能够宣布各种event。
由于第1种事情,一般都是在第2、3种状况下宣布的,所以其实事情的驱动只需两种:时刻(守时)和中止(各种异步中止)。
时刻实际上也是中止的一种,能够说程序的驱动事情只需一种,便是:中止。
前/后台体系中还有一种驱动事情的产生,在主循环中不断的查询。有别与一般的守时查询,这种查询是为了将事情的呼应时刻降到最低,也能够将其概括于守时(时刻)事情。
(2)uCOS C51移植的预备作业;
2004年8月份,我在书城买了一本《uCOS-Ⅱ 第2版》,预备学习RTOS。由于曾经没有玩过RTOS,在作业之余时断时续的看了3、4章。一直到12月初的时分,公司要从头规划一个项目,刚好要把uCOS移植到c51上。我的RTOS学习才正式开端。
由于对OS神往以久,我并不想在网上Down一个现成的移植OS程序,做一个OS的运用者。揭开OS的奥秘面纱,了解OS的内部运转机制,这才是我想要做的。本文的首要意图是评论uCOS的移植,期望对行将进行uCOS c51移植的兄弟有些协助。关于OS的内部运转机制,由于东西比较多,在这儿不想太打开。假如今后有时刻,也想写一篇文章来评论评论。
最开端,我的方案便是看书,看《uCOS-Ⅱ 第2版》。看完这本几百页的大本本,花了我2个半星期。由于是作业需求,我才能够这样心安理得的在那里看呀看书^_^,辛苦呀L。在这期间,为了自己的思维不受他人的影响,我坚决没有从网上下任何uCOS的材料,我手头的材料便是uCOS-Ⅱ的书和顺便光盘,这些便是最威望的材料了。在看书的时分,我都坚持做笔记,把每天的要点,理解的东西和心中的疑问都随时记录下来。抵挡这种大本本,前后的常识又彼此相关,光靠咱们的大脑是搞不定啊。
弄懂了uCOS的内核,下一本书应该是《单片机高档言语C51Windows环境编程与运用》。关于Keil C我仍是很熟的,仍是花了2、3天来温习。这儿的要点是C51对汇编的转化结构,例于数据/体系仓库的运用,C&Asm混合编程。我想关于任何CPU的uCOS移植,C言语的完成机制,你都是要了解的。这儿也是要花大把时刻的。
《uCOS-Ⅱ 第2版》和《单片机高档言语C51Windows环境编程与运用》这两本书网上都能够下电子档的,我这儿也有(咱们需求能够来信讨取)。
uCOS和C51的书都看完了。我就下载了一堆uCOS的C51移植材料。其间的源程序有很多个版别的,不过具体的移植文档只需一个版别:巨龙一位大虾的“uCOS C51移植心得”,信任很多人都看过。这些材料的作者都是我移植进程中的教师,有了这些材料,我才能把心中的模糊主意变成源程序。可是我也发现这些材料中大多都有一些过错和遗失,当然这是不免的。这也正是唆使我写这篇文章的原因,期望在长辈的基础上有所前进。欢迎咱们来批判!
真实的源代码移植,我花了大约一个星期时刻。
(3)uCOS C51的移植概略;
1、东西:
uCOS 2.52版;
Keil C V6.23a。
2、uCOS V2.52的文件结构与移植所需求的修正:
A、与处理器无关的文件:
OS_CORE.C
OS_FLAG.C
OS_MBOX.C
OS_MEM.C
OS_MUTEX.C
OS_Q.C
OS_SEM.C
OS_TASK.C
OS_TIME.C
uCOS_II.C
uCOS_II.H
这些文件在c51的移植进程中,只需求给函数加上重入特点即可。
B、与运用相关的文件:
INCLUDES.H: 包括C51的规范库头文件;对”pdata”等c51要害字的重界说
OS_CFG.H: “OS_TICKS_PER_SEC”、“ OS_FLAGS”留意或许需求修正。
C、与处理器相关的文件:
OS_CPU.H: 数据类型、关中止办法、使命仓库方向、使命切换的宏界说都需求修正。
OS_CPU_A.ASM: OSTickISR()、OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()这几个函数的编写,是整个移植的要害。
OS_CPU_C.C:OSTaskStkInit()函数的编写。
(4)uCOS C51具体的移植进程;
1、C51的仓库结构;
这是整个移植进程中的重中之重,所以特别具体介绍。
A、
c51中,体系仓库的栈底地址是“?STACK”,栈顶指针便是“SP”拉,栈的成长方向是向上的,栈空间分配在51的内部RAM(idata)中。“?STACK”分配在所有内部RAM数据段的最后面,所以体系仓库的规模是从?STACK到内部RAM的最高位(0x80或许0xFF)。
B、
c51中,由于咱们运用OS,选用的LARGE编译形式,所以数据仓库的指针是“?C_XBP”,栈的成长方向是向下的,栈空间分配在51的外部RAM(xdata)中。
C、
研讨中止中仓库的维护的含义在于,由于uCOS中的使命切换,自身便是模仿一次中止的产生:维护Task1的CPU寄存器,SP切换到Task2的仓库,弹出Task2的CPU寄存器。用C51写中止函数的时分,编译器会主动维护CPU的寄存器,所以中止回来时使命调度OSIntCtxSw(),就不必从头维护寄存器。
C51中止中调用函数能够分为四种状况(中止函数自身不设为reentrant):
一、没有函数调用;
二、调用非reentrant函数,函数中没有嵌套调用其他函数;
三、调用非reentrant函数,函数中嵌套调用其他函数;
四、调用reentrant函数。
t0_isr:
POP
由于uCOS中所有的函数都必须是重入函数,因而咱们只需求研讨第四种状况下的仓库维护,关于其他状况有爱好能够在c51中看看。(留意:或许由于c51编译器的版别不同,上述压栈的次序或许不同。)
2、uCOS C51使命切换时的仓库操作;
每个使命都有一个独立的数据仓库,体系仓库是共用空间。
维护Task1的CPU寄存器:首先将CPU寄存器按上例压进Task1体系仓库,再将整个Task1体系仓库压进Task1数据仓库;
SP切换:?C_XBP = Task2 的数据仓库栈顶地址。
弹出Task2的CPU寄存器:从Task2的数据仓库从头康复整个体系仓库,然后再从Task2体系仓库中康复CPU寄存器值。
完成的办法有很多种,只需遵从uCOS使命切换的原理就能够了。
3、INCLUDES.H的移植;
4、OS_CPU.H的移植;
5、OS_CPU_A.ASM的移植;
6、OS_CPU_C.C的移植;
7、其他的移植;