前言
一直想深入了解下物流网、IOT,跟上时代潮流。去年alios things推出的时候,就自己买了一块alios-things developer开发版,一直放在办公室的抽屉里,没有用起来。现在alios-things都已经更新到3.0版,最近决定把alios-things捡起来,又把这块板找出来了,因为开发版是基于2.0版的,因此还是基于alios-things 2.0版学习。 在工作中项目开发用ucos比较多,alios-things的rhino内核代码风格和架构有点类似,代码阅读起来有点熟悉的感觉。本篇先总结内核的任务管理相关的内容。 对于一个内核来说,进程管理是其一个关键功能。对于一个实时操作系统来说,进程调度策略以及其使用的数据结构对系统实时性影响很大,因此首先从进程管理开始学习。1.rhino进程的生命周期
所有的内核的生命周期都相似,下图是rhino的的一个进程生命周期。
2. rhino进程数据结构
2.1 rhino进程结构体
/* task control information */
typedef struct {
进程名称
const name_t *task_name;
cpu_stack_t *task_stack_base;
uint32_t stack_size;
进程链表节点
klist_t task_list;
#if (RHINO_CONFIG_TASK_SUSPEND > 0)
suspend_nested_t suspend_count;
#endif
struct mutex_s *mutex_list;
进程休眠计数链表节点
klist_t tick_list;
tick_t tick_match;
tick_t tick_remain;
klist_t *tick_head;
void *msg;
task_stat_t task_state;
blk_state_t blk_state;
/* Task block on mutex, queue, semphore, event */
blk_obj_t *blk_obj;
进程优先级
uint8_t prio;
/* base prio */
uint8_t b_prio;
uint8_t mm_alloc_flag;
} ktask_t;
3. rhino进程就绪链表
3.1 rhino结构体
runqueue_t g_ready_queue;
typedef struct {
klist_t *cur_list_item[RHINO_CONFIG_PRI_MAX];
uint32_t task_bit_map[NUM_WORDS];
uint8_t highest_pri;
} runqueue_t;
alios-things内核为每个进程优先级都维护一个任务链表,并使用全局变量g_ready_queue保存链表头
3.2 rhino就绪进程链表
4. rhino进程的调度策略
alios-things的提供两种进程调度策略: KSCHED_RR和KSCHED_FIFO。
KSCHED_RR:给每个任务分配置一个时间片,然后依次轮转运行,当进程的时间到时,无论这个任务的优先级多高,都会进入就绪状态,然后等待下一个时间片到来。
KSCHED_FIFO:让任务按照先后顺序执行,先执行完一个任务,在按顺序执行下一个任务。
5. rhino进程管理
从前面的任务生命周期我们可知道,任务可以处于不同状态,下面介绍具体的改变进程状态的内核接口。