small RTOS逐步分析(1)

small rtos 是陈明计先生根据51机器的特点,专门写的少内存专用rtos。源代码公开,支持抢占式切换,总是运行优先级最高的任务。中断嵌套可以255层。下面逐步分析这个专用的rtos。

首先,作者推荐了一种编程技巧,那就是专门写一个点H文件,把需要包含的内容和定义的内容都放在这个头文件里。例如。

/********************************/
/*     "以下为系统配置"           */
/********************************/
#pragma REGPARMS
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#define const code

#ifndef TRUE
#define TRUE  1
#endif

#ifndef FALSE
#define FALSE 0
#endif

像TRUE和FALSE这样的数值在程序中直接用文字代替。然后作者定义了几个头文件。例如:

/*     "操作系统定义"            */

#include "OS_CFG.H"
#include "OS_CPU.H"
#include "..\os\OS.H"
#include "..\os\OS_Q.h"
#include "..\os\OS_SEM.h"

这样把操作系统需要的所有的文件都包括在里面了。第三部分就是声明一些函数,自己要写的函数都放在这里。

以上说了作者推荐的写作技巧,和"config.h"的常用内容。

下面分项说说系统定义的这些头文件。

一、OS_CFG.H

      从名称可以猜出个大概,OS开头的是系统头文件。cfg是config的缩写。意思就是关于系统的配置头文件。实际就是small RTOS的配置文件。

二、OS_CPU.H

    这个头文件定义了一些与CPU有关的宏和常量。不同的cpu,宏和常量有可能不同,在做系统移植的时候要调整这个文件内容。

以上两条是config.h必须要包含的内容。先说OS_CFG.H

#define OS_MAX_TASKS            3           /* 最大任务数1~16                                           */
#define OS_TICKS_PER_SEC        10          /* 声明1秒系统系统节拍数                                    */
#define EN_USER_TICK_TIMER      0           /* 禁止(0)或允许(1)系统定时中断调用用户函数UserTickTimer()  */
#define EN_OS_INT_ENTER         1           /* 禁止(0)或允许(1)中断嵌套管理                             */
#define EN_TIMER_SHARING        1           /* 禁止(0)或允许(1)定时器中断调用OSTimeTick()               */
#define TICK_TIMER_SHARING      1           /* 定义进入多少次硬件中断为一次系统定时器软中断             */


#define EN_OS_Q                 0           /* 禁止(0)或允许(1)消息队列                                 */
#define EN_OS_Q_CHK             0           /* 禁止(0)或允许(1)校验消息队列指针                         */
#define OS_Q_MEM_SEL            xdata       /* 消息队列存储空间选择,keil c51有用,必须为idata、xdata   */
                                            /* 不是keil c51时它必须为空格                               */
#define EN_OS_Q_PENT            1           /* 禁止(0)或允许(1)等待队列中的消息                         */
#define EN_OS_Q_ACCEPT          0           /* 禁止(0)或允许(1)无等待的从队列中取得消息                 */
#define EN_OS_Q_POST            0           /* 禁止(0)或允许(1)FIFO方式向对列发送消息                   */
#define EN_OS_Q_POST_FRONT      1           /* 禁止(0)或允许(1)LIFO方式向对列发送消息                   */
#define EN_OS_Q_INT_POST        0           /* 禁止(0)或允许(1)中断中FIFO方式相对列发送消息             */
#define EN_OS_Q_INT_POST_FRONT  1           /* 禁止(0)或允许(1)中断中LIFO方式相对列发送消息             */
#define EN_OS_Q_NMsgs           1           /* 禁止(0)或允许(1)取得队列中消息数                         */
#define EN_OS_Q_SIZE            0           /* 禁止(0)或允许(1)取得队列总容量                           */
#define EN_OS_Q_FLUSH           0           /* 禁止(0)或允许(1)清空队列                                 */

#define EN_OS_SEM               0           /* 禁止(0)或允许(1)信号量                                   */
#define EN_OS_SEM_CHK           0           /* 禁止(0)或允许(1)校验信号量索引                           */
#define OS_SEM_MEM_SEL          idata       /* 信号量储空间选择,keil c51有用,必须为idata、xdata       */
                                            /* 不是keil c51时它必须为空格                               */
#define OS_MAX_SEMS             2           /* 最大信号量数目                                           */
#define EN_OS_SEM_PENT          1           /* 禁止(0)或允许(1)等待信号量                               */
#define EN_OS_SEM_ACCEPT        0           /* 禁止(0)或允许(1)无等待请求信号量                         */
#define EN_OS_SEM_INT_POST      0           /* 禁止(0)或允许(1)中断中发送信号量                         */
#define EN_OS_SEM_POST          1           /* 禁止(0)或允许(1)中发送信号量                             */
#define EN_OS_SEM_QUERY         0           /* 禁止(0)或允许(1)查询信号量                               */


if EN_TIMER_SHARING == 0
#define TIME_ISR_TASK_ID     SHOW_TASK_ID   /* 定义系统定时器软中断触发的任务ID                         */
#endif


