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

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AUTOSAR OS 模块中,RTE_RESOURCE 是用于实现资源管理的概念,而 Rte_EA_BSWImpl11_CanTp_EXCLUSIVE_AREA 是一个特定区域的名称,用于实现互斥访问的保护机制。 1. RTE_RESOURCE:表示一种资源,它可以被任务或事件处理程序等软件组件使用。资源可以是共享的,多个软件组件可以同时访问;也可以是独占的,只能有一个软件组件在任意时刻访问。RTE_RESOURCE 的配置包括资源的类型、数量和名称等信息。 2. Rte_EA_BSWImpl11_CanTp_EXCLUSIVE_AREA:是一个特定区域的名称,通常是由软件架构师或开发人员定义的。这个名称表示一个互斥区域(Exclusive Area),用于保护对某个共享资源的访问。在该互斥区域内,只允许一个任务或事件处理程序进入并执行,其他任务或事件处理程序需要等待。 为什么需要配两个呢?这是因为 AUTOSAR 中的资源管理机制需要区分资源的定义和资源的使用。RTE_RESOURCE 是用于定义和配置资源的属性和数量,而 Rte_EA_BSWImpl11_CanTp_EXCLUSIVE_AREA 是用于在代码中实际使用该资源时进行保护的互斥区域。通过将 Rte_EA_BSWImpl11_CanTp_EXCLUSIVE_AREA 与 RTE_RESOURCE 关联起来,可以确保在访问共享资源时的互斥性和正确性。 总结起来,RTE_RESOURCE 是资源的定义和配置,而 Rte_EA_BSWImpl11_CanTp_EXCLUSIVE_AREA 是该资源的保护区域,用于实现资源的互斥访问。这两个配合使用可以确保多个软件组件在访问共享资源时的正确性和并发控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值