2

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

在此处输入图像描述

解释:

  1. RunnableEntity我从端口 1 和 2 获得了一个数据。当有新数据到来时,每个端口将与哪个端口对应。然后,将该RunnableEntity数据设置为InterRunnableVariable。mainRunnableEntityRunnableEntity 1 处理InterRunnableVariable以产生输出。
  2. 数据自由地到达端口并在缓冲区中等待处理。然后,唯一的人RunnableEntity将通过通用全局变量(全局变量的用途与InterRunnableVariable)的一些帮助来处理数据。

我的问题是,

  1. 设计 1 和 2 会起作用吗?
  2. 如果设计 1 和 2 为真,根据时间流程、实施时间等,您更喜欢哪一种?
  3. 代码对吗?如何处理事件和 InterRunnableVariable?

感谢您的帮助。

====================在注释后添加代码========================

设计一

/* 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);
    }
}

设计二

/*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;
}
4

2 回答 2

3

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

即使您只有一个“RunnableEntity”,如第二个设计所示,也可能会发生“TimingEvent”激活“RunnableEntity”DataReceivedEvent以及(尽管我不明白为什么您DataReceivedEvent在第二个设计中遗漏了) . 在这种情况下,“RunnableEntity”在两个不同的上下文中运行,访问相同的数据。

简而言之:我的建议是使用可运行的变量,并让 Rte 处理数据一致性、初始化等。创建软件组件描述可能会花费更多的精力,但是您只需要使用生成的 IrvRead/ IrvWrite 函数,你就完成了。

于 2016-03-12T11:50:08.227 回答
0

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

第二个取决于您的 SWC 描述,因为有端口数据访问的规范。根据这个定义,它取决于 RTE 是否创建阻塞或非阻塞 Rte_Receive。

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

[SWS_Rte_07638] RTE 生成器应拒绝配置,如果具有“事件”语义的 VariableDataPrototype 由 dataReceivePointByValue 角色中的 VariableAccess 引用。(SRS_Rte_00018)

[SWS_Rte_01290]如果 dataReceivePointByArgument 角色中的 VariableAccess 引用具有“事件”语义的所需 VariableDataPrototype,则应生成阻塞 Rte_Receive API,而该语义又由 DataReceivedEvent 引用,而 DataReceivedEvent 由 WaitPoint 引用。(SRS_Rte_00051)

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

还要考虑以下几点:

RTE_E_LOST_DATA实际上意味着,由于传入的数据溢出队列而丢失了数据(Rte_Receive 仅适用于 swImplPoliy = queued,否则如果 swImplPolicy != queued 你得到 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);
}
于 2017-07-22T19:43:35.330 回答