Page 1 of 1

Структуры данных в блоке управления

Posted: Thu Dec 19, 2013 6:35 pm
by acab
Обнаружил дикую особенность, нет как таковой структуры единой для данных в блоке управления двигателем.
Подобня структура(структуры) будут полезны, для всего мозга в целом, например, для того чтобы узнать текущую температуру двигла или обороты в любом из модулей. Плюс будут данные о конфиге, например о включенных ништяках и их настройках(буст контроллер, режим работы вентилятора и прочее).

Так как я немного перешёл с самодельного минимозга от Atmel с ARM архитектурой. Немного поделюсь кодом, который я имел под рукой:

Code: Select all

struct ecu_info
{
        U8              ecu_status,
                        ecu_version,
                        fan_speed_status,
                        cruise_control_status,
                        cruise_control_last_speed,
                        car_speed;
                       
        U16             engine_rpm_request_idle_1,
                        engine_rpm_request_idle_2,
                        // Vars for Electronic Throttle
                        throttle_accelerator_1,
                        throttle_accelerator_min_1,
                        throttle_accelerator_max_1,
                        throttle_accelerator_2,
                        throttle_accelerator_min_2,
                        throttle_accelerator_max_2,
                        throttle_body_1,
                        throttle_body_min_1,
                        throttle_body_max_1,
                        // End
                        engine_rpm;
        S16             engine_clt;
} rusefi;


Re: Структуры данных в блоке управления

Posted: Thu Dec 19, 2013 6:49 pm
by AndreyB
Мысль, которую у тебя не получается выразить, звучит примерно так:
"если бы у нас было бы ООП, то нам нужен бы был объект Engine"

Да, если у нас был бы ООП - у нас был бы объект Engine, в котором бы всё было удобно в одном месте. Перейти на С++ кстати ПОТЕНЦИАЛЬНО можно подумать, КСТАТИ. В отдельном топике, конечно же. И кому-то нужно будет про это думать, конечно же...

Вернёмся к объекту Engine. У нас тут бедность языка С. Структура EngineState - это конечно в чём-то да, похоже - но меня смущет, что это структура, а не объект. А структуру кто-то когда-то должен наполнять. Кто и когда будет писать значение currentMapSensorValue в это значение? По какому расписанию? Получается дикий шайтан.

Вывод: что делать - не ясно. Но структура EngineState мне кажется добавит граблей только. Я бы посоветовал изучить вопрос С++, если чешутся руки.

Re: Структуры данных в блоке управления

Posted: Thu Dec 19, 2013 7:38 pm
by Sergey89
То что в первом посте описано похоже на god object со всеми его недостатками. Но если его разбить на несколько структур, то вроде как и можно с ним работать.

Можно ведь и в си передавать указатель на структуру.

Code: Select all

set_value(object_t *this, int value) {
    this->property = value;
}
Похоже на работу с объектами?

Наследование заменить на делегирование.

Или это всё печально?

Re: Структуры данных в блоке управления

Posted: Thu Dec 19, 2013 7:45 pm
by AndreyB
Да, я примерно так и делаю уже сейчас - но всё-таки это решение не идеальное. Например понять список всех методов объекта как? И так далее.

Re: Структуры данных в блоке управления

Posted: Thu Dec 19, 2013 7:52 pm
by Sergey89
ClassName_MethodName только такой вариант приходит в голову. Он кстати и применяется во многих библиотеках.

Re: Структуры данных в блоке управления

Posted: Thu Dec 19, 2013 7:54 pm
by AndreyB
Sergey89 wrote:ClassName_MethodName только такой вариант приходит в голову. Он кстати и применяется во многих библиотеках.
Да, есть разные сорта извратов - зачаток ''ClassName_MethodName' в виде '[classPrefix]MethodName' у меня тоже есть.

Re: Структуры данных в блоке управления

Posted: Thu Dec 19, 2013 8:15 pm
by AndreyB
acab wrote:Плюс будут данные о конфиге, например о ... настройках
Все настройки живут в EngineConfiguration
Если пока не живут - значит нужно рефакторить, например #31

Re: Структуры данных в блоке управления

Posted: Fri Dec 20, 2013 8:23 am
by Kot_dnz
russian wrote:
acab wrote:Плюс будут данные о конфиге, например о ... настройках
Все настройки живут в EngineConfiguration
Если пока не живут - значит нужно рефакторить, например #31
Я в общем понимаю идею acab-а и уже говорил об этом, но т.к. есть более важные сейчас вопросы, то нужно решать их.
EngineConfiguration - это структура окружения (объем цилиндров, их кол-во, т.п.)
EngineStatus (или как то там) - это структура, которую заполняют все обработчики периферии (текущиие значения обротов, ДАД, AFR...) - ведь мы же не знаем когда они заканчивают свою работу? Кто за 0,5сек, кто-то за 0,005... В итоге событийные прерырвания не начинают опрашивать "что у нас там?", а делают очень быстрые вычисления по тому, что в этой структуре.

Re: Структуры данных в блоке управления

Posted: Fri Dec 20, 2013 12:09 pm
by AndreyB
Kot_dnz wrote:В итоге событийные прерырвания не начинают опрашивать "что у нас там?", а делают очень быстрые вычисления по тому, что в этой структуре.
А в чём именно ты видишь проблему в опрашивании "что у нас там?"

Ничего на бывает бесплатно. За как-бы "оптимизацию" (в ковычках) того, что данные уже готовы - нам придётся заплатить хитровыебанностью кода. Я просто не вижу смысла, мы тут кажется решаем проблему, которой просто нет.

Re: Структуры данных в блоке управления

