TencentOs tiny操作系统简单分析

获取源码

下载地址:https://github.com/Tencent/TencentOS-tiny.git


任务分析

本篇基于stm32f4,从任务说起。

M4属于armv7m架构,所以可以查看arch/arm/armv7m/cortex-m4文件下汇编等相关内容。

1.任务怎样创建来的?

编写一个函数,定义为:tos_task_create(),里面需要包含参数:要执行的函数、任务的名称、栈数组、栈的大小、当前任务的优先级等。在tos_task_create()也添加一个任务结构体,存放的就是任务本身所有的属性值,这点跟freertos,LiteOS做法都不同。可见,AliOS与TencentOS tiny代码文化真的很相像,也许是阿里的工程师跑到了腾讯,腾讯的工程师跳槽到了阿里,:-)。


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

定义一个函数,命名为:cpu_task_stk_init(),里面参数需要包括栈数组的基地址,然后是栈大小,再个就是参数与执行的函数。然后就是在栈里面存放寄存器:xPSR、PC、LR、R12、R3、R2、R1、R0,(占位),R11, R10, R9, R8, R7, R6, R5 and R4等的初始化,要注意返回到PSP模式需要存放一个值。

所以知道前面介绍过的LiteOS,freertos,AliOS基本上在这里也是一个套路。

可以看到,AliOS与TencentOS tiny在这个地方的实现基本上一模一样。


3.任务怎么切换?

对于系统运行,要执行第一个任务,可以调用函数:tos_knl_start(),也就是调用__KNL__ void cpu_sched_start(void),也就是调用port_sched_start(),这个函数是使用汇编编写的,它将PENSV与SYSTICK设置为最低优先级,然后是开始任务的切换。任务切换绝对属TencentOS tiny做的最复杂。

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

在普通任务中,可以调用函数tos_task_delay(),最终它需要调用到tos_task_yield(),也就是void knl_sched(void);也就是cpu_context_switch(),也就是port_context_switch(),这个函数是一个汇编函数,其实是触发PENDSV中断。

对于周期调用的void SysTick_Handler(void)中断,它会调用到void tos_knl_irq_leave(void);然后会调用到cpu_irq_context_switch(),最终会调用到port_irq_context_switch(),它也是一个汇编函数,也是触发的PENDSV中断。也可以发现,这个函数与port_context_switch()内容完全一样。

所以,也没什么新奇的,跟前面讲的LiteOS和freertos与AliOS-Things套路还是一样的。

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

TencentOS tiny与AliOS和LiteOS处理一样,都是简单粗暴的操作PRIMASK,这就没有什么好说的了。而在中断中,TencentOS tiny是增加一个变量k_irq_nest_cnt,处理临界资源的时候,并不关中断,这跟freertos的任务allsuspend有点像,不过TencentOS tiny在中断中这么做效率如何,就需要它好好测试一番了。


本篇也持续更新。。。


分享到:


相關文章: