alios-Things操作系統簡單分析

獲取源碼


源碼下載地址:https://github.com/alibaba/AliOS-Things.git


談一下如果從github下載alios速度過慢,怎樣加快下載速度。這裡有一個辦法就是將代碼放到gitee中,然後從gitee中下載。


方法如:


alios-Things操作系統簡單分析


alios-Things操作系統簡單分析


alios-Things操作系統簡單分析

先簡單說說Alios系統:

它的內核目錄下包含bus,cli,rhino(真正的內核代碼目錄),fs,init等等,不知道架構師怎麼考慮的,這樣的目錄組織明顯不合理。相較而言LiteOS分配得更好。

本篇基於stm32f4,從任務說起。

Alios-things系統支持多核。但是這裡不分析多核處理。

M4屬於armv7m架構,所以可以查看arch/arm/armv7m-mk文件下彙編等相關內容。

1.任務怎樣創建來的?

編寫一個函數,定義為:krhino_task_create(),裡面需要包含參數:任務id,要執行的函數、任務的名稱、棧數組、棧的大小、當前任務的優先級等。在krhino_task_create()也添加一個任務結構體,存放的就是任務本身所有的屬性值,這點跟freertos,LiteOS做法都不同。AliOS操作棧簡直到了兇狠的程度(參數特別多)。


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

定義一個函數,命名為:cpu_task_stack_init(),裡面參數需要包括棧數組的基地址,然後是棧大小,再個就是參數與執行的函數。然後就是在棧裡面存放寄存器:xPSR、PC、LR、R12、R3、R2、R1、R0,(佔位),R11, R10, R9, R8, R7, R6, R5 and R4等的初始化,要注意返回到PSP模式需要存放一個值。

所以知道前面介紹過的LiteOS,freertos,基本上在這裡也是一個套路。


3.任務怎麼切換?

對於系統運行,要執行第一個任務,可以調用函數:cpu_first_task_start(),這個函數是使用匯編編寫的,它將PENSV與SYSTICK設置為最低優先級,然後開啟PENSV中斷。之後就是一通操作猛如虎,感覺就AliOS把這任務切換做的複雜了。

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

在普通任務中,可以調用函數krhino_task_sleep(),最終它需要調用到RHINO_CRITICAL_EXIT_SCHED(),也就是void core_sched(void);也就是cpu_task_switch(),這個函數是一個彙編函數,最終仍然是觸發PENDSV中斷。

對於週期調用的void SysTick_Handler(void)中斷,它會調用到void krhino_intrpt_exit(void);最終會調用到cpu_intrpt_switch(),它也是一個彙編函數,也是觸發的PENDSV中斷。也可以發現,這個函數與cpu_task_switch()內容完全一樣。

所以,也沒什麼新奇的,跟前面講的LiteOS和freertos套路還是一樣的。


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

AliOS和LiteOS處理一樣,都是簡單粗暴的操作PRIMASK,這就沒有什麼好說的了。AliOS在任務和中斷中統一都是操作PRIMASK。


本篇仍然持續更新。。。


分享到:


相關文章: