2016-03-11 4 views
0

У меня есть несколько документов AUTOSAR. На данный момент моя забота - это просто разработка программного компонента. У меня два дизайна программного обеспечения, взгляните на картинку ниже.Компонент программного обеспечения Autosar

enter image description here

Объяснение:

  1. я получил данные из порта 1 и 2. Каждый из портов будет соответствие с RunnableEntity, который работает, когда новые данные приходят. Затем RunnableEntity устанавливает эти данные в InterRunnableVariable. Основной RunnableEntity, который является RunnableEntity 1, обработает InterRunnableVariable, чтобы сделать вывод.
  2. Данные свободно поступают в порт и ожидают продолжения в буфере. Затем только один RunnableEntity обработает данные с помощью общей глобальной переменной (Цель глобальной переменной такая же, как и с InterRunnableVariable).

Мои вопросы,

  1. спроектируют 1 и 2 работы?
  2. Если дизайн 1 и 2 являются истинными, какие вы предпочитаете в соответствии с процессом времени, временем выполнения и т. Д.?
  3. Действительно ли коды? как обрабатывать событие и 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; 
} 

ответ

2

Я думаю, что оба решения возможны. Основное отличие состоит в том, что в первом решении сгенерированный Rte будет управлять глобальным буфером, тогда как во втором дизайне вы должны сами заботиться о буферах. Особенно, если у вас есть несколько runnables, обращающихся к одному и тому же буферу, «Rte» будет либо генерировать блокировки прерываний для защищенной согласованности данных, либо оптимизирует блокировки, если контекст задачи в том, что запущены «RunnableEntities», не может прерывать друг друга.

Даже если у вас есть только один «RunnableEntity», как показано во втором дизайне, может случиться так, что «TimingEvent» активирует «RunnableEntity» и DataReceivedEvent (хотя я не понимаю, почему вы оставили DataReceivedEvent во втором исполнении). В этом случае «RunnableEntity» работает в двух разных контекстах, получающих доступ к тем же данным.

Чтобы сделать его коротким: мое предложение состоит в использовании переменных, которые могут быть перекрещиваемыми, и пусть Rte обрабатывает согласованность данных, инициализацию и т. Д. Возможно, потребуется немного больше усилий для создания описания компонента программного обеспечения, но тогда вам просто нужно используйте созданные функции IrvRead/IrvWrite, и все готово.

+0

еще раз спасибо за ваш ответ. Вы отлично себя чувствуете в AUTOSAR. 1. Я, хотя этот буфер в первом дизайне и второй конструкции обрабатывается RTE. 2. Пожалуйста, взгляните на код второго дизайна, поэтому я не использовал DataReceivedEvent. Если я прав. –

+1

Второй дизайн выглядит плохо для меня. Особенно цикл, ожидающий новых данных, занят ожиданием, означающим, что он может заблокировать весь ECU. Для этого вы должны использовать DataReceivedEvents или настроить блокировку Rte_Receive (Rte будет ждать через WaitEvent(), а не ожидание). Кроме того, я все еще не уверен, если вы столкнетесь с проблемой параллелизма, если две разные runnables читают/изменяют один и тот же глобальный буфер. В целом первый код выглядит намного меньше. – ZzetT

+0

На самом деле, я думал, что часть второй конструкции использует неблокирующий Rte_receive. Таким образом, мне не нужна точка ожидания и DataReceivedEvents. Я прав? Это событие все еще меня путает. –

0

Я на самом деле предпочитаю здесь первую.

Вторая часть немного зависит от вашего описания SWC, поскольку существует спецификация доступа к данным порта. Из этого определения зависит, если RTE создает блокирующий или неблокирующий Rte_Receive.

[SWS_Rte_01288] Неблокирующий Rte_Receive API, должны быть созданы, если VariableAccess в роли dataReceivePointByArgument ссылается на требуемую VariableDataPrototype с «событие» семантикой. (SRS_Rte_00051)

[SWS_Rte_07638] Генератор РТА отклоняет конфигурация была в VariableDataPrototype с «событием» семантика ссылается VariableAccess в роли dataReceivePointByValue. (SRS_Rte_00018)

[SWS_Rte_01290] Блокирующий Rte_Receive API, должен генерироваться, если VariableAccess в роли dataReceivePointByArgument ссылается на требуемую VariableDataPrototype с «событие» семантики, что, в свою очередь, ссылается на DataReceivedEvent и DataReceivedEvent ссылается на WaitPoint. (SRS_Rte_00051)

С другой стороны, я не уверен, что происходит с вашим блокированием Rte_Receive против вашей TimingEvent основы RunnableEntity вызова.

Также рассмотреть следующий:

RTE_E_LOST_DATA на самом деле означает, что вы потеряли данные из-за поступающие данные переполнения очереди (Rte_Receive работает только с swImplPoliy = очередью, в противном случае, если swImplPolicy = очередь вы получите Rte_Read!). Это не excplicit значение 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); 
} 
Смежные вопросы