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个

具体可以参考实例工程:https://download.csdn.net/download/hes_c/10667667

说明:本RTOS是借鉴freeRTOS和原子哥部分代码,演示工程是原子哥的库函数点灯工程。

猜你喜欢

转载自blog.csdn.net/HES_C/article/details/82706567