Erika2 OS上下文切换机制--Apple的学习笔记

今天继续看Erika2 OS代码,发现这不是我理想中的操作系统,因为它没有类似于delay这样的阻塞函数,最主要的是task切换居然不用给A11地址赋值。而是采用指针函数直接call地址。

让我觉得鄙视,它主要是鉴别出最高优先级task,在切换task函数前仅初始化了stack,所以callstack调试窗口中还能看到来龙去脉,也就是说我理解Erika2应该是不支持Freertos中类似task函数中使用delay的函数设计机制进行挂起,而只是event没有置位,但是alarm周期时间到后,需要添加if(event==ok)来判断是否能进入if中的函数进行执行。当然它也有优点,不用指针那么就符合misra,另外可以支持协作式OS。对应周期task非时间的,stack空间可以共用。汽车行业一般也就是alarm触发纯周期任务,或者再加一个event触发的任务。种类比较少。不想看这种保守设计了。我现在想想之前看到过的miniOS就是用bitmask来判断优先级然后通过指针函数调用对应bit位的task,并且初始化的时候stack空间都mapping到固定地址段,就完成了miniOS,基本思路和Erika2是类似的。

static void __NEVER_INLINE__ EE_tc_dummy_context( EE_TID tid )
{
  /* Previous Context from this point is the first context to be freed */
  EE_terminate_data[tid] = EE_tc_get_pcxi();

  /* Task funtion call */
  EE_terminate_real_th_body[tid]();
  ....
}

如下为task上下文切换的关键函数和code

EE_rq_queryfirst();/*取出最高优先级的任务。*/

EE_th_status[rq] = RUNNING/* 将此任务设置为最高优先级 */

EE_th_next[temp] = EE_stkfirst;  /* next thread入队 */

EE_std_change_context();  /*切换上下文函数*/

    /* Switch Stack */
    if ( tos_from != tos_new ) {
      /* Save context information per Stack */
      EE_tc_stack_save(tos_from);
      EE_tc_active_tos  = tos_new;
      EE_tc_stack_restore(tos_new);
    }

__INLINE__ void __ALWAYS_INLINE__ EE_CHANGE_STACK_POINTER
  EE_tc_stack_restore( EE_UREG tos )
{
  struct EE_TC_TOS  * const p_tos = &EE_tc_system_tos[tos];
  EE_ADDR             const sp    = p_tos->ram_tos;
  EE_UREG             const pcxi  = p_tos->pcxi_tos;

  EE_tc_set_SP(sp);
  EE_tc_set_pcxi(pcxi);
}

你可能感兴趣的:(Erika2 OS上下文切换机制--Apple的学习笔记)