LiteOS簡單分析一波

代碼下載

Liteos源碼地址:https://gitee.com/LiteOS/LiteOS.git

這篇緊跟著我前面說的freertos來做一些基本的對比。


本篇是從gitee下載的,版本未知(看來LiteOS代碼寫的有點不上心啊)。基於

<code>LiteOS\\targets\\Cloud_STM32F429IGTx_FIRE\\MDK-ARM/<code>

來分析的。


談談LiteOS任務\u0006\u0012\u0013\u0012\u0013\u0012\u0018\u0018\u0012\u0001

1.任務怎樣創建來的?

編寫一個函數,定義為:LOS_TaskCreate(),裡面需要包含參數:任務id,要執行的函數、任務的名稱、棧的大小、當前任務的優先級等。與freertos不同的是,liteos的棧數組在其他函數中操作的。另外,liteos事先就定義了n個任務

,組成了一個數組,這個id就是數組的下標。明顯的,liteos這樣做是不合適的,因為白白的浪費了空間,而如果不浪費,則需要自己去計算任務有多少個,然後修改定義出來的任務數。


2.任務的私有信息需要怎麼存放?

定義一個函數,命名為:osTskStackInit(),裡面包含的就是xPSR、PC、LR、R12、R3、R2、R1、R0,R11, R10, R9, R8, R7, R6, R5 and R4等的初始化,要注意返回到PSP模式需要存放一個值。定義一個結構體tagTskContext,裡面已經將寄存器順序都排列好了。


3.任務怎麼切換?

對於系統運行,要執行第一個任務,可以調用函數:LOS_StartToRun(),這個函數是使用匯編編寫的,看起來其實沒必要這麼幹,因為它只是系統啟動以後只用一次的函數。目測是為了和其他系統區分開,可能是避免人家說它抄襲的太多,:-)。


之後則是多個任務之間進行調度。


在普通任務中,可以調用函數LOS_TaskDelay(),其實就是調用LOS_TaskYield(),實際幹活的則是LOS_Schedule()裡面的osSchedule(),也就是osTaskSchedule(),有沒有繞暈的感覺。

它裡面也一樣,只需要設置PENDSV位就可以了,這樣就能做到PENDSV中斷產生。PENDSV中斷服務函數是PendSV_Handler()。這個函數作用就是切換到應該切換到的任務中。

在中斷服務函數中, 可以調用osTaskScan(),則會調用到LOS_Schedule(),也就能切換任務了。

4.訪問同一個資源(變量)如何處理?

對於LiteOS處理起來就很簡單了,直接粗暴的操作PRIMASK。所以感覺LiteOS相比freertos有很多的內容需要系統開發人員再繼續琢磨。


關於LiteOS的任務這塊先說到這裡,還是持續更新吧。


分享到:


相關文章: