alios-Things操作系统简单分析

获取源码


源码下载地址:https://github.com/alibaba/AliOS-Things.git


谈一下如果从github下载alios速度过慢,怎样加快下载速度。这里有一个办法就是将代码放到gitee中,然后从gitee中下载。


方法如:


alios-Things操作系统简单分析


alios-Things操作系统简单分析


alios-Things操作系统简单分析

先简单说说Alios系统:

它的内核目录下包含bus,cli,rhino(真正的内核代码目录),fs,init等等,不知道架构师怎么考虑的,这样的目录组织明显不合理。相较而言LiteOS分配得更好。

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

Alios-things系统支持多核。但是这里不分析多核处理。

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

1.任务怎样创建来的?

编写一个函数,定义为:krhino_task_create(),里面需要包含参数:任务id,要执行的函数、任务的名称、栈数组、栈的大小、当前任务的优先级等。在krhino_task_create()也添加一个任务结构体,存放的就是任务本身所有的属性值,这点跟freertos,LiteOS做法都不同。AliOS操作栈简直到了凶狠的程度(参数特别多)。


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

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

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


3.任务怎么切换?

对于系统运行,要执行第一个任务,可以调用函数:cpu_first_task_start(),这个函数是使用汇编编写的,它将PENSV与SYSTICK设置为最低优先级,然后开启PENSV中断。之后就是一通操作猛如虎,感觉就AliOS把这任务切换做的复杂了。

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

在普通任务中,可以调用函数krhino_task_sleep(),最终它需要调用到RHINO_CRITICAL_EXIT_SCHED(),也就是void core_sched(void);也就是cpu_task_switch(),这个函数是一个汇编函数,最终仍然是触发PENDSV中断。

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

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


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

AliOS和LiteOS处理一样,都是简单粗暴的操作PRIMASK,这就没有什么好说的了。AliOS在任务和中断中统一都是操作PRIMASK。


本篇仍然持续更新。。。


分享到:


相關文章: