今天來學習一下實時操作系統(tǒng)ucos II
至于具體為什么要學UCOS II 以及為什么要選擇UCOSII而不是UCOS I 或者III 其實我是說不上來的
因為手頭只有野火的開發(fā)板掌唾,并且野火的資料支持也是相當?shù)呢S富痹雅,所以便立即拿來例程燒了進去。
好了廢話不多說袱蚓,
首先先簡述一下ucos的好處矾兜,或者說操作系統(tǒng)的好處
在裸板開發(fā)中,通常我們的程序是一條指令一條指令來運行的庸推,
通常情況下骡显,如果我們恰好有一個非常重要的函數(shù)要運行呢,就必須等待系統(tǒng)指令周期的開始到結(jié)束浆西。
在這種情況下粉私,所有的指令的響應周期是一定的,也就是所有函數(shù)要被執(zhí)行都要算在系統(tǒng)周期里面的近零。
那么假如說毡鉴,我有一個對時間要求精度非常高的采樣函數(shù)崔泵,并且無法使用計時器/定時器中斷來完成,
我就要在main中的一個while中完成我數(shù)據(jù)的采樣然后顯示在屏幕上猪瞬。
那么大家就會說憎瘸,系統(tǒng)的周期是不確定的,并且還要花時間把采樣得到的數(shù)據(jù)打印輸出到屏幕上陈瘦。時
間精度根本無法保證幌甘!
在這種裸板開發(fā)的情況下,系統(tǒng)通常是單線程的痊项,所以當有多個任務(wù)執(zhí)行時常常是串行觸發(fā)的(完成
上一任務(wù)锅风,下一任務(wù)才有可能被執(zhí)行),這是阻塞式的響應機制雖然說能應對大多數(shù)情鞍泉,但是對某種
特殊多任務(wù)情況下皱埠,往往是難以滿足需要的。
例如上段時間的NRF超車觸發(fā)程序咖驮。在當時的情況下边器,NRF接收或者發(fā)送往往是要多次執(zhí)行的,但是多次
執(zhí)行又類似于延時函數(shù)托修,在智能車高速執(zhí)行過程中忘巧,任何一種延時函數(shù)無異于作繭自縛。
既然操作系統(tǒng)這么牛逼睦刃,那么就馬上進入正題:
BSP_Init(); //板載IO初始化
OSInit();
OSTaskCreate(Task_Start,(void *)0,&startup_task_stk[STARTUP_TASK_STK_SIZE-1], STARTUP_TASK_PRIO);
OSStart();
其中BSP_Init()為板載IO的初始化砚嘴,不難理解就是用到GPIO我就初始化GPIO等等
OSInit();為ucosII 系統(tǒng)初始化 不必關(guān)心。
OSTaskCreate();為任務(wù)的創(chuàng)建函數(shù)涩拙,其中第一個函數(shù)是函數(shù)指針际长,指向你執(zhí)行任務(wù)的函數(shù)
第二個函數(shù)是函數(shù)棧,后面再劃重點講解
第三個參數(shù)為任務(wù)的優(yōu)先級兴泥,在ucosII中一共64個任務(wù)優(yōu)先級
0~63 其中越小代表優(yōu)先級越高
OSStart(); 為開始執(zhí)行任務(wù)也颤,不多贅述。
一個完整的ucos工程就包含這四個部分郁轻,其中BSP_Init()為我們提供板載級別額的底層驅(qū)動lib,而OSTaskCreate()文留;則負責將我們的task創(chuàng)建并且給予相應的任務(wù)優(yōu)先級好唯,基于執(zhí)行的權(quán)利。
但對于OSInit();OSStart();的部分燥翅,由于目前的我道行未深骑篙,不敢亂碰。
這就是今天的學習總結(jié)森书!