今天来学习一下实时操作系统ucos II
至于具体为什么要学UCOS II 以及为什么要选择UCOSII而不是UCOS I 或者III 其实我是说不上来的
因为手头只有野火的开发板,并且野火的资料支持也是相当的丰富,所以便立即拿来例程烧了进去。
好了废话不多说,
首先先简述一下ucos的好处,或者说操作系统的好处
在裸板开发中,通常我们的程序是一条指令一条指令来运行的,
通常情况下,如果我们恰好有一个非常重要的函数要运行呢,就必须等待系统指令周期的开始到结束。
在这种情况下,所有的指令的响应周期是一定的,也就是所有函数要被执行都要算在系统周期里面的。
那么假如说,我有一个对时间要求精度非常高的采样函数,并且无法使用计时器/定时器中断来完成,
我就要在main中的一个while中完成我数据的采样然后显示在屏幕上。
那么大家就会说,系统的周期是不确定的,并且还要花时间把采样得到的数据打印输出到屏幕上。时
间精度根本无法保证!
在这种裸板开发的情况下,系统通常是单线程的,所以当有多个任务执行时常常是串行触发的(完成
上一任务,下一任务才有可能被执行),这是阻塞式的响应机制虽然说能应对大多数情,但是对某种
特殊多任务情况下,往往是难以满足需要的。
例如上段时间的NRF超车触发程序。在当时的情况下,NRF接收或者发送往往是要多次执行的,但是多次
执行又类似于延时函数,在智能车高速执行过程中,任何一种延时函数无异于作茧自缚。
既然操作系统这么牛逼,那么就马上进入正题:
BSP_Init(); //板载IO初始化
OSInit();
OSTaskCreate(Task_Start,(void *)0,&startup_task_stk[STARTUP_TASK_STK_SIZE-1], STARTUP_TASK_PRIO);
OSStart();
其中BSP_Init()为板载IO的初始化,不难理解就是用到GPIO我就初始化GPIO等等
OSInit();为ucosII 系统初始化 不必关心。
OSTaskCreate();为任务的创建函数,其中第一个函数是函数指针,指向你执行任务的函数
第二个函数是函数栈,后面再划重点讲解
第三个参数为任务的优先级,在ucosII中一共64个任务优先级
0~63 其中越小代表优先级越高
OSStart(); 为开始执行任务,不多赘述。
一个完整的ucos工程就包含这四个部分,其中BSP_Init()为我们提供板载级别额的底层驱动lib,而OSTaskCreate();则负责将我们的task创建并且给予相应的任务优先级,基于执行的权利。
但对于OSInit();OSStart();的部分,由于目前的我道行未深,不敢乱碰。
这就是今天的学习总结!