⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_cpu_c.c

📁 51单片机的实时系统
💻 C
字号:
/*********************************************************************************************************
**				                               Small RTOS 51
**                                   The Real-Time Kernel For Keil c51
**
**                                  (c) Copyright 2002-2002, chenmingji
**                                           All Rights Reserved
********************************************************************************************************/

#define  IN_OS_CPU_C
#include "CONFIG.h"

extern idata uint8 STACK[1];                    /* 堆栈起始位置,在OS_CPU_A定义 */
uint8 idata * OSTsakStackBotton[OS_MAX_TASKS + 1];/* 任务堆栈底部位置            */

#if EN_SP2 > 0
uint8 idata  Sp2[Sp2Space];                     /* 高级中断堆栈           */
#endif

extern void LoadCtx(void);

#if OS_MAX_TASKS < 9            
uint8 data OSFastSwap = 0xff;
#else
uint16 data OSFastSwap = 0xffff;
#endif
/*********************************************************************************************************
** 函数名称: OSStart
** 功能描述: Small RTOS 51初始化函数,调用此函数后多任务开始运行,首先执ID为0的任务
** 输 入: 无
** 输 出 : 无
** 全局变量: OSTsakStackBotton,SP
********************************************************************************************************/
        void OSStart(void)
        
{
    uint8 idata *cp;
    uint8 i;
    
    cp = STACK;
    
    OSTsakStackBotton[0] = STACK;
    OSTsakStackBotton[OS_MAX_TASKS] = (uint8 idata *)(IDATA_RAM_SIZE % 256);

    *cp++ = ((uint16)(TaskFuction[0])) % 256;
    SP = (uint8) cp;
    *cp++ = ((uint16)(TaskFuction[0])) / 256;

    cp = (uint8 idata *)(IDATA_RAM_SIZE - 1) ;
    for(i = OS_MAX_TASKS - 1; i > 0; i--)
    {
        *cp-- =  ((uint16)(TaskFuction[i])) / 256;
        OSTsakStackBotton[i] = cp;
        *cp-- =  ((uint16)(TaskFuction[i])) % 256;
    }
//    OS_EXIT_CRITICAL();
    LoadCtx();
}

/*********************************************************************************************************
** 函数名称: OSTickISR
** 功能描述: 系统时钟中断服务函数
** 输 入: 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: OS_IBT_ENTER,(UserTickTimer),OSTimeTick,OSIntExit
********************************************************************************************************/
#if EN_OS_INT_ENTER >0 
#pragma disable                                        /* 除非最高优先级中断,否则,必须加上这一句                 */
#endif
void OSTickISR(void) interrupt OS_TIME_ISR

{
#if TICK_TIMER_SHARING >1 
    static uint8 TickSum=0;
#endif

#if EN_USER_TICK_TIMER > 0 
    UserTickTimer();                                    /* 用户函数                                                 */
#endif

#if TICK_TIMER_SHARING >1 
    TickSum = (TickSum + 1) % TICK_TIMER_SHARING;
    if (TickSum != 0)
    {
        return;
    }
#endif

#if EN_OS_INT_ENTER > 0 
    OS_INT_ENTER();                                     /* 中断开始处理                                             */
#endif
    

#if EN_TIMER_SHARING > 0
    OSTimeTick();                                       /* 调用系统时钟处理函数                            */
#else
    OSIntSendSignal(TIME_ISR_TASK_ID);
#endif
    
    OSIntExit();                                        /* 中断结束处理                                             */
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -