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

📄 os_core.c

📁 ucos在三星s3c4419B上的移植
💻 C
📖 第 1 页 / 共 4 页
字号:
/*
*********************************************************************************************************
*                                                uC/OS-II 实时内核
*                                                  内核函数
*
*                            (c) 版权 1992-2002, 所有版权归Jean J. Labrosse, Weston, FL 所有
*                                         
*
* 文件名称 :          OS_CORE.C
* 程序作者 :          Jean J. Labrosse 
*********************************************************************************************************
*/
#ifndef  OS_MASTER_FILE
#define  OS_GLOBALS
#include "..\test\SRC\includes.h"
#endif

/*
*********************************************************************************************************
*                              MAPPING TABLE TO MAP BIT POSITION TO BIT MASK
*
* Note: Index into table is desired bit position, 0..7
*       Indexed value corresponds to bit mask
*********************************************************************************************************
*/

INT8U  const  OSMapTbl[]   = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};

/*
*********************************************************************************************************
*                                       PRIORITY RESOLUTION TABLE
*
* Note: Index into table is bit pattern to resolve highest priority
*       Indexed value corresponds to highest priority bit position (i.e. 0..7)
*********************************************************************************************************
*/

INT8U  const  OSUnMapTbl[] = 
{
    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x00 to 0x0F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x10 to 0x1F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x20 to 0x2F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x30 to 0x3F                             */
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x40 to 0x4F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x50 to 0x5F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x60 to 0x6F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x70 to 0x7F                             */
    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x80 to 0x8F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x90 to 0x9F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xA0 to 0xAF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xB0 to 0xBF                             */
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xC0 to 0xCF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xD0 to 0xDF                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xE0 to 0xEF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0        /* 0xF0 to 0xFF                             */
};

/*
*********************************************************************************************************
*                                       函数原型
*********************************************************************************************************
*/
static  void  OS_InitEventList(void);
static  void  OS_InitMisc(void);
static  void  OS_InitRdyList(void);
static  void  OS_InitTaskIdle(void);
static  void  OS_InitTaskStat(void);
static  void  OS_InitTCBList(void);

/*$换页*/
/*
*********************************************************************************************************
*                                             初始化
*
* 函数描述: 该函数用于初始化 uC/OS-II的内部变量和数据结构,并且在创建uC/OS-II之前目标调用,且在调用
*           OSStart()之前调用
*              
* 输入参数  : 无
*
* 返回值    : 无
*********************************************************************************************************
*/

void  OSInit (void)
{
#if OS_VERSION >= 204
    OSInitHookBegin();                                           /* 调用特定的处理器的初始化代码         */
#endif

    OS_InitMisc();                                               /* 初始化杂项变量                       */

    OS_InitRdyList();                                            /* 初始化就绪列表                       */
    OS_InitTCBList();                                            /* 初始化任务控制块的空余列表           */
    OS_InitEventList();                                          /* 初始化事件的空余列表                 */

#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
    OS_FlagInit();                                               /* 初始化事件标志结构                   */
#endif

#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
    OS_MemInit();                                                /* 初始化内存管理器                     */
#endif

#if (OS_Q_EN > 0) && (OS_MAX_QS > 0)
    OS_QInit();                                                  /* 初始化消息队列结构                   */
#endif

    OS_InitTaskIdle();                                           /* 创建空闲任务                         */
    
#if OS_TASK_STAT_EN > 0
    OS_InitTaskStat();                                           /* 创建统计任务                         */
#endif

#if OS_VERSION >= 204
    OSInitHookEnd();                                             /* 调用特定的处理器的初始化代码         */
#endif
}
/*$换页*/
/*
*********************************************************************************************************
*                                             进入中断服务函数
*
* 函数描述: 该函数通知 uC/OS-II即将进入中断服务子程序。允许uC/OS-II跟踪中断嵌套,并因此只能在最后的嵌套中断
*           服务子程序中完成再调度。
*
* 输入参数 : 无
*
* 返回值   : 无
*
* 注释      : 1) 该函数应使用关闭的中断调用
*             2)  ISR 能直接增加嵌套的值而无需调用函数,因为中断嵌套声明为全局变量。                 
*             3) 即使直接增加中断嵌套的值也需调用OSIntExit()
*             4) 必须成对调用函数 OSIntEnter() and OSIntExit() 
*             5) 中断嵌套深度可达到255 级
*             6) I removed the OS_ENTER_CRITICAL() and OS_EXIT_CRITICAL() around the increment because
*                 OSIntEnter() is always called with interrupts disabled.
*********************************************************************************************************
*/

