uC/OS-II源碼解析(os_cpu_c.c)

/*
** ver   : 2.52
** file  : os_cpu_c.c
** brief : 處理器先關 C 文件
*/


#define  OS_CPU_GLOBALS
#include "includes.h"

/*
*****************************************************************************************
*                                       用戶自定義鉤子函數
*                                           
*
* breif     : OSInit() 開始處調用函數
*
* Note(s)   : 1) 調用期間禁止中斷
******************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
void  OSInitHookBegin (void)
{
}
#endif

/*
*****************************************************************************************
*                                       用戶自定義鉤子函數
*                                           
*
* breif     : OSInit() 結束處調用函數
*
* Note(s)   : 1) 調用期間禁止中斷
******************************************************************************************
*/

#if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
void  OSInitHookEnd (void)
{
}
#endif

/*$PAGE*/
/*
*****************************************************************************************
*                                          任務創建鉤子函數
*
* brief   : 創建任務時調用
*
* ptcb    : 指向任務控制塊的指針
*
* Note(s) : 1) 調用期間禁止中斷
******************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 
void  OSTaskCreateHook (OS_TCB *ptcb)
{
    ptcb = ptcb;                       
}
#endif


/*
*****************************************************************************************
*                                           刪除任務鉤子函數
*
* breif   : 刪除任務時調用
*
* ptcb    : 指向任務控制塊的指針
*
* Note(s) : 1) 調用期間禁止中斷
******************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 
void  OSTaskDelHook (OS_TCB *ptcb)
{
    ptcb = ptcb;                                                      
}
#endif

/*
******************************************************************************************
*                                             空閒任務鉤子函數
*
* brief   : 空閒任務中調用
*
* Note(s) : 1) 調用期間禁止中斷
*******************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION >= 251
void  OSTaskIdleHook (void)
{
}
#endif

/*
*******************************************************************************************
*                                           統計任務鉤子函數
*
* brief: 統計任務中調用
*
*******************************************************************************************
*/

#if OS_CPU_HOOKS_EN > 0 
void  OSTaskStatHook (void)
{
}
#endif

/*$PAGE*/
/*
********************************************************************************************
*                                        任務堆棧初始化
*
* brief   : OSTaskCreate() 和 OSTaskCreateExt() 調用該函數
*
* task    : 指向任務代碼的指針
*
* pdata   : 當任務第一次執行時得到的參數
*
* ptos    : 棧頂指針
*
* opt     : 創建任務時的選擇項
*
* Returns : 堆棧指針所返回的地址
*
* note(s) : 1).模擬帶參數pdata的函數調用
*           2).模擬ISR向量
*           3).按照預先設計的寄存器值初始化任務堆棧
*           4).返回棧頂指針給調用該函數的函數
********************************************************************************************
*/

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


    opt    = opt;                           /* 防止編譯警告      */
    stk    = (INT16U *)ptos;                /* 堆棧指針          */
    *stk-- = (INT16U)FP_SEG(pdata);         /* 模擬帶參數pdata函數調用 */        
    *stk-- = (INT16U)FP_OFF(pdata);         
    *stk-- = (INT16U)FP_SEG(task);
    *stk-- = (INT16U)FP_OFF(task);
    *stk-- = (INT16U)0x0202;                /* 使能中斷          */
    *stk-- = (INT16U)FP_SEG(task);          /* 模擬ISR向量       */
    *stk-- = (INT16U)FP_OFF(task);        
    *stk-- = (INT16U)0xAAAA;                /* AX = 0xAAAA       */
    *stk-- = (INT16U)0xCCCC;                /* CX = 0xCCCC       */
    *stk-- = (INT16U)0xDDDD;                /* DX = 0xDDDD       */
    *stk-- = (INT16U)0xBBBB;                /* BX = 0xBBBB       */
    *stk-- = (INT16U)0x0000;                /* SP = 0x0000       */
    *stk-- = (INT16U)0x1111;                /* BP = 0x1111       */
    *stk-- = (INT16U)0x2222;                /* SI = 0x2222       */
    *stk-- = (INT16U)0x3333;                /* DI = 0x3333       */
    *stk-- = (INT16U)0x4444;                /* ES = 0x4444       */
    *stk   = _DS;                           /* DS = DS當前值     */
    return ((OS_STK *)stk);
}

