打印

裸奔式实时操作系统HotTask51

[复制链接]
4091|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
洪七公|  楼主 | 2009-2-9 09:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*--------------------------------------------------------------------------
  伪本征函数——Keil C51头文件INTRINS.H的扩容工程(V4.01)
根据HotPower的“同名小说《Keil C51红杏出墙记》”改编
最初建立时间: 2003.03.08 
最近修改时间: 2009.02.08
修 改 原  因: 支持Keil C51工程多文件系统,避免重复定义汇编数组问题.
              支持裸奔式实时操作系统HotTask51。
应        用: _reset_();//软件复位
              _start_();//启动时执行2次RETI
void EIntISR0() interrupt IE0_VECTOR using 0
{
    _intjmp_(EIntHide0);//中断隐身函数    
}

void EIntHide0() using 0//reentrant
{
//
}
说        明: 一般宏不需添加HotIns.C,只需HotIns.H文件即可.
              涉及汇编数组的宏如_start_()需要再添加HotIns.C文件.
菜农HotPower@126.com 2008.11.19 于西安大雁塔村大队部
--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------
本文件名: HotIns.H
---------------------------------------------------------------------------*/
#ifndef __HotIns_H__
#define __HotIns_H__


/*------------------------------------------------------------------------*/
#define _setc_()          CY   = 1
#define _clrc_()          CY   = 0
/*------------------------------------------------------------------------*/
#define _setb_(RBIT)      RBIT = 1
#define _clrb_(RBIT)      RBIT = 0
/*------------------------------------------------------------------------*/
#define _clra_()          ACC  = 0
/*------------------------------------------------------------------------*/
#define _xorr_(RX)        RX  ^= RX                  //用于取奇偶位P,且RX=0
#define _andr_(RX)        RX  &= RX                  //用于取奇偶位P,且RX=不变
#define _orr_(RX)         RX  |= RX                  //用于取奇偶位P,且RX=不变
#define _notr_(RX)        RX   =~RX 
/*------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------------------
伪本征函数——Keil C51头文件INTRINS.H的扩容工程(第二版)头文件HotIns.H扩充部分
--------------------------------------------------------------------------------------------*/

/*------------------------------------------------------------------------------------------*/
#define _rrca_()          CY   = ACC & 0x01           //装载代码RRC A
#define _rlca_()          CY   = ACC & 0x80           //装载代码RLC A
/*------------------------------------------------------------------------------------------*/
#define _rrcr_(RX)        CY   = RX  & 0x01; RX = ACC //装载代码RRC RX
#define _rlcr_(RX)        CY   = RX  & 0x80; RX = ACC //装载代码RLC RX
/*------------------------------------------------------------------------------------------*/
#define _movra_(RX)       RX   = ACC
#define _movar_(RX)       ACC  = RX
/*------------------------------------------------------------------------------------------*/
#define _movcb_(RBIT)     CY   = RBIT
#define _movbc_(RBIT)     RBIT = CY
/*------------------------------------------------------------------------------------------*/
#define _movb0_(RBIT, RX) RBIT = RX  & 0x01           //用于取RX的最低位
#define _movb7_(RBIT, RX) RBIT = RX  & 0x80           //用于取RX的最高位
/*------------------------------------------------------------------------------------------*/
#define _movc0_(RX)       CY   = RX  & 0x01
#define _movc7_(RX)       CY   = RX  & 0x80
/*------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------
伪本征函数——Keil C51头文件INTRINS.H的扩容工程(第三版)头文件HotIns.H扩充部分   2004.6.8
--------------------------------------------------------------------------------------------*/

/*------------------------------------------------------------------------------------------*/
#define _icall_(ADDR)  (*(void (*)())((void *)ADDR))();//通用直接或间接调用函数_icall_()声明
/*------------------------------------------------------------------------------------------*/

/*------------------------------------------------------------------------------------------*/
#define _db_(TABNAME, TAB) code unsigned char TABNAME[]={TAB}//装载数据或代码_db_()声明
/*------------------------------------------------------------------------------------------*/

