LiteOS简单分析一波

代码下载

Liteos源码地址:https://gitee.com/LiteOS/LiteOS.git

这篇紧跟着我前面说的freertos来做一些基本的对比。


本篇是从gitee下载的,版本未知(看来LiteOS代码写的有点不上心啊)。基于

<code>LiteOS\\targets\\Cloud_STM32F429IGTx_FIRE\\MDK-ARM/<code>

来分析的。


谈谈LiteOS任务\u0006\u0012\u0013\u0012\u0013\u0012\u0018\u0018\u0012\u0001

1.任务怎样创建来的?

编写一个函数,定义为:LOS_TaskCreate(),里面需要包含参数:任务id,要执行的函数、任务的名称、栈的大小、当前任务的优先级等。与freertos不同的是,liteos的栈数组在其他函数中操作的。另外,liteos事先就定义了n个任务

,组成了一个数组,这个id就是数组的下标。明显的,liteos这样做是不合适的,因为白白的浪费了空间,而如果不浪费,则需要自己去计算任务有多少个,然后修改定义出来的任务数。


2.任务的私有信息需要怎么存放?

定义一个函数,命名为:osTskStackInit(),里面包含的就是xPSR、PC、LR、R12、R3、R2、R1、R0,R11, R10, R9, R8, R7, R6, R5 and R4等的初始化,要注意返回到PSP模式需要存放一个值。定义一个结构体tagTskContext,里面已经将寄存器顺序都排列好了。


3.任务怎么切换?

对于系统运行,要执行第一个任务,可以调用函数:LOS_StartToRun(),这个函数是使用汇编编写的,看起来其实没必要这么干,因为它只是系统启动以后只用一次的函数。目测是为了和其他系统区分开,可能是避免人家说它抄袭的太多,:-)。


之后则是多个任务之间进行调度。


在普通任务中,可以调用函数LOS_TaskDelay(),其实就是调用LOS_TaskYield(),实际干活的则是LOS_Schedule()里面的osSchedule(),也就是osTaskSchedule(),有没有绕晕的感觉。

它里面也一样,只需要设置PENDSV位就可以了,这样就能做到PENDSV中断产生。PENDSV中断服务函数是PendSV_Handler()。这个函数作用就是切换到应该切换到的任务中。

在中断服务函数中, 可以调用osTaskScan(),则会调用到LOS_Schedule(),也就能切换任务了。

4.访问同一个资源(变量)如何处理?

对于LiteOS处理起来就很简单了,直接粗暴的操作PRIMASK。所以感觉LiteOS相比freertos有很多的内容需要系统开发人员再继续琢磨。


关于LiteOS的任务这块先说到这里,还是持续更新吧。


分享到:


相關文章: