獲取源碼
源碼下載地址:https://github.com/alibaba/AliOS-Things.git
談一下如果從github下載alios速度過慢,怎樣加快下載速度。這裡有一個辦法就是將代碼放到gitee中,然後從gitee中下載。
方法如:
![alios-Things操作系統簡單分析](http://p2.ttnews.xyz/loading.gif)
![alios-Things操作系統簡單分析](http://p2.ttnews.xyz/loading.gif)
先簡單說說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。
本篇仍然持續更新。。。
閱讀更多 wityuan 的文章