/*------------------------------------------------------------------------------------------*/
sfr16 DPTR     = 0x82;//声明C51标准的16位寄存器DPTR, 以便实现汇编级的命令跳转
/*-------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------
            以下宏定义的引用必须在当前工程中添加HotIns.c文件
---------------------------------------------------------------------------------------------*/
#define _lcall_(ADDR) DPTR = ADDR;_icall_(__ljmp_code__ + 4);//直接调用函数_lcall_()声明
#define _ljmp_(ADDR)  DPTR = ADDR;_icall_(__ljmp_code__);     //直接跳转函数_ljmp_()声明
extern code unsigned char __ljmp_code__[];//汇编数组
/*以下移入HotIns.c文件
#ifndef __ljmp__code__
  #define __ljmp__code__
  _db_(__ljmp_code__, "x15x81x15x81xc0x82xc0x83x22");         //装载数据DB 0x15..0x22
#endif
*/
/*--------------------------------------------------------------------------------------------
装载代码   __ljmp_code__:  DEC   SP;//_ljmp_()函数入口,调整SP以免程序崩溃
                           DEC   SP
                           PUSH  DPL;//_lcall_()函数入口
                           PUSH  DPH
                             RET
--------------------------------------------------------------------------------------------*/

/*------------------------------------------------------------------------------------------*/
#define _intjmp_(ADDR) DPTR = ADDR;_icall_(__reset_code__); //中断隐身函数_intjmp_()声明
#define _reset_() DPTR = __reset_code__ + 5;_icall_(__reset_code__); //软复位函数_reset_()声明
#define _start_() _icall_(__reset_code__ + 4);_icall_(__reset_code__ + 4); //软启动函数_start_()声明
extern code unsigned char __reset_code__[];//汇编数组
/*以下移入HotIns.c文件
#ifndef __reset__code__
  #define __reset__code__
  _db_(__reset_code__, "xc0x82xc0x83x32xe4xc0xe0xc0xe0x32");//装载数据DB 0xc0..0x32
#endif
*/
/*--------------------------------------------------------------------------------------------
装载代码   __reset_code__: PUSH  DPL;//非典的软复位函数入口(执行2次RETI)
                           PUSH  DPH
                             RETI;//_intjmp_()函数调用到此为止中断退出并跳入子程序隐身(让出中断)
                           CLR   A;//经典的软复位函数入口(执行1次RETI)
                           PUSH  ACC
                           PUSH  ACC
                           RETI;//_reset_()函数调用从此处跳入0x0000开始执行
--------------------------------------------------------------------------------------------*/
#define _daa_() _icall_(__daa_code__)                             //十进制调整函数_daa_()声明
/*------------------------------------------------------------------------------------------*/
extern code unsigned char __daa_code__[];//汇编数组
/*以下移入HotIns.c文件
#ifndef __daa__code__
  #define __daa__code__
  _db_(__daa_code__, "xd4x22");                                   //装载数据DB 0xd4,0x22
#endif
*/
/*--------------------------------------------------------------------------------------------
装载代码   __daa_code__:   DA      A
                             RET
--------------------------------------------------------------------------------------------*/

/*------------------------------------------------------------------------------------------*/
#define _swapr_(RX) ACC = RX; _swapa_(); RX = ACC;        //变  量半字节交换函数_swapr_()声明
#define _swapa_() _icall_(__swapa_code__);                //累加器半字节交换函数_swapa_()声明
extern code unsigned char __swapa_code__[];//汇编数组
/*以下移入HotIns.c文件
#ifndef __swapa__code__
  #define __swapa__code__
  _db_(__swapa_code__, "xc4x22");                                      //装载数据DB 0xc4,0x22
#endif
*/
/*--------------------------------------------------------------------------------------------
装载代码  __swapa_code__:  SWAP  A
                           RET
--------------------------------------------------------------------------------------------*/
#endif

相关帖子

沙发
洪七公|  楼主 | 2009-2-9 09:42 | 只看该作者

