stm32 Ctext-M3核心最簡單的多工RTOS
阿新 • • 發佈:2018-12-09
RTOS 實時作業系統,我做的是一個多工的作業系統,可以同時執行多個任務,我這裡設定的最大任務數是32個,
估計跑30多個任務的嵌入式裝置很少吧,32個任務夠用了。
OS我把它叫做HesOS,主要功能如下,比較簡單。
1--實現多工排程
2--實現任務排程鎖
3--實現臨界區保護
4--實現讀取cpu使用率(這個功能比較重要的)
5--實現us延時(用於模擬如IIC匯流排模擬)
對於一般的嵌入式應用有這些功能,差不多夠用了。
移植HesOS也非常簡單,不會像其它的OS一樣比較龐大,修改的地方也比較多,使用起來也複雜。
HesOS不管是移植和使用都是非常簡單的,類似於PC的執行緒使用。
主函式初始化:系統一共跑了10個任務。
部分任務定義:
列印cpu使用量任務:
不能在所有任務裡串列埠列印,因為串列埠列印非常的佔用cpu,除非使用dma傳輸。
說一下移植,只需要實現以下程式碼
_uint32 fac_us; //SysTick定時器 void set_systick(_uint32 ms) { fac_us=SystemCoreClock/1000000; //不論是否使用OS,fac_us都需要使用 SysTick->LOAD = ms * SystemCoreClock/1000-1; NVIC_SetPriority(SysTick_IRQn,(1<<__NVIC_PRIO_BITS)-1); SysTick->VAL = 0; SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk| SysTick_CTRL_TICKINT_Msk| SysTick_CTRL_ENABLE_Msk; } /*延時us 這裡裁剪的原子哥的 */ void delay_us(_uint32 nus) { _uint32 ticks; _uint32 told,tnow,tcnt=0; _uint32 reload=SysTick->LOAD; //LOAD的值 ticks=nus*fac_us; //需要的節拍數 told=SysTick->VAL; //剛進入時的計數器值 while(1) { tnow=SysTick->VAL; if(tnow!=told) { if(tnow<told)tcnt+=told-tnow; //這裡注意一下SYSTICK是一個遞減的計數器就可以了. else tcnt+=reload-tnow+told; told=tnow; if(tcnt>=ticks)break; //時間超過/等於要延遲的時間,則退出. } }; } //滴答中斷必須呼叫以下程式碼,是關於任務排程的 void SysTick_Handler() { if(now_task!=0) //如果當前任務不為空則執行任務排程 { //任務排程 tran_delay(); } }
把工程下的HesOS.lib加入工程,HesOS系統檔案只有這3個
說明:本RTOS是借鑑freeRTOS和原子哥部分程式碼,演示工程是原子哥的庫函式點燈工程。