Posted: Fri Dec 20, 2013 1:00 pm
by frig
russian, если говорить про прозрачности и простоте кода, то доступ к конкретным полям конкретной структуры в которой хранятся переменные текущего состояния - это проще и изящнее. В данный момент нельзя узнать как получить положение дроссельной заслонки, надо копать код. Причем после того, как ты раскопаешь код, в следующий раз тебе опять придется копать код, чтобы узнать как получить текущее напряжение бортовой сети или еще что. Каждый раз.
В случае с единой структурой будет точно известно в каком месте лежит структура состояния и ее местоположение надо будет определить один раз. Затем обращаясь к этому месту будет очень просто получить значения. Сейчас куча вызовов разных функций между которыми нет связи. Так что с точки зрения простоты и прозрачности структура это гут и я за структуру состояния.
НО
Структуру эту надо будет заполнять и актуальность данных в ней становится серьезным вопросом. Например при вычислении количества топлива или УОЗ мне нужен фактор нагрузки, не важно какой. Этот фактор нагрузки, что в структуре состояния он от предыдущего оборота или от нынешнего? Или на два оборота отстает? В какой последовательности отрабатывает код?
Сейчас все понятно - в тот момент когда я вызываю функцию получения значения температуры я получаю текущее значение температуры.

Второй момент - как часто какие значения нам там нужно обновлять? Сейчас значения получаются тогда, когда они нужны. Это позитив.

Если бы у нас было ООП, то мы бы просто завели объект состояния и вызовом методов получали бы наши значения. Сейчас можно похожего достичь просто рефакторингом, правильным именованием и может быть извратом со структурой содержащей имена функций состояния, чтобы каждый раз не искать нужную по всему коду.

Re: Структуры данных в блоке управления

Posted: Fri Dec 20, 2013 2:09 pm
by AndreyB
Итак, у нас тут значит выделилось три разные темы в этой ветке :)

1) проблема навигации по коду. Я открыт к предложениям :) Пока как вариант сделал

Code: Select all

 * @file engine_state.h
 * @brief One header which acts as gateway to current engine state
2) струтура либо для оптимизации, либо для читаемости. Решать проблему навигации через изменение (усложнение?) програмы я не согласен, необходимостии в оптимизации пока не вижу

3) С++ выделяю в отдельную тему

Re: Структуры данных в блоке управления

Posted: Fri Dec 20, 2013 2:14 pm
by Kot_dnz
frig wrote: Структуру эту надо будет заполнять и актуальность данных в ней становится серьезным вопросом. Например при вычислении количества топлива или УОЗ мне нужен фактор нагрузки, не важно какой. Этот фактор нагрузки, что в структуре состояния он от предыдущего оборота или от нынешнего? Или на два оборота отстает? В какой последовательности отрабатывает код?
Сейчас все понятно - в тот момент когда я вызываю функцию получения значения температуры я получаю текущее значение температуры.
Как одно из решений, когда нужно 100% иметь актуальные данные - вызвать функцию самостоятельно перед вычислениями.
Разница от сейчас будет только в том, что ответ функцией вернется не вам, а через эту структуру.

Re: Структуры данных в блоке управления

Posted: Fri Dec 20, 2013 2:16 pm
by AndreyB
Kot_dnz wrote: Как одно из решений, когда нужно 100% иметь актуальные данные - вызвать функцию самостоятельно перед вычислениями.
Разница от сейчас будет только в том, что ответ функцией вернется не вам, а через эту структуру.
Это попытки заткнуть проблему навигации по коду. Проблемы навигации по коду нужно решать лучшей организацей кода, а не изменением поведения кода от естественного к неестественному.

Re: Структуры данных в блоке управления

Posted: Fri Dec 20, 2013 4:59 pm
by XDA
маааааааленькое замечание в пользу хранения всех параметров и карт в отдельной структуре:
это позволит легко редактировать бинарный файл прошивки, без перекомпиляции исходника

Re: Структуры данных в блоке управления

Posted: Fri Dec 20, 2013 5:01 pm
by AndreyB
XDA wrote:маааааааленькое замечание в пользу хранения всех параметров и карт в отдельной структуре:
это позволит легко редактировать бинарный файл прошивки, без перекомпиляции исходника
Теоретик :( Параметры уже сто лет в одной структуре. И вообще, ты промахнуля темой :)

Re: Структуры данных в блоке управления

Posted: Sat Dec 21, 2013 12:55 pm
by XDA
russian wrote:
XDA wrote:маааааааленькое замечание в пользу хранения всех параметров и карт в отдельной структуре:
это позволит легко редактировать бинарный файл прошивки, без перекомпиляции исходника
Теоретик :( Параметры уже сто лет в одной структуре. И вообще, ты промахнуля темой :)
я такой же "теоретик", как и ты ;)
только практики побольше 8-)

Re: Структуры данных в блоке управления

Posted: Sun Mar 09, 2014 12:57 am
by AndreyB
В контексте появления у нас ООП можно помечтать по-новой :)

Re: Структуры данных в блоке управления

Posted: Fri Mar 14, 2014 6:52 pm
by rus084
я пока не сильно понимаю зачем менять последовательность структуры .

Re: Структуры данных в блоке управления

Posted: Fri Mar 14, 2014 6:56 pm
by AndreyB
rus084 wrote:я пока не сильно понимаю зачем менять последовательность структуры .
Дима, ты единсвенный кто в теме изменения последовательности в мега-структуре engine_configuration_s

Поля нужно переставить местами, чтобы разбить мега-кашу в этой структуре на несколько структур помельче - см. как там уже сделано с trigger_config_s и cranking_parameters_s и ThermistorConf

Re: Структуры данных в блоке управления

Posted: Fri Mar 14, 2014 7:03 pm
by rus084
вот теперь я понимаю отлично