гибридный однотаймерный планировщик - производительность
- AndreyB
- Site Admin
- Posts: 14332
- Joined: Wed Aug 28, 2013 1:28 am
- Location: Jersey City
- Github Username: rusefillc
- Slack: Andrey B
гибридный однотаймерный планировщик - производительность
предлагаю всё-таки изучить вопрос необходимости
нужно придумать формат теста и протестировать гибридный однотаймерный планировщик. пока весь сыр-бор - про сомнения в точности. Сомнения безусловно адекватные, но лучше бы конкретные цифры померить
Мы тут 176 ножек кстати вовсю изучаем http://rusefi.com/forum/viewtopic.php?f=4&t=749
нужно придумать формат теста и протестировать гибридный однотаймерный планировщик. пока весь сыр-бор - про сомнения в точности. Сомнения безусловно адекватные, но лучше бы конкретные цифры померить
Мы тут 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
Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
- AndreyB
- Site Admin
- Posts: 14332
- Joined: Wed Aug 28, 2013 1:28 am
- Location: Jersey City
- Github Username: rusefillc
- Slack: Andrey B
Re: Два микроконтроллера
Кто бы хотел скомпилировать прошивку с #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
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
Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
Re: Два микроконтроллера
Формат теста - все выходы должно поменять своё состояние одновременно. На сколько будет задержан последний сигнал, такая и макс. ошибка будет. Ситуация конечно маловероятная, но ведь возможная? В первую очередь всегда нужно учитывать худший сценарий.
- AndreyB
- Site Admin
- Posts: 14332
- Joined: Wed Aug 28, 2013 1:28 am
- Location: Jersey City
- Github Username: rusefillc
- Slack: Andrey B
Re: Два микроконтроллера
@, я знаю у тебя есть дискавери. У тебя есть логический анализатор? Можно тебя попросить потестировать всё это дело?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
Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
Re: Два микроконтроллера
Могу сделать, если ты тест напишешь. Я сходу не въехал как сгенерировать сигналы на выходах форсунок и зажигания.
В тесте надо одновременно сгенерировать сигнал на всех выходах.
В тесте надо одновременно сгенерировать сигнал на всех выходах.
Code: Select all
for (unsigned int i = 0; i < 12; i++) {
scheduleOutput(?, 1, 10);
}
- AndreyB
- Site Admin
- Posts: 14332
- Joined: Wed Aug 28, 2013 1:28 am
- Location: Jersey City
- Github Username: rusefillc
- Slack: Andrey B
Re: Два микроконтроллера
Добавил это в тест https://sourceforge.net/p/rusefi/code/HEAD/tree/trunk/firmware/controllers/PwmTester.cppSergey89 wrote:Могу сделать, если ты тест напишешь.
чтоб тест работал, нужно компилировать прошику с TRUE
в
Code: Select all
#define EFI_PWM_TESTER FALSE
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
Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
Re: Два микроконтроллера
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
- AndreyB
- Site Admin
- Posts: 14332
- Joined: Wed Aug 28, 2013 1:28 am
- Location: Jersey City
- Github Username: rusefillc
- Slack: Andrey B
Re: Два микроконтроллера
Хм. Очень странно, что три примерно попадают в ноты - а четвёртый совсем мимо нот? Неравномерность ошибки - очень неожиданный момент для меня.
У тебя у анализатора сколько каналов? Ты можешь добавить по аналогии в исходники еще 4 канала через еще 4 элемента outSignals, или мне сделать?
У тебя у анализатора сколько каналов? Ты можешь добавить по аналогии в исходники еще 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
Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
Re: Два микроконтроллера
У меня 7 каналов на макс. памяти.
Всего 10 каналов на форсунки. Первые 4 можно использовать в тесте?
Всего 10 каналов на форсунки. Первые 4 можно использовать в тесте?
- AndreyB
- Site Admin
- Posts: 14332
- Joined: Wed Aug 28, 2013 1:28 am
- Location: Jersey City
- Github Username: rusefillc
- Slack: Andrey B
Re: Два микроконтроллера
Там наверняка есть еще два пина где-нить, чтоб сделать 12 каналов. Сейчас добавлю.Sergey89 wrote:Первые 4 можно использовать в тесте?
Конечно же, можно первые 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
Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
Re: Два микроконтроллера
Сделал задержку 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
Re: Два микроконтроллера
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
- AndreyB
- Site Admin
- Posts: 14332
- Joined: Wed Aug 28, 2013 1:28 am
- Location: Jersey City
- Github Username: rusefillc
- Slack: Andrey B
Re: Два микроконтроллера
ничего не понимаю вообще. В чём разница между сценариями 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 минут сейчас.
Второй нюанс: отдельно планировать два и более события с одинаковым расписанием - это алгоритмическое самоубийство. В прошивке уже есть на эту тема оптимизация - см. 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
Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
Re: гибридный однотаймерный планировщик - производительность
Разница в прошивке. Когда я поменял параметры сигнала, то ошибка тоже уменьшилась.
Одновременные события могут сами собой получаться. Например начало одного впрыска совпадёт с завершением другого впрыска, началом накопления в одной катушке зажигания и завершением в другой, сменой состояния выходов PWM и т.д.
Одновременные события могут сами собой получаться. Например начало одного впрыска совпадёт с завершением другого впрыска, началом накопления в одной катушке зажигания и завершением в другой, сменой состояния выходов PWM и т.д.
- AndreyB
- Site Admin
- Posts: 14332
- Joined: Wed Aug 28, 2013 1:28 am
- Location: Jersey City
- Github Username: rusefillc
- Slack: Andrey B
Re: Два микроконтроллера
Да, но нас интересует и максимальная, и средняя ошибка. Накладываться случайно события будут иногда, а попарный впрыск или зажигание - всегда. И если это уменьшит среднюю ошибку в два раза - то стоит чуть потрогать код.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
Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
- AndreyB
- Site Admin
- Posts: 14332
- Joined: Wed Aug 28, 2013 1:28 am
- Location: Jersey City
- Github Username: rusefillc
- Slack: Andrey B
Re: Два микроконтроллера
Протянул параметр наверх, можно попросить тебя собрать новые цифры? Основная идея - у событий будет одинаковый момент выполнения, а значит не должно быть микро-вызовов таймера с разницей в микросекунды, как между временем включения первого и второго канала.
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
Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute
Re: гибридный однотаймерный планировщик - производительность
Теперь уже завтра по местному времени потестирую.
Re: гибридный однотаймерный планировщик - производительность
Ещё одна возможная оптимизация. Когда нужно сформировать импульс заданной длительности, то событие для перехода с высокого уровня на низкий надо формировать в событии перехода с низкого уровня на высокий. Это уменьшит общую ошибку на величину ошибки начала формирования сигнала.
Re: гибридный однотаймерный планировщик - производительность
Правильно ли я понял что впрыск и зажигание генерируются програмно?
Re: гибридный однотаймерный планировщик - производительность
Сейчас используется один аппаратный таймер для формирования временных интервалов, а ножки дёргаются программно.
Re: гибридный однотаймерный планировщик - производительность
С новой прошивкой стали иногда появляться импульсы с большой ошибкой.
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
- AndreyB
- Site Admin
- Posts: 14332
- Joined: Wed Aug 28, 2013 1:28 am
- Location: Jersey City
- Github Username: rusefillc
- Slack: Andrey B
Re: гибридный однотаймерный планировщик - производительность
Мне нужна помощь в расследовании.
В качестве методологии поиска тормозов могу предложить выключать или по одной, или пачкой разные подсистемы на уровне компиляции, и смотреть как улучаются или не меняются цифры.
Для начала нужно замерить с выключенным почти всем:
надеюсь оно в таком виде не вылетит с ошибкой. Исходники нужно обновить - я оживил только что немного эту фичу гибкого выключения всего.
В качестве методологии поиска тормозов могу предложить выключать или по одной, или пачкой разные подсистемы на уровне компиляции, и смотреть как улучаются или не меняются цифры.
Для начала нужно замерить с выключенным почти всем:
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
Always looking for C/C++/Java/PHP developers! Please help us see https://rusefi.com/s/howtocontribute