UCOS II幾個重要的函式使用詳解

2021-04-23 11:58:58 字數 3147 閱讀 6956

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 幾個函式均需要訪問某個受特定鎖...