гибридный однотаймерный планировщик - производительность

Про байтики и логику ЭБУ
Post Reply
User avatar
AndreyB
Site Admin
Posts: 14332
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

гибридный однотаймерный планировщик - производительность

Post by AndreyB »

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

Мы тут 176 ножек кстати вовсю изучаем http://rusefi.com/forum/viewtopic.php?f=4&t=749
Very limited telepathic abilities - please post logs & tunes where appropriate - http://rusefi.com/s/questions

Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
User avatar
AndreyB
Site Admin
Posts: 14332
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: Два микроконтроллера

Post by AndreyB »

Кто бы хотел скомпилировать прошивку с #define EFI_PWM_TESTER TRUE?

https://sourceforge.net/p/rusefi/code/HEAD/tree/trunk/firmware/controllers/PwmTester.cpp
Можно добавить еще каналов по аналогии - оно использует пины впрыска, так что наверное нужно ставить количество цилиндров в 12 чтоб 12 пинов инициализировалось - ну и нужно будет ставить, какие пины использовать. Код есть, кому-то нужно потратить время и попробовать разные варианты.

Мои замеры - http://rusefi.com/forum/viewtopic.php?f=5&t=2&start=10
Very limited telepathic abilities - please post logs & tunes where appropriate - http://rusefi.com/s/questions

Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
User avatar
Sergey89
contributor
contributor
Posts: 839
Joined: Wed Sep 25, 2013 5:30 pm
Location: Russia, Velikiy Novgorod

Re: Два микроконтроллера

Post by Sergey89 »

Формат теста - все выходы должно поменять своё состояние одновременно. На сколько будет задержан последний сигнал, такая и макс. ошибка будет. Ситуация конечно маловероятная, но ведь возможная? В первую очередь всегда нужно учитывать худший сценарий.
User avatar
AndreyB
Site Admin
Posts: 14332
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: Два микроконтроллера

Post by AndreyB »

Sergey89 wrote:Формат теста - все выходы должно поменять своё состояние одновременно. На сколько будет задержан последний сигнал, такая и макс. ошибка будет. Ситуация конечно маловероятная, но ведь возможная? В первую очередь всегда нужно учитывать худший сценарий.
@, я знаю у тебя есть дискавери. У тебя есть логический анализатор? Можно тебя попросить потестировать всё это дело?
Very limited telepathic abilities - please post logs & tunes where appropriate - http://rusefi.com/s/questions

Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
User avatar
Sergey89
contributor
contributor
Posts: 839
Joined: Wed Sep 25, 2013 5:30 pm
Location: Russia, Velikiy Novgorod

Re: Два микроконтроллера

Post by Sergey89 »

Могу сделать, если ты тест напишешь. Я сходу не въехал как сгенерировать сигналы на выходах форсунок и зажигания.

В тесте надо одновременно сгенерировать сигнал на всех выходах.

Code: Select all

for (unsigned int i = 0; i < 12; i++) {
    scheduleOutput(?, 1, 10);
}
User avatar
AndreyB
Site Admin
Posts: 14332
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: Два микроконтроллера

Post by AndreyB »

Sergey89 wrote:Могу сделать, если ты тест напишешь.
Добавил это в тест https://sourceforge.net/p/rusefi/code/HEAD/tree/trunk/firmware/controllers/PwmTester.cpp

чтоб тест работал, нужно компилировать прошику с TRUE
в

Code: Select all

#define EFI_PWM_TESTER FALSE
в https://sourceforge.net/p/rusefi/code/HEAD/tree/trunk/firmware/config/stm32f4ems/efifeatures.h
Very limited telepathic abilities - please post logs & tunes where appropriate - http://rusefi.com/s/questions

Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
User avatar
Sergey89
contributor
contributor
Posts: 839
Joined: Wed Sep 25, 2013 5:30 pm
Location: Russia, Velikiy Novgorod

Re: Два микроконтроллера

Post by Sergey89 »

waveforms.png
waveforms.png (40.92 KiB) Viewed 15308 times

Code: Select all

import csv
import numpy

signal_count = 4
result = [[] for x in range(0, signal_count)]

with open('test1.csv', 'rt') as file:
    rising_edge_time = [0]*signal_count
    prev_level = [0]*signal_count
    for k, row in enumerate(csv.reader(file, delimiter = ',')):
        if k == 0:
            continue

        last_key = len(row) - 1

        for i in range(0, signal_count):
            level = int(row[last_key-i])
            timestamp = int(row[0])
            if level > prev_level[i]:
                rising_edge_time[i] = timestamp
            elif level < prev_level[i]:
                result[i].append((timestamp - rising_edge_time[i]) / 100)
            prev_level[i] = level

