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和原子哥部分代码,演示工程是原子哥的库函数点灯工程。