2009年3月24日 星期二

03/25

星期一放假...因為五哥的媽媽開刀...
今日小考...
Q:
*OSTCBCur: 目前正在執行的task
*OSTCBHighRdy: priority最高的task
一般來說這兩個值會一樣, 在什麼情況下這兩個值會不同?
ans:
context switch時會不一樣
一開始OSTCBCur & OSTCBHighRdy都指向task A
因為某種原因使task B的priority變高
OSTCBHighRdy指向task B
接下來做context switch, CPU將task A 的TCB存回去, 把task B load進來
最後會讓OSTCBCur = OSTCBHighRdy

TASK CONTROL BLOCK
typedef struct os_tcb{
/*存放指向stack開頭的指標sp, stack中有存regs, pc, psw*/
OS_STK *OSTCBStkPtr;

/*OSTaskCreatEXT才有下列東西, 與此function後面跟的參數一樣*/
#if OS_TASK_CREATE_EXT_EN > 0
void *OSTCBExtPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
#endif
}

/*把所有TCB串起來(readyQ, waitingQ...)*/

struct os_tcb *OSTCBNext;
struct os_tcb * OSTCBPrev;

/*下列五種功能只有一種用得到, 與行程間的通訊有關, 這樣寫是自己手動最佳化, 省記憶體空間*/
#if ((OS_Q_EN>0)&&(OS_MAX_QS>0))(OS_MBOX_EN>0)(OS_SEM_EN>0)(OS_MUTEX_EN>0)
OS_EUENT *OSTCBEventPtr;
#endif

#if ((OS_Q_EN>0)&&(OS_MAX_QS>0))(OS_MBOX_EN>0)
void *OSTCBMsg;
#endif

#if(...)
#if ...
#endif ...
#endif


/*決定要睡多久, 必須透過systemcall來修改(ex: OSTimeDly...)*/
INT16U OSTCBDly;
INT8U OSTCBStat;
/*task的priority*/
INT8U OSTCBPrio;

/*以下由OSTCBPrio算出來的, 在每次context switch時都會用到, 為加快CPU的速度所以先算起來放, 因為priority的更新速度並沒有比context switch快*/
INT8U OSTCBX;
INT8U OSTCBY;
INT8U OSTCBBitX;
INT8U OSTCBBitY;

#if OS_TASK_DEL_EN>0
/*若要讓該task死掉, 將下值改為1即可*/
BOOLEAN OSTCBDelReg;
#endif
}

OSTCBFreeList:
free TCB串成的list, 可以快速拿到free的TCB, 加快速度
感覺上像是linux中的slab(但平均速度快, 最佳情況比較慢)

沒有留言:

張貼留言