for k, v in enumerate(result):
    print(("signal {0}:"
        " avg = {1:.2f},"
        " min = {2:.2f},"
        " max = {3:.2f},"
        " std = {4:.2f},"
        " med = {5:.2f}").format(
            k,
            numpy.mean(v),
            min(v),
            max(v),
            numpy.std(v),
            numpy.median(v)
        )
    )

Code: Select all

signal 0: avg = 1601.02, min = 1591.49, max = 1609.37, std = 5.14, med = 1602.43
signal 1: avg = 1600.46, min = 1580.78, max = 1609.77, std = 8.42, med = 1602.61
signal 2: avg = 1604.58, min = 1585.28, max = 1625.11, std = 11.24, med = 1601.69
signal 3: avg = 1527.41, min = 1498.36, max = 1603.20, std = 40.19, med = 1502.74
Attachments
test1.csv
(2.2 KiB) Downloaded 806 times
User avatar
AndreyB
Site Admin
Posts: 14332
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: Два микроконтроллера

Post by AndreyB »

Хм. Очень странно, что три примерно попадают в ноты - а четвёртый совсем мимо нот? Неравномерность ошибки - очень неожиданный момент для меня.

У тебя у анализатора сколько каналов? Ты можешь добавить по аналогии в исходники еще 4 канала через еще 4 элемента outSignals, или мне сделать?
Very limited telepathic abilities - please post logs & tunes where appropriate - http://rusefi.com/s/questions

Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
User avatar
Sergey89
contributor
contributor
Posts: 839
Joined: Wed Sep 25, 2013 5:30 pm
Location: Russia, Velikiy Novgorod

Re: Два микроконтроллера

Post by Sergey89 »

У меня 7 каналов на макс. памяти.

Всего 10 каналов на форсунки. Первые 4 можно использовать в тесте?
User avatar
AndreyB
Site Admin
Posts: 14332
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: Два микроконтроллера

Post by AndreyB »

Sergey89 wrote:Первые 4 можно использовать в тесте?
Там наверняка есть еще два пина где-нить, чтоб сделать 12 каналов. Сейчас добавлю.

Конечно же, можно первые 4 использовать - просто нужно startSimplePwm закомментировать.
Very limited telepathic abilities - please post logs & tunes where appropriate - http://rusefi.com/s/questions

Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
User avatar
Sergey89
contributor
contributor
Posts: 839
Joined: Wed Sep 25, 2013 5:30 pm
Location: Russia, Velikiy Novgorod

Re: Два микроконтроллера

Post by Sergey89 »

Сделал задержку 0.2 мс и длительность 1.5 мс. Результаты лучше:

Code: Select all

signal 0: avg = 1495.80, min = 1482.90, max = 1516.20, std = 8.05, med = 1498.40
signal 1: avg = 1495.27, min = 1482.90, max = 1510.80, std = 7.29, med = 1498.30
signal 2: avg = 1493.61, min = 1464.60, max = 1511.60, std = 9.74, med = 1495.55
signal 3: avg = 1504.04, min = 1466.50, max = 1531.10, std = 13.88, med = 1500.15
User avatar
Sergey89
contributor
contributor
Posts: 839
Joined: Wed Sep 25, 2013 5:30 pm
Location: Russia, Velikiy Novgorod

Re: Два микроконтроллера

Post by Sergey89 »

Code: Select all

signal 0: cnt = 207, avg = 1595.83, min = 1561.70, max = 1622.90, std = 11.88, med = 1595.00
signal 1: cnt = 207, avg = 1586.94, min = 1547.00, max = 1616.60, std = 13.70, med = 1594.20
signal 2: cnt = 207, avg = 1592.00, min = 1553.20, max = 1623.90, std = 14.42, med = 1597.50
signal 3: cnt = 207, avg = 1605.12, min = 1562.70, max = 1626.30, std = 15.58, med = 1603.40
signal 4: cnt = 207, avg = 1609.20, min = 1574.10, max = 1629.30, std = 11.72, med = 1610.30
signal 5: cnt = 207, avg = 1597.29, min = 1566.90, max = 1627.80, std = 13.69, med = 1599.00
signal 6: cnt = 207, avg = 1600.08, min = 1572.40, max = 1630.60, std = 11.68, med = 1599.80
User avatar
AndreyB
Site Admin
Posts: 14332
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: Два микроконтроллера

Post by AndreyB »

ничего не понимаю вообще. В чём разница между сценариями http://rusefi.com/forum/viewtopic.php?f=9&t=786&start=20#p13733 и http://rusefi.com/forum/viewtopic.php?f=9&t=786&start=20#p13758 - почему первый настолько хуже отработал? Это первый вопрос, который надо бы понять.