/*$PAGE*/
/*
******************************************************************************************
*                        初始化任務堆棧爲了使用浮點仿真
*
* breif : 該函數必須在函數OSTaskCreate() 和 OSTaskCreateExt() 之前被調用,爲了爲了初始化任務
*          堆棧以允許使用Borland的浮點仿真. 
*
*              Ex.:   OS_STK TaskStk[1000];
*
*
*                     void main (void)
*                     {
*                         OS_STK *ptos;
*                         OS_STK *pbos;
*                         INT32U  size;
*
*
*                         OSInit();
*                         .
*                         .
*                         ptos  = &TaskStk[999];
*                         pbos  = &TaskStk[0];
*                         psize = 1000;
*                         OSTaskStkInit_FPE_x86(&ptos, &pbos, &size);
*                         OSTaskCreate(Task, (void *)0, ptos, 10);
*                         .
*                         .
*                         OSStart();
*                     }
*
* pptos  : 棧頂指針
*
* ppbos  : 棧底指針
*
* psize  : 堆棧大小.至少分配384個字節空間爲浮點仿真
*
* Returns   : 新堆棧大小.
*
*******************************************************************************************
*/

/*$PAGE*/
void  OSTaskStkInit_FPE_x86 (OS_STK **pptos, OS_STK **ppbos, INT32U *psize)
{
    INT32U   lin_tos;   /* 'Linear' version of top-of-stack    address   */
    INT32U   lin_bos;   /* 'Linear' version of bottom-of-stack address   */
    INT16U   seg;
    INT16U   off;
    INT32U   bytes;


    seg      = FP_SEG(*pptos); /* Decompose top-of-stack pointer into seg:off */
    off      = FP_OFF(*pptos);
    lin_tos  = ((INT32U)seg << 4) + (INT32U)off;/* Convert seg:off to linear address */
    bytes    = *psize * sizeof(OS_STK);         /* Determine how many bytes for the stack*/
    lin_bos  = (lin_tos - bytes + 15) & 0xFFFFFFF0L;  /* Ensure paragraph alignment for BOS*/

    seg      = (INT16U)(lin_bos >> 4);        /* Get new 'normalized' segment    */
    *ppbos   = (OS_STK *)MK_FP(seg, 0x0000);  /* Create 'normalized' BOS pointer */
    memcpy(*ppbos, MK_FP(_SS, 0), 384);       /* Copy FP emulation memory to task's stack*/
    bytes    = bytes - 16;                            /* 對齊     */
    *pptos   = (OS_STK *)MK_FP(seg, (INT16U)bytes);   /* 棧頂指針 */
    *ppbos   = (OS_STK *)MK_FP(seg, 384);             /* 棧底指針 */
    bytes    = bytes - 384;
    *psize   = bytes / sizeof(OS_STK);/* 分配完浮點仿真後的堆棧大小 */
}

/*$PAGE*/
/*
*******************************************************************************************
*                                           任務切換鉤子函數
*
* brief   : 任務切換時調用
*
* Note(s) : 1) 調用期間禁止中斷
*           2) 該函數可以直接訪問 OSTCBCur + OSTCBHighRdy
*******************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 
void  OSTaskSwHook (void)
{
}
#endif

/*
*******************************************************************************************
*                                           任務控制塊初始化鉤子函數
*
* breif  :  OS_TCBInit()調用
*
* ptcb   : 指向任務控制塊的指針
*
*******************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
void  OSTCBInitHook (OS_TCB *ptcb)
{
    ptcb = ptcb;                                          
}
#endif


/*
*******************************************************************************************
*                                               時鐘節拍鉤子函數
*
* brief  : OSTimeTick()調用該函數
*
*******************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 
void  OSTimeTickHook (void)
{
}
#endif
發佈了47 篇原創文章 · 獲贊 85 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章