void  OSIntEnter (void)
{
    if (OSRunning == TRUE) 
    {
        if (OSIntNesting < 255) 
        {
            OSIntNesting++;                                    /* 增加中断服务函数的嵌套等级          */
        }
    }
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                               退出中断服务函数
*
* 函数描述: 该函数通知 uC/OS-II已完成中断服务子程序. 当完成最后的嵌套中断时,uC/OS-II 将调用调度器决定
*           是否有新的高优先级的任务准备就绪。
* 输入参数: 无
*
* 返回值:  无
*
* 注释      : 1) 必须成对调用函数 OSIntEnter() and OSIntExit()  
*             2) 当调度器上锁时,再调度失效 见OSchedLock())
*********************************************************************************************************
*/

void  OSIntExit (void)
{
#if OS_CRITICAL_METHOD == 3                                         /*   为CPU状态寄存器分配存储变量     */
    OS_CPU_SR  cpu_sr;
#endif
    
    
    if (OSRunning == TRUE) 
    {
        OS_ENTER_CRITICAL();
        if (OSIntNesting > 0) 
          {                                                 /* Prevent OSIntNesting from wrapping       */
            OSIntNesting--;
          }
        if ((OSIntNesting == 0) && (OSLockNesting == 0))
          {                                                 /*  只有所有中断服务子程序完成才可重新调度   */
            OSIntExitY    = OSUnMapTbl[OSRdyGrp];           /* ... 并且没有上锁                          */
            OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
            if (OSPrioHighRdy != OSPrioCur)
             {                                           /* 如果当前任务为最高就叙状态,则不发生任务切换 */
                OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
                OSCtxSwCtr++;                                            /*        计下任务切换次数      */
                OSIntCtxSw();                                         /*      完成中断级的任务切换       */
             }
          }
        OS_EXIT_CRITICAL();
    }
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                          给调度上锁
*
* 函数描述: 该函数用于防止调度再次发生。直到允许任务切换时,才可发生任务切换。
*
* 输入参数  : 无
*
* 返回值    : 无
*
* 注释      : 必须成对调用 OSSchedLock()和 OSSchedUnlock() 函数。
*********************************************************************************************************
*/

#if OS_SCHED_LOCK_EN > 0
void  OSSchedLock (void)
{
#if OS_CRITICAL_METHOD == 3                                      /* 为CPU状态寄存器分配存储变量           */
    OS_CPU_SR  cpu_sr;
#endif    
    
    
    if (OSRunning == TRUE) 
    {                                                              /* 判断多任务正在运行                  */
        OS_ENTER_CRITICAL();
        if (OSLockNesting < 255) 
        {                                                            /* 防止 OSLockNesting 退回到 0      */
            OSLockNesting++;                                    /* 增加上锁嵌套层数                       */
        }
        OS_EXIT_CRITICAL();
    }
}
#endif    

/*$PAGE*/
/*
*********************************************************************************************************
*                                          给调度解锁
*
* 函数描述: 该函数用于重新允许调度
*
* 输入参数  : 无
*
* 返回值    : 无
*
* 注释      : 必须成对调用 OSSchedLock()和 OSSchedUnlock() 函数。
*********************************************************************************************************
*/

#if OS_SCHED_LOCK_EN > 0
void  OSSchedUnlock (void)
{
#if OS_CRITICAL_METHOD == 3                                /* 为CPU状态寄存器分配存储变量 */
    OS_CPU_SR  cpu_sr;
#endif    
    
    
    if (OSRunning == TRUE) 
    {                                                                          /* 判断多任务正在运行    */
        OS_ENTER_CRITICAL();
        if (OSLockNesting > 0) 
        {                                                                   /* 如果已经为0,不减        */
            OSLockNesting--;                                                 /* 减少上锁嵌套等级         */
            if ((OSLockNesting == 0) && (OSIntNesting == 0))
             {                                                           /* 看是否解锁,且不在中断内? */
                OS_EXIT_CRITICAL();
                OS_Sched();                                             /* 如果最高优先级就绪                */
             } 
            else 
            {
                OS_EXIT_CRITICAL();
            }
        } 
        else 
        {
            OS_EXIT_CRITICAL();
        }
    }
}
#endif    

/*$PAGE*/
/*
*********************************************************************************************************
*                                          多任务开始
*
* 函数描述:   该函数启动多任务开始,让 uC/OS-II 管理所创建的任务。在调用OSStart()之前,必须调用 OSInit(), 
*             必须创建至少一个任务。

⌨️ 快捷键说明

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