Второй нюанс: отдельно планировать два и более события с одинаковым расписанием - это алгоритмическое самоубийство. В прошивке уже есть на эту тема оптимизация - см. InjectionEvent.isSimultanious - сейчас оно пока не группирует парный впрыск-зажигание, но уже группирует одновременный. Нужно этот момент пооптимизировать... Самый простой вариант может быть сделаю за 10 минут сейчас.
Very limited telepathic abilities - please post logs & tunes where appropriate - http://rusefi.com/s/questions

Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
User avatar
Sergey89
contributor
contributor
Posts: 839
Joined: Wed Sep 25, 2013 5:30 pm
Location: Russia, Velikiy Novgorod

Re: гибридный однотаймерный планировщик - производительность

Post by Sergey89 »

Разница в прошивке. Когда я поменял параметры сигнала, то ошибка тоже уменьшилась.

Одновременные события могут сами собой получаться. Например начало одного впрыска совпадёт с завершением другого впрыска, началом накопления в одной катушке зажигания и завершением в другой, сменой состояния выходов PWM и т.д.
User avatar
AndreyB
Site Admin
Posts: 14332
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: Два микроконтроллера

Post by AndreyB »

Sergey89 wrote:Одновременные события могут сами собой получаться. Например начало одного впрыска совпадёт с завершением другого впрыска, началом накопления в одной катушке зажигания и завершением в другой, сменой состояния выходов PWM и т.д.
Да, но нас интересует и максимальная, и средняя ошибка. Накладываться случайно события будут иногда, а попарный впрыск или зажигание - всегда. И если это уменьшит среднюю ошибку в два раза - то стоит чуть потрогать код.

За 30 минут я 4 раза отвлёкся и не сделал то, что хотел сделать. Я сделаю изменение и напишу сюда с просьбой его проверить.
Very limited telepathic abilities - please post logs & tunes where appropriate - http://rusefi.com/s/questions

Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
User avatar
AndreyB
Site Admin
Posts: 14332
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: Два микроконтроллера

Post by AndreyB »

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

Code: Select all

	efitimeus_t nowUs = getTimeNowUs();

	scheduleOutput(&outSignals[0], nowUs, delayMs, durationMs);
	scheduleOutput(&outSignals[1], nowUs, delayMs, durationMs);
	scheduleOutput(&outSignals[2], nowUs, delayMs, durationMs);
	scheduleOutput(&outSignals[3], nowUs, delayMs, durationMs);

	scheduleOutput(&outSignals[4], nowUs, delayMs, durationMs);
	scheduleOutput(&outSignals[5], nowUs, delayMs, durationMs);
	scheduleOutput(&outSignals[6], nowUs, delayMs, durationMs);
	scheduleOutput(&outSignals[7], nowUs, delayMs, durationMs);
Very limited telepathic abilities - please post logs & tunes where appropriate - http://rusefi.com/s/questions

Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
User avatar
Sergey89
contributor
contributor
Posts: 839
Joined: Wed Sep 25, 2013 5:30 pm
Location: Russia, Velikiy Novgorod

Re: гибридный однотаймерный планировщик - производительность

Post by Sergey89 »

Теперь уже завтра по местному времени потестирую.
User avatar
Sergey89
contributor
contributor
Posts: 839
Joined: Wed Sep 25, 2013 5:30 pm
Location: Russia, Velikiy Novgorod

Re: гибридный однотаймерный планировщик - производительность

Post by Sergey89 »

Ещё одна возможная оптимизация. Когда нужно сформировать импульс заданной длительности, то событие для перехода с высокого уровня на низкий надо формировать в событии перехода с низкого уровня на высокий. Это уменьшит общую ошибку на величину ошибки начала формирования сигнала.
mivaol
Posts: 260
Joined: Thu Jan 30, 2014 6:00 pm

Re: гибридный однотаймерный планировщик - производительность

Post by mivaol »

Правильно ли я понял что впрыск и зажигание генерируются програмно?
User avatar
Sergey89
contributor
contributor
Posts: 839
Joined: Wed Sep 25, 2013 5:30 pm
Location: Russia, Velikiy Novgorod

Re: гибридный однотаймерный планировщик - производительность

Post by Sergey89 »

Сейчас используется один аппаратный таймер для формирования временных интервалов, а ножки дёргаются программно.
User avatar
Sergey89
contributor
contributor
Posts: 839
Joined: Wed Sep 25, 2013 5:30 pm
Location: Russia, Velikiy Novgorod

Re: гибридный однотаймерный планировщик - производительность

Post by Sergey89 »

С новой прошивкой стали иногда появляться импульсы с большой ошибкой.

Code: Select all

