您的位置 首页 发布

uCOS-Ⅱ C51移植笔记

(1)实时系统和前后台系统;前后台系统:一个大循环,循环查询各种标志位。如果标志位置位,就执行相应的服务程序。标志位就是标志事件

(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、 C51中止中仓库的维护;

研讨中止中仓库的维护的含义在于,由于uCOS中的使命切换,自身便是模仿一次中止的产生:维护Task1的CPU寄存器,SP切换到Task2的仓库,弹出Task2的CPU寄存器。用C51写中止函数的时分,编译器会主动维护CPU的寄存器,所以中止回来时使命调度OSIntCtxSw(),就不必从头维护寄存器。

C51中止中调用函数能够分为四种状况(中止函数自身不设为reentrant):

一、没有函数调用;

二、调用非reentrant函数,函数中没有嵌套调用其他函数;

三、调用非reentrant函数,函数中嵌套调用其他函数;

四、调用reentrant函数。

t0_isr:

PUSH ACC

PUSH B

PUSH DPH

PUSH DPL

PUSH PSW

MOV PSW,#00H

PUSH AR0

PUSH AR1

PUSH AR2

PUSH AR3

PUSH AR4

PUSH AR5

PUSH AR6

PUSH AR7

用户代码

POP AR7

POP AR6

POP AR5

POP AR4

POP AR3

POP AR2

POP AR1

POP AR0

POP PSW

POP DPL

POP DPH

POP B

POP ACC

RETI

由于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、其他的移植;

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/261402.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部