ETAS-AUTOSAR学习-0.1Task配置思考

TASK(OsTask_BSW)
{
   /* Box: Implicit Buffer Initialization begin */
   /* Box: Implicit Buffer Initialization end */
   /* Box: Implicit Buffer Fill begin */
   /* Box: Implicit Buffer Fill end */
   /* Box: BSWImpl1_Xcp begin */
   if ( Rte_RECount_OsTask_BSW_divby500_0 == ((VAR(uint16, AUTOMATIC))0U) )
   {
      Xcp_EventChannel_500msRstr();
   }
   /* Box: BSWImpl1_Xcp end */
   {
      /* Box: BSWImpl4_BSWIMPL_Can begin */
      Can_MainFunction_Write();
      /* Box: BSWImpl4_BSWIMPL_Can end */
   }
   {
      /* Box: BSWImpl4_BSWIMPL_Can begin */
      Can_MainFunction_Read();
      /* Box: BSWImpl4_BSWIMPL_Can end */
   }
   /* Box: BSWImpl14_CanSM begin */
   if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
   {
      CanSM_MainFunction();
   }
   /* Box: BSWImpl14_CanSM end */
   /* Box: BSWImpl3_Com begin */
   if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
   {
      Com_MainFunctionTx();
   }
   /* Box: BSWImpl3_Com end */
   {
      /* Box: BSWImpl4_BSWIMPL_Can begin */
      Can_MainFunction_BusOff();
      /* Box: BSWImpl4_BSWIMPL_Can end */
   }
   {
      /* Box: BSWImpl13_CanTp begin */
      CanTp_MainFunction();
      /* Box: BSWImpl13_CanTp end */
   }
   /* Box: BSWImpl12_MemIf begin */
   if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
   {
      MemIf_Rb_MainFunction();
   }
   /* Box: BSWImpl12_MemIf end */
   /* Box: BSWImpl1_Xcp begin */
   if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
   {
      Xcp_MainFunction();
   }
   /* Box: BSWImpl1_Xcp end */
   /* Box: BSWImpl10_BSWIMPL_BswM begin */
   if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
   {
      BswM_MainFunction();
   }
   /* Box: BSWImpl10_BSWIMPL_BswM end */
   /* Box: BSWImpl11_EcuM begin */
   if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
   {
      EcuM_MainFunction();
   }
   /* Box: BSWImpl11_EcuM end */
   /* Box: BSWImpl9_CanNm begin */
   if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
   {
      CanNm_MainFunction();
   }
   /* Box: BSWImpl9_CanNm end */
   {
      /* Box: BSWImpl8_Dcm begin */
      Dcm_MainFunction();
      /* Box: BSWImpl8_Dcm end */
   }
   /* Box: BSWImpl1_Xcp begin */
   if ( Rte_RECount_OsTask_BSW_divby250_0 == ((VAR(uint8, AUTOMATIC))0U) )
   {
      Xcp_EventChannel_250msRstr();
   }
   /* Box: BSWImpl1_Xcp end */
   {
      /* Box: BSWImpl7_Dem begin */
      Dem_MainFunction();
      /* Box: BSWImpl7_Dem end */
   }
   /* Box: BSWImpl6_NvM begin */
   if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
   {
      NvM_MainFunction();
   }
   /* Box: BSWImpl6_NvM end */
   /* Box: BSWImpl1_Xcp begin */
   if ( Rte_RECount_OsTask_BSW_divby100_0 == ((VAR(uint8, AUTOMATIC))0U) )
   {
      Xcp_EventChannel_100msRstr();
   }
   /* Box: BSWImpl1_Xcp end */
   /* Box: BSWImpl5_BSWIMPL_FiM begin */
   if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
   {
      FiM_MainFunction();
   }
   /* Box: BSWImpl5_BSWIMPL_FiM end */
   {
      /* Box: BSWImpl4_BSWIMPL_Can begin */
      Can_MainFunction_Mode();
      /* Box: BSWImpl4_BSWIMPL_Can end */
   }
   /* Box: BSWImpl3_Com begin */
   if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
   {
      Com_MainFunctionRx();
   }
   /* Box: BSWImpl3_Com end */
   /* Box: BSWImpl2_ComM begin */
   if ( Rte_RECount_OsTask_BSW_divby10_0 == ((VAR(uint8, AUTOMATIC))0U) )
   {
      ComM_MainFunction_ComMChannel_Can_Network_Channel();
   }
   /* Box: BSWImpl2_ComM end */
   /* Box: BSWImpl1_Xcp begin */
   if ( Rte_RECount_OsTask_BSW_divby1000_0 == ((VAR(uint16, AUTOMATIC))0U) )
   {
      Xcp_EventChannel_1kmsRstr();
   }
   /* Box: BSWImpl1_Xcp end */
   /* Box: Implicit Buffer Flush begin */
   /* Box: Implicit Buffer Flush end */
   if ( Rte_RECount_OsTask_BSW_divby10_0 != ((VAR(uint8, AUTOMATIC))0U) )
   {
      Rte_RECount_OsTask_BSW_divby10_0--;
   }
   else
   {
      Rte_RECount_OsTask_BSW_divby10_0 = ((VAR(uint8, AUTOMATIC))9);
   }
   if ( Rte_RECount_OsTask_BSW_divby100_0 != ((VAR(uint8, AUTOMATIC))0U) )
   {
      Rte_RECount_OsTask_BSW_divby100_0--;
   }
   else
   {
      Rte_RECount_OsTask_BSW_divby100_0 = ((VAR(uint8, AUTOMATIC))99);
   }
   if ( Rte_RECount_OsTask_BSW_divby250_0 != ((VAR(uint8, AUTOMATIC))0U) )
   {
      Rte_RECount_OsTask_BSW_divby250_0--;
   }
   else
   {
      Rte_RECount_OsTask_BSW_divby250_0 = ((VAR(uint8, AUTOMATIC))249);
   }
   if ( Rte_RECount_OsTask_BSW_divby500_0 != ((VAR(uint16, AUTOMATIC))0U) )
   {
      Rte_RECount_OsTask_BSW_divby500_0--;
   }
   else
   {
      Rte_RECount_OsTask_BSW_divby500_0 = ((VAR(uint16, AUTOMATIC))499);
   }
   if ( Rte_RECount_OsTask_BSW_divby1000_0 != ((VAR(uint16, AUTOMATIC))0U) )
   {
      Rte_RECount_OsTask_BSW_divby1000_0--;
   }
   else
   {
      Rte_RECount_OsTask_BSW_divby1000_0 = ((VAR(uint16, AUTOMATIC))999);
   }
   TerminateTask();
} /* OsTask_BSW */