signal 0: cnt = 344, avg = 1590.28, min = 1463.60, max = 1703.80, std = 33.85, med = 1593.90
signal 1: cnt = 344, avg = 1590.26, min = 1463.60, max = 1703.80, std = 33.86, med = 1593.90
signal 2: cnt = 344, avg = 1590.27, min = 1463.60, max = 1703.80, std = 33.88, med = 1593.90
signal 3: cnt = 343, avg = 1590.29, min = 1463.60, max = 1703.80, std = 33.95, med = 1594.00
signal 4: cnt = 343, avg = 1590.30, min = 1463.60, max = 1703.90, std = 33.98, med = 1594.00
signal 5: cnt = 343, avg = 1590.30, min = 1463.70, max = 1703.80, std = 34.00, med = 1594.00
signal 6: cnt = 343, avg = 1590.32, min = 1463.70, max = 1703.80, std = 34.02, med = 1594.00
User avatar
AndreyB
Site Admin
Posts: 14332
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: гибридный однотаймерный планировщик - производительность

Post by AndreyB »

Мне нужна помощь в расследовании.

В качестве методологии поиска тормозов могу предложить выключать или по одной, или пачкой разные подсистемы на уровне компиляции, и смотреть как улучаются или не меняются цифры.

Для начала нужно замерить с выключенным почти всем:

Code: Select all

Index: config/stm32f4ems/efifeatures.h
===================================================================
--- config/stm32f4ems/efifeatures.h	(revision 6452)
+++ config/stm32f4ems/efifeatures.h	(working copy)
@@ -12,7 +12,7 @@
 
 #define EFI_GPIO TRUE
 
-#define EFI_FSIO TRUE
+#define EFI_FSIO FALSE
 
 #define EFI_PWM_TESTER FALSE
 
@@ -29,7 +29,7 @@
 /**
  * Build-in logic analyzer support. Logic analyzer viewer is one of the java console panes.
  */
-#define EFI_WAVE_ANALYZER TRUE
+#define EFI_WAVE_ANALYZER FALSE
 
 //#define SERIAL_SPEED (8 * 115200)
 //#define SERIAL_SPEED (2 * 115200)
@@ -38,7 +38,7 @@
 /**
  * TunerStudio support.
  */
-#define EFI_TUNER_STUDIO TRUE
+#define EFI_TUNER_STUDIO FALSE
 
 /**
  * TunerStudio debug output
@@ -61,16 +61,16 @@
 /**
  * Usually you need shaft position input, but maybe you do not need it?
  */
-#define EFI_SHAFT_POSITION_INPUT TRUE
+#define EFI_SHAFT_POSITION_INPUT FALSE
 
-#define EFI_ANALOG_INPUTS TRUE
+#define EFI_ANALOG_INPUTS FALSE
 
 /**
  * Maybe we are just sniffing what's going on?
  */
-#define EFI_ENGINE_CONTROL TRUE
+#define EFI_ENGINE_CONTROL FALSE
 
-#define EFI_SPEED_DENSITY TRUE
+#define EFI_SPEED_DENSITY FALSE
 
 /**
  * MCP42010 digital potentiometer support. This could be useful if you are stimulating some
@@ -79,32 +79,32 @@
 //#define EFI_POTENTIOMETER FALSE
 #define EFI_POTENTIOMETER TRUE
 
-#define EFI_ANALOG_SENSORS TRUE
+#define EFI_ANALOG_SENSORS FALSE
 
 #define EFI_MAX_31855 TRUE
 
 #define EFI_MCP_3208 FALSE
 
-#define EFI_HIP_9011 TRUE
+#define EFI_HIP_9011 FALSE
 
 #define EFI_INTERNAL_ADC TRUE
 
 #define EFI_DENSO_ADC FALSE
 
-#define EFI_CAN_SUPPORT TRUE
+#define EFI_CAN_SUPPORT FALSE
 
-#define EFI_HD44780_LCD TRUE
+#define EFI_HD44780_LCD FALSE
 
-#define EFI_IDLE_CONTROL TRUE
+#define EFI_IDLE_CONTROL FALSE
 
 #define EFI_PWM TRUE
 
-#define EFI_VEHICLE_SPEED TRUE
+#define EFI_VEHICLE_SPEED FALSE
 
 #define EFI_FUEL_PUMP TRUE
 
 #define EFI_ENGINE_EMULATOR TRUE
-#define EFI_EMULATE_POSITION_SENSORS TRUE
+#define EFI_EMULATE_POSITION_SENSORS FALSE
 
 /**
  * This macros is used to hide pieces of the code from unit tests, so it only makes sense in folders exposed to the tests project.
@@ -160,7 +160,7 @@
 
 #define CONSOLE_MAX_ACTIONS 196
 
-#define EFI_MAP_AVERAGING TRUE
+#define EFI_MAP_AVERAGING FALSE
 //#define EFI_MAP_AVERAGING FALSE
 
 // todo: most of this should become configurable
надеюсь оно в таком виде не вылетит с ошибкой. Исходники нужно обновить - я оживил только что немного эту фичу гибкого выключения всего.
Very limited telepathic abilities - please post logs & tunes where appropriate - http://rusefi.com/s/questions

Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
Post Reply