/*
** 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
uC/OS-II源碼解析(os_cpu_c.c)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.