HotIns.c(V4.1)

/*--------------------------------------------------------------------------
  伪本征函数——Keil C51头文件INTRINS.H的扩容工程     第四版
根据HotPower的“同名小说《Keil C51红杏出墙记》”改编
最初建立时间: 2003.03.08 
最近修改时间: 2009.02.08
修 改 原  因: 支持Keil C51工程多文件系统,避免重复定义汇编数组问题.
              支持裸奔式实时操作系统HotTask51。
菜农HotPower@126.com 于西安大雁塔村大队部
--------------------------------------------------------------------------*/
#include "hotins.h"

#ifndef __ljmp__code__
  #define __ljmp__code__
  _db_(__ljmp_code__, "x15x81x15x81xc0x82xc0x83x22");//装载数据DB 0x15..0x22
#endif
/*--------------------------------------------------------------------------------------------
装载代码   __ljmp_code__:  DEC   SP;//_ljmp_()函数入口,调整SP以免程序崩溃
                           DEC   SP
                           PUSH  DPL;//_lcall_()函数入口
                           PUSH  DPH
                             RET
--------------------------------------------------------------------------------------------*/

#ifndef __reset__code__
  #define __reset__code__
  _db_(__reset_code__, "xc0x82xc0x83x32xe4xc0xe0xc0xe0x32");//装载数据DB 0xc0..0x32
#endif
/*--------------------------------------------------------------------------------------------
装载代码   __reset_code__: PUSH  DPL;//非典的软复位函数入口(执行2次RETI)
                           PUSH  DPH
                             RETI;//_intjmp_()函数调用到此为止中断退出并跳入子程序隐身(让出中断)
                           CLR   A;//经典的软复位函数入口(执行1次RETI)
                           PUSH  ACC
                           PUSH  ACC
                           RETI;//_reset_()函数调用从此处跳入0x0000开始执行
--------------------------------------------------------------------------------------------*/

#ifndef __daa__code__
  #define __daa__code__
  _db_(__daa_code__, "xd4x22");                                   //装载数据DB 0xd4,0x22
#endif
/*--------------------------------------------------------------------------------------------
装载代码   __daa_code__:   DA      A
                             RET
--------------------------------------------------------------------------------------------*/

#ifndef __swapa__code__
  #define __swapa__code__
  _db_(__swapa_code__, "xc4x22");                                      //装载数据DB 0xc4,0x22
#endif
/*--------------------------------------------------------------------------------------------
装载代码  __swapa_code__:  SWAP  A
                           RET
--------------------------------------------------------------------------------------------*/

使用特权

评论回复
板凳
洪七公|  楼主 | 2009-2-9 09:44 | 只看该作者

"中断隐身"之探讨

Keil C51红杏出墙记之精华-中断隐身

“中断隐身”是俺瞎起的名词,它实际就是OS的思想---将中断降级。
这样就可让同级别的中断执行,自身降级后又高于用户级别如主函数内的主循环。

它实际是个特殊的前后台程序,不过和一般裸奔的前后台程序有着本质的不同。

它是每个前台中断程序都自动携带一个后台程序,而非多前台单后台系统。
即它是一个多前台多后台系统。

HotIns内有6个毒性很深的“函数”,有:
1.软复位函数_reset_()
2.软启动函数_start_()
3.中断隐身函数_intjmp_()
4.直接调用函数_lcall_()
5.直接跳转函数_ljmp_()
6.通用直接或间接调用函数_icall_()

说明及用法如下:
1.软复位函数_reset_()
主要起软件复位作用,和C的函数指针为0一样。
它和好处是代码简洁高效并复用,同时也为硬件看门狗的检测提供服务。

2.软启动函数_start_()
主要起软硬件复位后,执行2次RETI开放51特有的“中断优先级隐身门”。
在汇编时常用,但在C函数上很难实现,因为几乎任何的C编译器都不允许
普通函数调用中断函数。

HotIns早已考虑了软件抗干扰的问题,这是几乎99.99%的C人不会考虑的问题。

