打印

(原创)--也说OS,简易实时任务切换块Cy_OS---针对8051(一起学习)

[复制链接]
2937|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
walnutcy|  楼主 | 2007-1-11 15:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
walnutcy的个人版简易实时操作系统Cy_OS------针对8051系列MCU
目前最新版本:Version 1.03

/// 闲了两天,
/// 就心血来潮就写了一个小的实时调度程序,
/// 以便于支持中断,且减少汇编代码的量,,
/// 同时给大家演示了一下不使用interrupt实现C中断的方式
/// 因为我不喜欢写汇编程序,不是不会写,觉得移植起来不爽,,
/// 最近对CPU架构感兴趣,正在研究Microchip的pic18系列,当然也
/// 只是针对其中一款学习,,因为毕竟买IC也要money嘛,,
/// 我一般喜欢拿插装的IC,可以自己焊一个小的简易平台,,这样学起来更有感觉,,
/// 
///
///这里使用STC的IC,并不是因为他好,而是因为我手头上只有他的东西,,
///这款IC不怎么好,也不是太坏,还算是可以用吧,,
///不过宏晶的服务可就差太远啦..
///因为还未量产过的IC,所以总是存在一些问题,本来没问题,
///他们一改动出新版,就出了不少问题,
///如果各位同仁想用,可以考虑采用别的IC来测试Cy_OS,只是可能会将遥控
///解码会移植一下,

///东西早就写好啦,一直没把文档写好,所以一直没发,,
///愿大家给个好的提议,,我们一起来学习实时操作系统....

// 自身特点:
//     支持实时中断,
//     自建中断向量列表,,不使用Keil C51中的interrupt关键字,
//     针对8051实现,,
///    
///------------2007-1-11-15:50

///六楼的那个好像可以下,....


Version : 1.03
环境:
    MCU采用STC(宏晶科技)的STC12LE4052AD,256 RAM,4K Flash,具有串口ISP功能。
    P1_4引脚上外挂一个发光LED,利用三级管驱动;
    P3_5引脚上外挂一个遥控接收头;
    串口接到PC的串口上;
功能:
    1) 去掉中断函数关键字:interrupt,并在进入中断后加入压栈、出栈代码;
    2) 可以采用捕获功能解码遥控按键;
    3) 串口向外发送数据,BaudRate:19200;
    4) 增加一个简历的操作系统OS,具有任务创建,任务切换,消息唤醒,
    5) 版本查询        
    6) 增加OS的功能:任务删除,资源申请、释放,任务的动态新建:
        测试:从串口发送数据测试,在Task_LED1、Task_LED2之间相互切换;
新增功能:
    7) 在中断中做任务切换;(主要是调整中断时的堆栈结构)
    
缺陷:  (可能考虑完善的,不准备完善的不提)
    1) 串口发送过程中不允许任务切换;
    2) 由于8051系列MCU的SP指针是8位的,堆栈大小受限,任务数不可太多;
    3) 当前的简易OS最多只能支持16个任务;
    4) 考虑到RAM的限制,任务数与优先级数量相同;
    5)  ......    
完成时间:2006年11月24日, 10:19:23


相关链接:https://bbs.21ic.com/upfiles/img/20071/200711115509519.rar

相关帖子

沙发
MAME32| | 2007-1-11 16:01 | 只看该作者

高人

51操作系统啊,才刚接触SMALL RTOS
高人!

使用特权

评论回复
板凳
xmm| | 2007-1-11 17:08 | 只看该作者

不错,自己写os还是蛮有意思的

使用特权

评论回复
地板
zhaoem82| | 2007-1-11 20:34 | 只看该作者

怎么下载不了!

使用特权

评论回复
5
happystar| | 2007-1-11 20:42 | 只看该作者

老大,什么都没有啊

使用特权

评论回复
6
walnutcy|  楼主 | 2007-1-12 08:34 | 只看该作者

我再上传一次吧,,见附件

使用特权

评论回复
7
walnutcy|  楼主 | 2007-1-12 08:36 | 只看该作者

刚刚我试了一下,可以下载的,,

使用特权

评论回复
8
walnutcy|  楼主 | 2007-9-8 13:12 | 只看该作者

最近有空,重新解读半年的东西---1 (有空了,呵呵)

重新翻起这篇**,因为是自己的一个学习经历,且这里做了一些手脚,把keil c51的中断去掉了,

用汇编直接调用自己的C代码,方便理解堆栈的工作机制..


