У меня есть несколько документов AUTOSAR. На данный момент моя забота - это просто разработка программного компонента. У меня два дизайна программного обеспечения, взгляните на картинку ниже.Компонент программного обеспечения Autosar
Объяснение:
- я получил данные из порта 1 и 2. Каждый из портов будет соответствие с
RunnableEntity
, который работает, когда новые данные приходят. ЗатемRunnableEntity
устанавливает эти данные вInterRunnableVariable
. ОсновнойRunnableEntity
, который являетсяRunnableEntity 1
, обработаетInterRunnableVariable
, чтобы сделать вывод. - Данные свободно поступают в порт и ожидают продолжения в буфере. Затем только один
RunnableEntity
обработает данные с помощью общей глобальной переменной (Цель глобальной переменной такая же, как и сInterRunnableVariable
).
Мои вопросы,
- спроектируют 1 и 2 работы?
- Если дизайн 1 и 2 являются истинными, какие вы предпочитаете в соответствии с процессом времени, временем выполнения и т. Д.?
- Действительно ли коды? как обрабатывать событие и InterRunnableVariable?
Благодарим за помощь.
==================== Добавление кода после комментария ====================== ==
Design 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);
}
}
Design 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;
}
еще раз спасибо за ваш ответ. Вы отлично себя чувствуете в AUTOSAR. 1. Я, хотя этот буфер в первом дизайне и второй конструкции обрабатывается RTE. 2. Пожалуйста, взгляните на код второго дизайна, поэтому я не использовал DataReceivedEvent. Если я прав. –
Второй дизайн выглядит плохо для меня. Особенно цикл, ожидающий новых данных, занят ожиданием, означающим, что он может заблокировать весь ECU. Для этого вы должны использовать DataReceivedEvents или настроить блокировку Rte_Receive (Rte будет ждать через WaitEvent(), а не ожидание). Кроме того, я все еще не уверен, если вы столкнетесь с проблемой параллелизма, если две разные runnables читают/изменяют один и тот же глобальный буфер. В целом первый код выглядит намного меньше. – ZzetT
На самом деле, я думал, что часть второй конструкции использует неблокирующий Rte_receive. Таким образом, мне не нужна точка ожидания и DataReceivedEvents. Я прав? Это событие все еще меня путает. –