#ifdef IN_OS_CPU_C 
#if EN_USER_TICK_TIMER > 0
extern void UserTickTimer(void);            /* 系统定时中断中调用的用户函数                                */
#endif
#endif

这是OS_CFG.H的全部内容。这些内容陈明计先生在注释里写得非常清楚了,就不逐个讲解了。

再说第二个OS_CPU.H

#ifdef __C51__

typedef unsigned char  uint8;         /* 定义可移植的无符号8位整数关键字  */
typedef signed   char  int8;          /* 定义可移植的有符号8位整数关键字  */
typedef unsigned int   uint16;        /* 定义可移植的无符号16位整数关键字 */
typedef signed   int   int16;         /* 定义可移植的有符号16位整数关键字 */
typedef unsigned long  uint32;        /* 定义可移植的无符号32位整数关键字 */
typedef signed   long  int32;         /* 定义可移植的有符号32位整数关键字  /

#ifndef NULL
#define NULL 0
#endif

为了编程方便和为了跟标准C配套,定义了一些常用的数据类型。用来保证移植性,当然作者是为了适应大部分使用者来写的,每个人可以根据自己实际的的编译器重新定义。

OS_CPU.H中还定义了一些宏,留待第二个内容讲解。

Small RTOS(51) 1.20.3v 说明文件 编写动机: 就像在嵌入系统中使用C语言替代汇编一样,在嵌入系统中使用RTOS是大势所趋。原因主要是现在在大多数情况下编程效率比执行效率重要(单片机便宜嘛)。但纵观51RTOS,keil c51 所带的RTX Full 太大(6k多),且需要外部ram,又无源代码,很多时候不实用。RTX Tiny虽然小(900多字节),但是任务没有优先级和中断管理,也无源代码,也不太实用。而ucosII虽有源代码,但是它太大,又需要外部ram,所有函数又必须是重入函数,用在51这类小片内RAM的单片机上有点勉强。于是,我借鉴ucosII和RTX Tiny编写了Small RTOS 51,虽然它为51系列编写,但是它还是比较容易移植到其它CPU上。 与作者联系方法: 可以给[email protected](原chenmingji@163.net)写信,或是在www.zlgmcu.com.cn上的论坛ARM与ucosII区提问(目前本人是版主)或是在www.c51bbs.com的论坛上提问(不推荐。c51bbs和21ic网名均为cmj)。 版本号定义方式: a.bc.d a:主版本号,一般重大改变时改变它。 bc:次便本号,一般功能增加时改变它。 d:同一版本的修订序号。 版本升级: 1.20.3版 2004年6月8日 修正Os_q.c的一个BUG,造成FIFO发送数据时,在队列中有大量数据且队列较大时,可能会出错。 1.20.2版 2004年2月4日 修正for Keil c51的Os_cpu_c.c的StkDelB函数的BUG,它会影响任务删除的正确执行。 1.20.1版 2004年2月4日 修改OSWait(K_SIG | K_TMO, x) 只能通过信号唤醒的bug。 1.20.0版 2003年8月3日 支持任务动态建立与删除。函数功能向一般的RTOS靠拢。支持C51的重入函数(用关键字reentrant定义的函数)。支持动态内存分配(使用动态内存分配的任务必须使用重入栈)。 1.12.1版 2003年2月5日 修正OS_MAX_TASKS为8、16时的bug。同时修正一些小bug。 1.12.0版 2003年1月24日 OS_MAX_TASKS就是用户任务数量。同时修正一些小bug。 1.11.0版 2002年12月2日 各个任务具有自己的关中断计数器,不在互相影响(这意味着如果一个任务在任务放弃CPU前关了中断,当它再次进入运行态时中断还是关的)。优先级最低的任务作为系统保留任务不再需要用户编写,同时节约一些内存。增加一些注释。更正在Keil C51下Memory Model为非Small 模式的Bug。 1.10.5版 2002年10月26日 更正许多小Bug。 1.10.4版 2002年10月6日 合并Os_cpu_a.asm和OS_CPU_A_task16.ASM。统一了一下代码风格 1.10.3版 2002年9月16日 修改了Os_cpu_a.asm和OS_CPU_A_task16.ASM的LoadCtx代码使之执行更快,代码更小 1.10.2版 2002年9月9日 更正OSWait()的Bug,在极端情况下,这个Bug可能造成可能锁死任务。 修改OSQIntPost()的Keil C51特殊代码,它会造成阅读障碍。 1.10.1版 2002年9月4日 更正OSTimeTick的Bug,它在keil c51中不会有问题,但移植的其它系统可能出错。 1.10版 2002年9月1日 增加Small RTOS 对消息队列(简化的)和信号量的支持;改变了开关中断的方式;增加可移植的变量定义;修正一些Bug。 1.00版 2002年6月20日 使用户可以进行更多的配置,可以禁止中断管理,51系列支持软的非屏蔽中断,并调整目录结构等. 0.60版 2002年5月10日 修改OS_CORE.c使之在keil c51可以重入。不再需要禁止覆盖分析。 0.52版
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值