欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

stm32 Ctext-M3内核最简单的多任务RTOS

程序员文章站 2024-02-22 18:10:10
...

   RTOS 实时操作系统,我做的是一个多任务的操作系统,可以同时运行多个任务,我这里设置的最大任务数是32个,

估计跑30多个任务的嵌入式设备很少吧,32个任务够用了。

OS我把它叫做HesOS,主要功能如下,比较简单。

1--实现多任务调度

2--实现任务调度锁

3--实现临界区保护

4--实现读取cpu使用率(这个功能比较重要的)

5--实现us延时(用于模拟如IIC总线模拟)

对于一般的嵌入式应用有这些功能,差不多够用了。

移植HesOS也非常简单,不会像其它的OS一样比较庞大,修改的地方也比较多,使用起来也复杂。

HesOS不管是移植和使用都是非常简单的,类似于PC的线程使用。

主函数初始化:系统一共跑了10个任务。

stm32 Ctext-M3内核最简单的多任务RTOS

部分任务定义:

stm32 Ctext-M3内核最简单的多任务RTOS

打印cpu使用量任务:

stm32 Ctext-M3内核最简单的多任务RTOS

不能在所有任务里串口打印,因为串口打印非常的占用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个

stm32 Ctext-M3内核最简单的多任务RTOS

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

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

相关标签: RTOS