3.中断隐身函数_intjmp_()
主要起中断级别降低作用,实际在汇编中可以用一句lcall (reti指令的地址)
这样lcall后降级为用户级,故同级中断得以执行而不被锁死
(51只有高低两级,可同级多个中断程序)
本“函数”是HotIns的精华之精华,故HotIns别名为“红杏出墙记”节选。
它也是“红杏系列”的支柱。如HotTask51就是以它为核心实现“裸奔式”的OS.

4.直接调用函数_lcall_()
它可以“胡作非为”地在C函数中直接调用的任何指令地址为“函数入口地址”。
它奠定了HotTask51肯定不同于一般的OS~~~

5.直接跳转函数_ljmp_()
它可以“胡作非为”地在C函数中直接跳转的任何指令地址为“程序散转地址”。

它奠定了HotTask51肯定不同于一般的OS~~~

6.通用直接或间接调用函数_icall_()
它为HotIns的“桥梁函数”,也可为用户“胡作非为”提供方便~~~

转帖需声明菜地http://blog.**/hotpower/,谢谢合作!

菜农HotPower@126.com 2009.2.8 于西安大雁塔菜地


相关链接:http://blog.**/hotpower/197969/message.aspx

使用特权

评论回复
地板
McuIsp| | 2009-2-9 09:49 | 只看该作者

好东西,顶!

使用特权

评论回复
5
yewuyi| | 2009-2-9 09:56 | 只看该作者

典型的HOTPOWER作风。。。

怎么不是马甲?

使用特权

评论回复
6
洪七公|  楼主 | 2009-2-9 10:10 | 只看该作者
7
洪七公|  楼主 | 2009-2-9 10:15 | 只看该作者

main.c/h

#include "main.h"

void main()
{
    IE = 0;//关中断
    PSW = 0;
    _start_();//启动时执行2次RETI
    TaskInit();//任务初始化
    TaskStart();//任务开始
}

//main.h
#include <regx52.h>
#include <absacc.h>
#include <REGX52.H>
#include <intrins.h>

#ifndef __Main_H__
#define __Main_H__

#include "interrupt.h"
#include "hotins.h"
#include "hottask.h"
#include "delay.h"
#include "target.h"
#include "task.h"

#endif

使用特权

评论回复
8
洪七公|  楼主 | 2009-2-9 10:17 | 只看该作者

关于系统安全问题

待续

使用特权

评论回复
9
hotpower| | 2009-2-9 14:52 | 只看该作者

裸奔式实时操作系统HotTask51开工

别名:

迷踪式实时操作系统HotTask51
非典式实时操作系统HotTask51

使用特权

评论回复
10
古道热肠| | 2009-2-9 15:50 | 只看该作者

有意思,最好打个包,带上Demo项目

使用特权

评论回复
11
洪七公|  楼主 | 2009-2-9 16:29 | 只看该作者

哈哈~~~未经HotPower的同意俺不能做主~~~

使用特权

评论回复
12
平常人| | 2009-2-9 16:36 | 只看该作者

难道洪七公也学会左右互搏之术?

谁教的?

使用特权

评论回复
13
洪七公|  楼主 | 2009-2-9 16:40 | 只看该作者

周伯通~~~

使用特权

评论回复
14
HotTask51| | 2009-2-11 09:53 | 只看该作者

哈哈~~~开工了~~~

使用特权

评论回复
15
xwj| | 2009-2-11 10:02 | 只看该作者

呵呵,恭喜!

老hot的马甲、FANS真多啊~~~

使用特权

评论回复
16
齐鲁青未了| | 2009-2-11 10:53 | 只看该作者

高人,面目也多,哈哈

使用特权

评论回复
17
HotTask51| | 2009-2-11 11:21 | 只看该作者

晕!!!洪七公穿上红马甲俺不服~~~哈哈~~~灌水积分创“前

使用特权

评论回复
18
airwill| | 2009-2-11 11:44 | 只看该作者

这个贴的标题, 看着咋这么别扭

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

245

帖子

0

粉丝