×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-08-31 发布时间:
|

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>

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

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


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
基于arm的指纹识别门禁系统是如何设计的