void osinit (void)
ospriocur = 0; /***存放應用任務的優先順序***/
ospriohighrdy = 0;
ostcbhighrdy = (os_tcb *)0; /* tcb initialization */
ostcbcur = (os_tcb *)0;
ostcblist = (os_tcb *)0;
for (i = 0; i < (os_lowest_prio + 1); i++)
/**任務鍊錶陣列--**/
for (i = 0; i < (os_max_tasks + os_n_sys_tasks - 1); i++)
ostcbtbl[os_max_tasks + os_n_sys_tasks - 1].ostcbnext = (os_tcb *)0; /* last os_tcb */
ostcbfreelist = &ostcbtbl[0]; /**空任務塊控制指標:初始化時候指向的是第乙個任務**/
/*第乙個任務是系統任務--空閒任務,還有乙個統計任務(os_n_sys_tasks=2時)**/
/**事件鍊錶陣列***/
for (i = 0; i < (os_max_events - 1); i++)
oseventtbl[os_max_events - 1].oseventptr = (os_event *)0;/**最後的事件表**/
oseventfreelist = &oseventtbl[0];
#if os_stk_growth == 1 /***由高位址向低位址方向***/
ostaskcreate(ostaskidle, (void *)0, &ostaskidlestk[os_task_idle_stk_size - 1], os_idle_prio);
#else /****棧的方向由低位址到高位址***/
ostaskcreate(ostaskidle, (void *)0, &ostaskidlestk[0], os_idle_prio); // mand by jk 2007-8-16
// ostaskcreate(ostaskidle, (void *)0, &ostaskidlestk[os_task_idle_stk_size - 1], os_idle_prio);
#endif
}void ossempend (os_event *pevent, int16u timeout,
int8u *err)reentrant
int8u ossempost (os_event *pevent)reentrant
消 息通訊函式:ossempend(a)期待a事件的發生,如果事件a還沒有發生,那麼就被掛起(pending)等待,並且下乙個優先順序獲得cpu的控制 權,進行下乙個任務。相應的ossempost();就是通知給ossempend()事件發生了,那麼如果在下乙個任務中執行了ossempost (a),則上面的任務就知道了事件a的發生,那麼系統將cpu控制權交給了原來的優先順序更高的任務執行。相應的函式有
osflagpend(),ossempend(),osmutexpend(),osmboxpend(),osqpend()都是peng掛起等待某個事件的產生,否則進入到等待狀態。
例子:void taska()
void taskb()
/***以下為核心中最重要的幾個函式***/
int8u ostaskcreate(void (*task)(void *pd)reentrant,//任務函式
void *dataptr, //任務中需要使用的資料引數:萬能指標型別
os_stk *ptos, //任務棧頂指標:指向一開始申請的堆疊陣列
int8u prio)reentrant // 定義任務的優先順序
//優先順序錯誤則返回乙個不合法的優先順序錯誤**
os_enter_critical();//進入臨界區域--關中斷
if(ostcbpriotbl[prio]==(os_tcb *)0) ///**是否有清空當前任務塊的優先順序鍊錶**/
} else
return (err);
} else
}關於ostaskcreate()函式內部呼叫的一些說明:
函式ostcbinit(int8u prio,os_stk *ptos,os_stk *pbos,int16u id,int16u stk_size,void *pext,int16u opt)reentrant
分別為 優先順序 棧頂指標 棧末尾 任務號 棧大小 使用者使用堆疊區 任務擴充套件在ostaskcreateext()用
/**初始化最新建立的任務控制模組**
優先順序、堆疊的起始位址、堆疊的結束位址、任務編號、任務堆疊大小....
****/
static os_tcb *ptcb11;
int8u ostcbinit (int8u prio,
os_stk *ptos,
os_stk *pbos,
int16u id,
int16u stk_size,
void *pext,
int16u opt)reentrant
/**任務模組控制鍊錶建立**/
ostcblist = ptcb11;
/**任務成員變數:方便任務上下文切換**/
osrdygrp |= ptcb11->ostcbbity; /* make task ready to run */
osrdytbl[ptcb11->ostcby] |= ptcb11->ostcbbitx;
os_exit_critical();
return (os_no_err);
} else }
DOM幾個重要的函式
最近在讀js程式設計藝術,發現幾個不錯的函式,總結如下 1 頁面初始化載入函式onload 操作dom的函式應該在頁面元素初始化結束之後再立即執行,否則頁面元素還沒有初始化完成,dom操作就會擱淺了 網頁載入完畢時會觸發乙個onload事件,應該寫在onload函式裡面執行,現封裝乙個將多個操作繫結...
幾個重要的分段函式
絕對值函式 y left x right left x,x ge 0 x,x 0 end right.性質 left x right x leftrightarrow x ge 0,left x right x leftrightarrow x le 0 圖形 取整函式 y x 小於或等於 x 的最...
使用鎖的幾個重要理念
寫過些核心 後,再次閱讀ldd感覺理解就好多了。簡單總結了幾個使用鎖的重要理念。一 鎖的設計和使用策略。1 當我們建立了乙個可被並行訪問的物件時,應該同時定義用來控制訪問的鎖。鎖定模式必須在一開始就安排好,否則其後的改進將會非常困難。先期的時間投入會在除錯階段收益。2 幾個函式均需要訪問某個受特定鎖...