uCOS-Ⅱ C51移植笔记

发布者:静逸心境最新更新时间:2016-01-12 来源: eefocus关键字:uCOS-Ⅱ  C51  移植笔记 手机看文章 扫描二维码
随时随地手机看文章
(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、其他的移植;

关键字:uCOS-Ⅱ  C51  移植笔记 引用地址:uCOS-Ⅱ C51移植笔记

上一篇:基于单片机的LCD1602显示秒表程序
下一篇:关于MCS-51单片机实现PWM的方法

推荐阅读最新更新时间:2024-03-16 14:43

MSP430F5438A单片机基于SPI的FatFs移植笔记(一)
怎么说呢……太费劲了,前面的博客还烂尾了,主要是觉得自己在调试的过程当中思维太混乱。虽然说自己挖的坑,含着泪也要填上,这几个就先不填了吧我重新开个坑把调通的说清楚。 不管移植什么程序,最重要的就是, 不要自以为是 一定要先查资料,花一周查资料,查到查不到为止,否则你编了一半的程序再参考别人的,直接后果是你下不了决心推翻重来 1. FatFs移植要点: 相信能看到这个博客的都知道FatFs是什么了,目前应该是0.11版本,我就不多废话了,一个开源的文件系统,不全面的说,作用就是让你编程序操作写SD卡的内容能够被PC机读出来(有不对的话懂的大神请指正) 它的好处就是只要写底层的几个硬件驱动函数就OK了,上层的函数都已经写好了,
[单片机]
MSP430F5438A单片机基于SPI的FatFs<font color='red'>移植</font><font color='red'>笔记</font>(一)
Keil C51单片机变量的使用方法详细介绍
引言 8051内核单片机是一种通用单片机,在国内占有较大的市场份额。在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功。由于51内核单片机的存储结构的特殊性,Keil C51中变量的使用与标准C有所不同。正确地使用变量,有利于获得高效的目标代码。下面详细介绍Keil C51中变量的使用方法。 1 CPU存储结构与变量的关系 变量都需要有存储空间,存储空间的不同使得变量使用时的工作效率也不同。 标准C的典型运行环境是8086(含IA-32系列)内核,其存储结构是CPU内部有寄存器,外部有存储器,寄存器的访问速度大大高于存储器的访问速度。在标准C中,不加特别定义的变量是放在存储器中的,使用register可以强制变量
[单片机]
Keil <font color='red'>C51</font>单片机变量的使用方法详细介绍
SAA3010红外解码(C51
/******************************************************************************************** * 功 能:红外解码。 * 硬件条件:1.CPU型号:AT89S52 * 2.晶振:12.000MHz * 3.用跳线帽短接P2.3__SI2 * 用跳线帽短接P2.2__RCK2 * 用跳线帽短接P2.1__SCK2 * 4.用跳线帽短接HW-IRQ__P3.2 * 5.欲完成本实验,还需另行准备一个遥控器,型号为SAA-3010T。
[单片机]
C51编程总结-单片机的奇怪知识2(Keil 编译器报错)
1:在C51 Keil 编译出现以下错误,error C249: 'DATA': SEGMENT TOO LARGE, error C249: 'DATA': SEGMENT TOO LARGE 解决办法:设置如下 2:在C51 Keil 编译出现警告:UNRESOLVED EXTERNAL SYMBOL *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: _DS1302_WRITE MODULE: .outputds1302.obj (DS1302) ADDRESS: 0A16H Program S
[单片机]
<font color='red'>C51</font>编程总结-单片机的奇怪知识2(Keil 编译器报错)
C51语言使用外部存储器的方法
简介:课本上学到的外部存储器操作基本上都是用汇编语言实现的,但是在实际工作中,大都用C语言编写单片机的程序,那么对外部存储器的操作就不仅仅是给一个普通变量赋值那样子了。 简单地说,注意两个方面: 软件部分: 1.添加头文件#include 2.在需要读写的地方用XBYTE就行,具体做法如下: 比如要访问0xA0B0这个地址(读数据):变量名=XBYTE 就行 反过来要给0xA0B0这个地址赋一个值(写数据):XBYTE =变量名 硬件部分: 硬件连接,将51单片机的P2口接外部存储器的高8位,P0口接数据并通过锁存器接外部存储器的低8位,锁存器的锁存端接51单片机的ALE, 51单片机的读写端要
[单片机]
C51单片机设计远程红外安防监控管理系统
  随着社会经济的发展和科学技术的进步,人们对办公场所的安全提出了更高的要求。特别对于企业而言,防火防盗更是必不可少的安全防范事件。针对传统的安防成本比较高、且实时性不强、集中管理控制困难、难以对安全隐患问题进行排查预警等情况; 现基于单片机技术和移动通信网络开发出一种实时、无线、便于管理、成本低廉的主动防护远程红外监控管理系统。   1 系统组成及功能   1.1 系统组成   整个系统主要由现场监控端、移动传输网络和监控中心三部分组成。现场监控端包括监控主机、传感器(包括红外传感器、烟雾传感器和门磁传感器)、摄像头和GPRS 通信模块。传输网络借由移动通信的GSM\\GPRS 网络,完成远程通信。监控中心由可靠的DCN
[单片机]
用<font color='red'>C51</font>单片机设计远程红外安防监控管理系统
电力行业,米尔STM32MP135开发板IEC61850协议移植笔记
1. 概述 IEC61850是变电站自动化系统(SAS)中通信系统和分散能源(DER)管理的国际标准。它通过标准的实现,实现了智能变电站的工程运作标准化。使得智能变电站的工程实施变得规范、统一和透明,在电力和储能系统中应用非常广泛。 本文基于米尔MYD-YF13X开发板,在Linux系统上移植和使用开源的libIEC61850库,该库提供了用C语言编写的IEC 61850 / MMS,IEC 61850 / GOOSE和IEC 61850-9-2 /采样值通信协议的服务端和客户端库。 2. 搭建配置环境 本章节讲述libIEC61850库的编译环境配置过程。 2.1. 安装JAVA环境 IEC61850库中
[嵌入式]
电力行业,米尔STM32MP135开发板IEC61850协议<font color='red'>移植</font><font color='red'>笔记</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved