您当前的位置:五五电子网电子知识单片机-工控设备嵌入式系统-技术uCOS51移植心得[社区] 正文
uCOS51移植心得[社区]

uCOS51移植心得[社区]

点击数:7745 次   录入时间:03-04 11:48:48   整理:http://www.55dianzi.com   嵌入式系统-技术
;-------------------------------------------------------------------------
        CSEG AT 000BH    ;OSTickISR
        LJMP OSTickISR   ;使用定时器0
        RSEG ?PR?OSTickISR?OS_CPU_A

OSTickISR:       
       
        USING 0       
        PUSHALL
       
        CLR  TR0
        MOV  TH0,#70H    ;定义Tick=50次/秒(即0.02秒/次)
        MOV  TL0,#00H    ;OS_CPU_C.C  和  OS_TICKS_PER_SEC
        SETB TR0
       
        LCALL _?OSIntEnter
        LCALL _?OSTimeTick
        LCALL _?OSIntExit
        POPALL       
        RETI
;-------------------------------------------------------------------------
        CSEG AT 0023H    ;串口中断
        LJMP SerialISR   ;工作于系统态,无任务切换。
        RSEG ?PR?_?serial?OS_CPU_A
       
SerialISR:
       
        USING 0       
        PUSHALL
        CLR  EA
        LCALL _?serial       
        SETB EA
        POPALL       
        RETI
;-------------------------------------------------------------------------
        END
;-------------------------------------------------------------------------

文件名 : OS_CPU_C.C

void *OSTaskStkInit (void (*task)(void *pd), void *ppdata, void *ptos, INT16U opt) reentrant
{   
    OS_STK *stk;

    ppdata = ppdata;
    opt    = opt;                           //opt没被用到,保留此语句防止告警产生   
    stk    = (OS_STK *)ptos;                //用户堆栈最低有效地址
    *stk++ = 15;                            //用户堆栈长度
    *stk++ = (INT16U)task & 0xFF;           //任务地址低8位
    *stk++ = (INT16U)task >> 8;             //任务地址高8位   
    *stk++ = 0x00;                          //PSW
    *stk++ = 0x0A;                          //ACC
    *stk++ = 0x0B;                          //B
    *stk++ = 0x00;                          //DPL
    *stk++ = 0x00;                          //DPH
    *stk++ = 0x00;                          //R0
    *stk++ = 0x01;                          //R1
    *stk++ = 0x02;                          //R2
    *stk++ = 0x03;                          //R3
    *stk++ = 0x04;                          //R4
    *stk++ = 0x05;                          //R5
    *stk++ = 0x06;                          //R6
    *stk++ = 0x07;                          //R7
                                            //不用保存SP,任务切换时根据用户堆栈长度计算得出。   
    return ((void *)ptos);
}

#if OS_CPU_HOOKS_EN
void OSTaskCreateHook (OS_TCB *PTCb) reentrant
{
    PTCb = ptcb;                       /* Prevent compiler warning                                     */
}

void OSTaskDelHook (OS_TCB *ptcb) reentrant
{
    ptcb = ptcb;                       /* Prevent compiler warning                                     */
}

void OSTimeTickHook (void) reentrant
{
}
#endif

//初始化定时器0
void InitTimer0(void) reentrant
{
    TMOD=TMOD&0xF0;
    TMOD=TMOD|0x01;    //模式1(16位定时器),仅受TR0控制

上一页  [1] [2] [3] [4] [5] [6]  下一页


本文关键字:暂无联系方式嵌入式系统-技术单片机-工控设备 - 嵌入式系统-技术