假如我把很多Runable放到同一个Task中去调度, 虽然它们确实可以按不同周期调度, 但是这样做有什么缺点?

  • 它们是需要按顺序执行的,比如EcuM_MainFunction();
    和CanNm_MainFunction()执行周期都是10ms, 那么Rte_RECount_OsTask_BSW_divby10_0-- == 0时
    EcuM_MainFunction()先于CanNm_MainFunction()执行,如果EcuM_MainFunction()中有的步骤依赖于CanNm_MainFunction(),需要CanNm_MainFunction()先执行呢?所以这些Runable放置的positon需要仔细考虑。

  • 如果CanNm_MainFunction()中在等待某个状态或者返回结果, 或者说比如获取互斥量(需要等待时间或者需要阻塞), 那么整个Task就被阻塞了(等待N个ticks或者直接从就绪链表中移除, 不再参与调度),后面的Runable不能继续执行。这样的话就不能发挥RTOS的优势之一,即多任务切换, 合理利用CPU。
    比如CanNm_MainFunction()中有类似
    freertos - xSemphrWait(&sem, MAX_DELAY)这种操作,
    如果这步没有获取到信号量, TASK将永远阻塞, 让出CPU使用权, 其他TASK仍然可以被调度,只有其他TASK或中断调用xSemphrSend(&sem)就会将这个阻塞的TASK重新加入就绪链表(如果它优先级高于当前正在运行的TASK,它会立即被调度),
    所以从合理利用CPU使用率的角度,也不太应该把多个Runables放到同一个TASK。
    当然也可在一个TASK中所有Runable中没有需要阻塞和等待的操作(如CanNm_MainFunction()等等),那么上述第二点就不存在。但总归来说还是应仔细考虑Runables和TASK的mapping

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值