?? os_core.c
字號:
/*
*********************************************************************************************************
* 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 "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 + -