1. 程式人生 > >stm32 Ctext-M3核心最簡單的多工RTOS

stm32 Ctext-M3核心最簡單的多工RTOS

   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和原子哥部分程式碼,演示工程是原子哥的庫函式點燈工程。