在sw_int.c里有两个宏代码,用来完成出栈,入栈,在中断或任务切换时使用,
具体每行代码就不说了吧,,就两个指令push,pop,只是要注意栈的规则,先入后出,
#pragma asm
;/////////////////////////////////////////////////
;////////add by walnutcy 2006-11-22
;                PUBLIC  PUSHALL
PUSHALL MACRO 
;;;;;;;;;;;;;;;;;;;;;;
        PUSH    ACC         
        PUSH    B         
        PUSH    PSW         
        MOV    PSW,#0x00
        PUSH    DPL         
        PUSH    DPH         
        PUSH    0x00     
        PUSH    0x01     
        PUSH    0x02     
        PUSH    0x03     
        PUSH    0x04     
        PUSH    0x05     
        PUSH    0x06     
        PUSH    0x07    
;;;;;;;;;;;;;;;;;;;;;;;;;;         
        ENDM

POPALL    MACRO
;;;;;;;;;;;;;;;;;;;;
        POP        0x07
        POP        0x06
        POP        0x05
        POP        0x04
        POP        0x03
        POP        0x02
        POP        0x01
        POP        0x00
        POP        DPH 
        POP        DPL 
        POP        PSW 
        POP        B   
        POP        ACC             
;;;;;;;;;;;;;;;;;;;;;;;;
        ENDM
;/////////////////////////////////////////////////
#pragma    endasm

接下来,我们看看这个函数,
怎么全是NOP指令啊,
我在这里浪费了一点字节空间,
图省事,直接把ISRAdrFun链接到0X0003处,
如下:
LX51COS (?PR?_?ISRADRFUN?SW_INT(0x0003))
///////////
然后 ,嘿嘿,硬件一中断,就执行ISRAdrFun内的代码了,
利一个一长跳转,直接转到C的中断函数下面了,
如: LJMP SysTimer0

void ISRAdrFun (void)  REENTRANT
{
#pragma asm
       NOP                //3
       NOP
       NOP
       NOP                //6
       NOP
       NOP
       NOP
       NOP                //0A

       LJMP SysTimer0    //0B
;       NOP
;       NOP
       NOP
       NOP
;;//////////////////////////////////
       NOP                //10
       NOP
       NOP
       NOP
       NOP
       NOP

       NOP
       NOP
       NOP
       NOP
       NOP                //1A

       NOP                //1B
       NOP
       NOP
       NOP
       NOP
;;//////////////////////////////////
       NOP                //20
       NOP
       NOP
       LJMP UartISR     //23
;       NOP
;       NOP

       NOP
       NOP
       NOP
       NOP
       NOP                //2A

       NOP                //2B
       NOP
       NOP
       NOP
       NOP
;;//////////////////////////////////
       NOP                //30
       NOP
       NOP
       LJMP IR_CaptureInt6     //33
;       NOP
;       NOP

       NOP
       NOP
       NOP
       NOP
       NOP                //3A

       NOP                //3B
       NOP
       NOP
       NOP
       NOP
;;//////////////////////////////////
       NOP                //40
       NOP
       NOP
       NOP             
       NOP
       NOP

       NOP
       NOP
       NOP
       NOP
       NOP                //4A

       NOP                //4B
       NOP
       NOP
       NOP
       NOP
#pragma endasm

}

当然,直接跳到C函数中了,也不行了,要保护现场啊,不能说在吃饭前不洗手啊,要不手上的什么*&*^%$%&&&全到碗里去了,

所以我们要调用我在前面写的那两个宏,来保护现场,呵呵
如下函数所示,
void SysTimer0 (void)// interrupt 1  //FC66 1ms

////保护现场,
#pragma asm
    PUSHALL 
#pragma endasm
////中断级数....
     gOsIntLevel++; 
////1MS定时,,,
    TH0    =0xFC;
    TL0=0x67;
    TR0=1;
    sysTimeTick++ ;
/////处理各个任务的延时
#ifdef OS_DELAY
    OsDealDelay();
#endif

    sys10ms++;
    if (10==sys10ms)
    {    sys10ms = 0;
#ifdef SET_TIMER
        Timer10msProc();
#endif    
//        isNeedTaskSW = 1;
///看看,要不要求任务切换
        OsIntExit();            
    }
    if (gOsIntLevel)
        gOsIntLevel--;    
////退出中断,恢得现场,
#pragma asm
    POPALL
    RETI        
#pragma endasm
}

使用特权

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

本版积分规则

111

主题

1443

帖子

5

粉丝