我已经阅读了几个AUTOSAR文档。目前,我担心的是开发软件组件。我有两个软件组件设计,请看下面的图片。
说明:
RunnableEntity
对应,后者在新数据到来时运行。然后,RunnableEntity
将该数据设置为InterRunnableVariable
。 RunnableEntity
的主RunnableEntity 1
将处理InterRunnableVariable
以进行输出。RunnableEntity
将在公共全局变量的帮助下处理数据(全局变量的目的与InterRunnableVariable
相同)。我的问题是,
感谢您的帮助。
====================评论后添加代码======================= =
设计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;
}
答案 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);
}