?? os_cpu_c.c
字號:
#define OS_CPU_GLOBALS
#include <includes.h>
#if OS_VIEW_MODULE > 0
#include <OS_VIEWc.H>
#include <OS_VIEW.H>
#endif
#define ARM_MODE_ARM 0x00000000
#define ARM_MODE_THUMB 0x00000020
#if __CPU_MODE__ == 1
#define ARM_SVC_MODE (0x00000013L + ARM_MODE_THUMB)
#else
#define ARM_SVC_MODE (0x00000013L + ARM_MODE_ARM)
#endif
/*********************************************************************************************************
*說 明:OSInitHookBegin函數,由OSInit()函數在開始時調用,調用期間應關中斷。
* 參數:無
* 返回值:無
********************************************************************************************************/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
void OSInitHookBegin (void){
}
#endif
/*********************************************************************************************************
* 說 明:OSInitHookEnd函數,由OSInit()函數在結束時調用,調用期間應關中斷。
* 參數:無
* 返回值:無
********************************************************************************************************/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
void OSInitHookEnd (void) {
#if OS_CPU_INT_DIS_MEAS_EN > 0
OS_CPU_IntDisMeasInit();
#endif
}
#endif
/*********************************************************************************************************
* 說 明:OSTaskCreateHook函數,創建任務時調用,調用期間應關中斷。
* 參數:OS_TCB *ptcb,指向被創建任務任務控制塊的指針
* 返回值:無
*********************************************************************************************************/
#if OS_CPU_HOOKS_EN > 0
void OSTaskCreateHook (OS_TCB *ptcb) {
#if OS_VIEW_MODULE > 0
OSView_TaskCreateHook(ptcb);
#else
(void)ptcb;
#endif
}
#endif
/*********************************************************************************************************
* 說明:OSTaskDelHook函數,刪除任務時調用,調用期間應關中斷。
* 參數:OS_TCB *ptcb,指向被創建任務任務控制塊的指針
* 返回值:無
*********************************************************************************************************/
#if OS_CPU_HOOKS_EN > 0
void OSTaskDelHook (OS_TCB *ptcb) {
(void)ptcb;
}
#endif
/*********************************************************************************************************
* 說明:OSTaskIdleHook函數,由空閑任務調用,調用期間應關中斷。加入該函數允許用戶停止CPU以降低功耗。
* 參數:無
* 返回值:無
*********************************************************************************************************/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION >= 251
void OSTaskIdleHook (void) {
}
#endif
/*********************************************************************************************************
* 說明:OSTaskStatHook函數,由統計任務每秒調用一次,允許用戶在統計任務中加入其他功能。STATISTIC TASK HOOK
* 參數:無
* 返回值:無
*********************************************************************************************************/
#if OS_CPU_HOOKS_EN > 0
void OSTaskStatHook (void) {
}
#endif
/*********************************************************************************************************
* 說明:*OSTaskStkInit函數,初始化任務堆棧。該函數由OSTaskCreate() 或 OSTaskCreateExt() 調用。
* 參數:task 為指向任務代碼的指針。
* p_arg 為指向用戶數據區的指針,用戶數據當任務首次執行時傳遞給任務。
* ptos 為指向棧頂的指針,假定ptos指向任務堆棧的'free'入口。如果 OS_STK_GROWTH 被置為1,則ptos將包
含任務的最高有效地址。類似地,如果OS_STK_GROWTH 被置為0,則ptos將包含任務的最低有效地址。
* opt 指定用于改變OSTaskStkInit()作用的選項。
* 返回值:一旦處理器的寄存器以合適的順序放入堆棧,將返回新的棧頂值。
* 注意: 1) 任務開始執行后,中斷開放,
* 2) 所有任務以管理模式運行。
*********************************************************************************************************/
OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt) {
OS_STK *stk;
opt = opt; // 參數opt未使用
stk = ptos; // 加載堆棧指針
*(stk) = (OS_STK)task; // 入口
*(--stk) = (INT32U)0x14141414L; // R14 (LR)
*(--stk) = (INT32U)0x12121212L; // R12
*(--stk) = (INT32U)0x11111111L; // R11
*(--stk) = (INT32U)0x10101010L; // R10
*(--stk) = (INT32U)0x09090909L; // R9
*(--stk) = (INT32U)0x08080808L; // R8
*(--stk) = (INT32U)0x07070707L; // R7
*(--stk) = (INT32U)0x06060606L; // R6
*(--stk) = (INT32U)0x05050505L; // R5
*(--stk) = (INT32U)0x04040404L; // R4
*(--stk) = (INT32U)0x03030303L; // R3
*(--stk) = (INT32U)0x02020202L; // R2
*(--stk) = (INT32U)0x01010101L; // R1
*(--stk) = (INT32U)p_arg; // R0 : argument
*(--stk) = (INT32U)ARM_SVC_MODE; // CPSR (允許IRQ和FIQ中斷)
return (stk);
}
/*********************************************************************************************************
* 說明:OSTaskSwHook函數,任務切換時調用本函數。允許用戶在上下文切換期間執行其他操作。
* 參數:無
* 注意:1)函數調用期間要關中斷。
* 2)假定全局指針OSTCBHighRdy指向將被切換近來的最高優先級任務的TCB,并且OSTCBCur指向將被切換
* 出去的任務。
*********************************************************************************************************/
#if (OS_CPU_HOOKS_EN > 0) && (OS_TASK_SW_HOOK_EN > 0)
void OSTaskSwHook (void) {
#if OS_VIEW_MODULE > 0
OSView_TaskSwHook();
#endif
}
#endif
/*********************************************************************************************************
* 說明:OSTCBInitHook函數,建立起大部分TCB之后由OS_TCBInit()調用本函數。
* 參數:ptcb 為指向將被創建任務TCB的指針。
* 注意:函數調用期間可以開中斷,也可以關中斷。
*********************************************************************************************************/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
void OSTCBInitHook (OS_TCB *ptcb) {
(void)ptcb;
}
#endif
/*********************************************************************************************************
* 說明:OSTimeTickHook函數,每個時鐘節拍調用一次本函數。
* 參數:無
* 注意:函數調用期間可以開中斷,也可以關中斷。
*********************************************************************************************************/
#if (OS_CPU_HOOKS_EN > 0) && (OS_TIME_TICK_HOOK_EN > 0)
void OSTimeTickHook (void) {
#if OS_VIEW_MODULE > 0
OSView_TickHook();
#endif
}
#endif
/*********************************************************************************************************
* 說明:OS_CPU_IntDisMeasInit函數。
*********************************************************************************************************/
#if OS_CPU_INT_DIS_MEAS_EN > 0
void OS_CPU_IntDisMeasInit (void) {
OS_CPU_IntDisMeasNestingCtr = 0;
OS_CPU_IntDisMeasCntsEnter = 0;
OS_CPU_IntDisMeasCntsExit = 0;
OS_CPU_IntDisMeasCntsMax = 0;
OS_CPU_IntDisMeasCntsDelta = 0;
OS_CPU_IntDisMeasCntsOvrhd = 0;
OS_CPU_IntDisMeasStart();
OS_CPU_IntDisMeasStop();
OS_CPU_IntDisMeasCntsOvrhd = OS_CPU_IntDisMeasCntsDelta;
}
void OS_CPU_IntDisMeasStart (void) {
OS_CPU_IntDisMeasNestingCtr++;
if (OS_CPU_IntDisMeasNestingCtr == 1) {
OS_CPU_IntDisMeasCntsEnter = OS_CPU_IntDisMeasTmrRd();
}
}
void OS_CPU_IntDisMeasStop (void) {
OS_CPU_IntDisMeasNestingCtr--;
if (OS_CPU_IntDisMeasNestingCtr == 0) {
OS_CPU_IntDisMeasCntsExit = OS_CPU_IntDisMeasTmrRd();
OS_CPU_IntDisMeasCntsDelta = OS_CPU_IntDisMeasCntsExit - OS_CPU_IntDisMeasCntsEnter;
if (OS_CPU_IntDisMeasCntsDelta > OS_CPU_IntDisMeasCntsOvrhd) {
OS_CPU_IntDisMeasCntsDelta -= OS_CPU_IntDisMeasCntsOvrhd;
} else {
OS_CPU_IntDisMeasCntsDelta = OS_CPU_IntDisMeasCntsOvrhd;
}
if (OS_CPU_IntDisMeasCntsDelta > OS_CPU_IntDisMeasCntsMax) {
OS_CPU_IntDisMeasCntsMax = OS_CPU_IntDisMeasCntsDelta;
}
}
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -