OSInit(&err)中开启的系统任务
将开启两个必要任务和两个可选任务:
OS_IntQTaskInit(&p_err)[OS_CFG_ISR_POST_DEFERRED_EN]
OS_IdleTaskInit(&p_err)
OS_TickTaskInit(&p_err)
OS_StatTaskInit(&p_err)[OS_CFG_STAT_TASK_EN]
OS_IntQTask的小动作
中断队列任务的作用,发送消息队列;……
任务的由来
- 任务由OSInit(*p_err) –调用->OS_IntQTaskInit(*p_err)创建。
初始化
- 初始化一个OS_CFG_INT_Q_SIZE长度的消息队列。
- 开始OS_IntQTask()任务。
OS_IntQTask任务
- 如果消息队列里存在消息,则逐条发送完成。发送过程通过调用OS_XXXX_Post()系列函数实现消息发送。
- 如果消息队列里没有消息,则做一些清除工作,并执行调度器。
OS_IntQTask任务的思考
OS_IdleTask任务
优先级最低的任务(OS_CFG_PRIO_MAX),并且强制要求同级不能有其他的任务存在。
统计系统进入Idle模式的时间计数
协助OS_StatTask任务进行CPU占用率计算
OS_TickTask任务
所包含的任务列表是用来进行延时的,优先级比Idle任务高,默认与Stat任务处于同一任务优先级,OS_CFG_PRIO_MAX - 1u。
a.等待tick 中断释放信号量
b.更新Tick 列表的时间戳
c.回到a继续挂起信号量
OS_StatTask任务
统计CUP的占用率,CPU Idle模式下的计数工作留给OS_IdleTask中完成。优先级,仅比Idle任务高一级(OS_CFG_PRIO_MAX - 1u),默认与Tick任务在同一优先级。
OS_TrmTask任务
一个基于Tick分频得到的定时器任务,默认计数频率10Hz。
a.等待Tmr信号量释放
b.锁定调度器
c.更新定时器状态,如果是周期(OS_OPT_TMR_PERIODIC)的,先将定时器从列表中删除,然后重新插入;如果是单次(OS_OPT_TMR_ONE_SHOT)的,将定时器从列表中删除,并标记为延时完成(OS_TMR_STATE_COMPLETED)的。
d.执行回掉函数
e.解锁调度器,更新任务最长执行时间。
小结
a.在OS_Init中进行了OS全局变量的清零工作
b.创建了5个任务,其中Idle和Tick任务是必选任务,IntQ和Stat任务是可选任务,另外开启一个常用的定时器任务TmrTask。
c.所有任务中IntQ任务独自占有最高优先级0;Idle任务独自占有最低优先级OS_CFG_PRIO_MAX;Stat和Tick任务分享次低优先级OS_CFG_PRIO_MAX-1u;TmrTask任务的默认优先级是OS_CFG_PRIO_MAX-2u