Autosar软件组件

时间:2016-03-11 08:12:27

标签: autosar

我已经阅读了几个AUTOSAR文档。目前,我担心的是开发软件组件。我有两个软件组件设计,请看下面的图片。

enter image description here

说明:

  1. 我从端口1和2获得数据。每个端口都与RunnableEntity对应,后者在新数据到来时运行。然后,RunnableEntity将该数据设置为InterRunnableVariableRunnableEntity的主RunnableEntity 1将处理InterRunnableVariable以进行输出。
  2. 数据自由进入端口并等待继续进入缓冲区。然后,只有一个RunnableEntity将在公共全局变量的帮助下处理数据(全局变量的目的与InterRunnableVariable相同)。
  3. 我的问题是,

    1. 设计1和2会起作用吗?
    2. 如果设计1和2都是真的,那么根据时间过程,实施时间等,您更喜欢哪一个?
    3. 代码是否合适?如何处理事件和InterRunnableVariable?
    4. 感谢您的帮助。

      ====================评论后添加代码======================= =

      设计1

      /* Runnable Entity 1*/
      /* Event : TimeEvent 25ms */
      void re1(void){
          data_output out;
          irv irv1 = Rte_IrvIread_re1_irv1(); 
          irv irv2 = Rte_IrvIread_re1_irv2();
          irv irv3 = Rte_IrvIread_re1_irv3();
      
          out = DataProcess(&irv1,&irv2,&irv3);
      
          Rte_Write_re1_port3_out();
      }
      
      /* Runnable Entity 2*/
      /* Event : DataReceiveErrorEvent on port1 */
      void re2(void){     
          irv irv2 = Rte_IrvIread_re1_irv2();
      
          modify(&irv2);
      
          Rte_IrvIwrite_re1_irv2(irv2);
      }
      
      /* Runnable Entity 3*/
      /* Event : DataReceiveEvent on port1 */
      void re2(void){
          data_input1 in;
          Std_RetrunType status;
      
          irv irv1 = Rte_IrvIread_re1_irv1(); 
          status = Rte_Receive_re1_port1_input(&in);
          if (status == RTE_E_OK) {
              modify(&irv1,in);
              Rte_IrvIwrite_re1_irv1(irv1);
          }
      }
      
      /* Runnable Entity 4*/
      /* Event : DataReceiveEvent on port2 */
      void re2(void){
          data_input2 in;
          Std_RetrunType status;
      
          irv irv3 = Rte_IrvIread_re1_irv3(); 
          status = Rte_Receive_re1_port2_input2(&in);
          if (status == RTE_E_OK) {
              modify(&irv3,in2);
              Rte_IrvIwrite_re1_irv3(irv3);
          }
      }
      

      设计2

      /*Global Variable*/
      global_variable1 gvar1; /* Equal with InterVariable 1 in Design 1*/
      global_variable2 gvar2; /* Equal with InterVariable 2 in Design 1*/
      global_variable3 gvar3; /* Equal with InterVariable 3 in Design 1*/
      
      /* Runnable Entity 1*/
      /* Event : TimeEvent 25ms */
      void re1(void){
          data_output out;
          GetData1()
          GetData2()
      
      
          out = GetOutputWithGlobalVariable();
      
          Rte_Write_re1_port3_out(out);
      }
      
      /* Get Data 1*/
      void getData1(){    
          Std_ReturnType status; /* uint8  */
          data_input1 in;
      
          do {
              status = Rte_Receive_re1_port1_input1(&in);
              if (status == RTE_E_OK) {
                  modifyGlobalVariable(in);
              }
          } while (status != RTE_E_NO_DATA && status != RTE_E_LOST_DATA);
      
          if(status != RTE_E_LOST_DATA){
              modifyGlobalVariableWhenError();
          }
          return;
      }
      
      /* Get Data 2*/
      void getData2(){    
          Std_ReturnType status; /* uint8  */
          data_input2 in;
      
          do {
              status = Rte_Receive_re1_port2_input2(&in);
              if (_status == RTE_E_OK) {
                  modifyGlobalVariable2(in);
              }
          } while (status != RTE_E_NO_DATA && status != RTE_E_LOST_DATA);
      
          return;
      }
      

2 个答案:

答案 0 :(得分:3)

我认为这两种解决方案都是可行的。主要区别在于,在第一个解决方案中,生成的Rte将管理全局缓冲区,而在第二个设计中,您必须自己处理缓冲区。 特别是如果你有多个runnable访问同一个缓冲区,'Rte'将生成对受保护数据一致性的中断锁,或者如果'RununableEntities'正在运行的任务上下文不能互相中断,它将优化锁。

即使您在第二个设计中只有一个'RunnableEntity','TimingEvent'也可能会激活'RunnableEntity'和DataReceivedEvent(虽然我不明白为什么你在第二个设计中遗漏了DataReceivedEvent。在这种情况下,'RunnableEntity'在两个不同的上下文中运行,访问相同的数据。

简而言之:我的建议是使用可互换的变量,让Rte处理数据的一致性,初始化等。 创建软件组件描述可能需要更多的努力,但是您只需要使用生成的IrvRead / IrvWrite函数即可完成。

答案 1 :(得分:0)

我实际上更喜欢这里的第一个。

第二个取决于您的SWC描述,因为有端口数据访问的规范。如果RTE创建阻塞或非阻塞Rte_Receive,则取决于此定义。

[SWS_Rte_01288] 如果dataReceivePointByArgument角色中的VariableAccess引用了具有“event”语义的必需VariableDataPrototype,则应生成非阻塞Rte_Receive API。 (SRS_Rte_00051)

[SWS_Rte_07638] RTE Generator将拒绝配置为VariableDataPrototype,其中'event'语义由dataReceivePointByValue角色中的VariableAccess引用。 (SRS_Rte_00018)

[SWS_Rte_01290] 如果dataReceivePointByArgument角色中的VariableAccess引用了所需的VariableDataPrototype,其中包含'event'语义,则应生成阻塞Rte_Receive API转向,由DataReceivedEvent引用,DataReceivedEvent由WaitPoint引用。  (SRS_Rte_00051)

另一方面,我不确定阻止Rte_Receive与基于TimingEvent的RunnableEntity调用会发生什么。

还要考虑以下事项:

RTE_E_LOST_DATA 实际上意味着,由于传入数据溢出队列而导致数据丢失(Rte_Receive仅适用于swImplPoliy =排队,否则如果swImplPolicy!=排队,则会获得Rte_Read)。这不是一个明确的Std_ReturnType值,而是添加到该返回值的标志 - > OverlayedError)

RTE_E_TIMEOUT 将用于阻止Rte_Receive

RTE_E_NO_DATA 将用于非阻塞Rte_Receive

然后你应该检查:

Std_ReturnType status;
status = Rte_Receive_..(<instance>, <parameters>);
if (Rte_HasOverlayedError(status)) {
    // Handle e.g. RTE_E_LOST_DATA
}
// not with Rte_Receive - if(Rte_IsInfrastructureError(status)) { }
else { /* handle application error with error code status */
    status = Rte_ApplicationError(status);
}