[rusEfi] ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977) #37

User avatar
AndreyB
Site Admin
Posts: 14292
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by AndreyB »

Я закоммитил под https://github.com/rusefi/rusefi/issues/414 - можешь проверить?
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
andreika
donator
donator
Posts: 461
Joined: Mon Feb 13, 2017 2:35 pm
Location: Kiev

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by andreika »

russian wrote:Я закоммитил под https://github.com/rusefi/rusefi/issues/414 - можешь проверить?
Проверил. Если просто подключиться, то всё нормально, нет проблем. Но если включить эмулятор оборотов, то опять помехи. Видимо, precise-таймер гадит UARTу, когда есть обороты... :(
Кроме того, поскольку ты не уменьшил TS_READ_TIMEOUT, то связь с TS при этом постоянно рвётся.
Так просто этот конфликт не разрулить... Но может быть, работу с UART в таком случае на DMA перевести, т.е. с драйвера serial на uart? Тот, который STM32_UART_USE_USART. Работать с ним, как я понял, менее приятно, зато гарантированно не будет гонки прерываний, так ведь?
User avatar
AndreyB
Site Admin
Posts: 14292
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by AndreyB »

Я согласен на dma, буду рад PR :)
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
andreika
donator
donator
Posts: 461
Joined: Mon Feb 13, 2017 2:35 pm
Location: Kiev

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by andreika »

russian wrote:Я согласен на dma, буду рад PR :)
Написал первичный код DMA. И он даже частично работает. :roll: Работает он при коннекте с TunerStudio. А вот при коннекте с Консолью - прошивка виснет намертво.
Начал разбираться, почему виснет. Оказалось, не нравится ей запрос TS_GET_TEXT, и она виснет при отправке текста.
И, похоже, это связано с тем, что swapOutputBuffers() может возвращать буфер прямо в CCM-памяти:

Code: Select all

static log_buf_t pendingBuffers0 CCM_OPTIONAL;
И, главное, судя по всему, DMA очень не любит работать с CCM. И виснет. Я целый вечер убил на полуслепой дебаг, пока понял, в чём дело!.. :twisted:
Теперь сижу и думаю, что с этим делать. Оно нам действительно надо, это CCM, для мессаджинга? Если нет, то можно просто убрать CCM_OPTIONAL для pendingBuffers0 или где-то ещё засады? (всякие LOGGING_BUFFER, intermediateLoggingBufferData, прости, господи? :oops:)
А если CCM таки нужен, и при выводе мессаг на UART делать для них memcpy() в "нормальный" буфер (а там килобайты!), то не убъёт ли это все выгоды от быстродействия CCM? Или, может быть, мессаги пишут какие-то критические по быстродействию участки кода, и нам важнее скорость вывода там, чем тормоза при отправке?.. :?
В общем, мне не хватает знаний прошивки, чтобы понять, как лучше решить эту проблему... :(
User avatar
AndreyB
Site Admin
Posts: 14292
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by AndreyB »

andreika wrote:Я целый вечер убил на полуслепой дебаг, пока понял, в чём дело!.. :twisted:
Ооо, знакомое чувство!

Напишу по делу через 60 секунд :)
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: 14292
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by AndreyB »

Code: Select all

/**
 * rusEfi is placing some of data structures into CCM memory simply
 * in order to use that memory - no magic about which RAM is faster etc.
 *
 * Please note that DMA does not work with CCM memory
 */
Сделал просто static log_buf_t pendingBuffers0;
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
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by puff »

О. И вот как это объяснить что с тс работает, а с консолью - нет?
"Жопой чую", что оно может быть связано с моим багом.
User avatar
darxfame
contributor
contributor
Posts: 259
Joined: Mon Feb 13, 2017 10:06 pm
Location: Moscow

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by darxfame »

puff wrote:О. И вот как это объяснить что с тс работает, а с консолью - нет?
"Жопой чую", что оно может быть связано с моим багом.
ТС не присылает Текстовые сообщения, а консоль присылает

Отправлено с моего PRO 6 через Tapatalk
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by puff »

А что ещё делает консоль, чего не делает тс? Вот тс манипулирует пакетами размером по 5-6 КБ?

Sent from my XT1058 using Tapatalk
User avatar
andreika
donator
donator
Posts: 461
Joined: Mon Feb 13, 2017 2:35 pm
Location: Kiev

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by andreika »

Промежуточные результаты по UART-DMA.
russian wrote:Сделал просто static log_buf_t pendingBuffers0;
Спасибо, это помогло! Теперь к Консоли коннектится без проблем.

Но.

Поскольку реализация была простейшая, в рамках драйвера "UART" Chibios, то для приёма байта всё равно требуется высокоприоритетное прерывание, но уже другое: STM32_UART_USARTx_IRQ_PRIORITY. И чтобы не было потерь байтов, его нужно делать даже выше чем ICU:

Code: Select all

#define PRECISE_SCHEDULING_TIMER_PRIORITY 5  // сигналы катушек, форсунок
#define ICU_PRIORITY 4 // захват сигналов ДПКВ
#define UART_DMA_IRQ_PRIORITY 3 // копирование байта из UART
Но зато само прерывание, конечно, очень лёгкое (low-latency), и не принимает байт по шине как Serial, а просто копирует принятый байт в буфер. Вот упрощённый код, грубо говоря, там три строчки:

Code: Select all

chSysLockFromISR();
chIQPutI(&tsUartDma.fifoRxQueue, c);
chSysUnlockFromISR();
Я пытался измерить jitter на выходах катушек зажигания, но там и без UARTа творится безобразие: фаза самого сигнала triggerSimulatorPins гуляет, и на выходах катушек джиттер уже около 40 мкс. Измерял грубо, аналоговым осциллографом, но порядок чисел верный. На фоне такого фазового шума никакие мои DMA-IRQ заметного влияния не оказывают. Нужен более точный внешний сигнал ДПКВ, чтобы измерить влияние точнее...

* * *
Как бы то ни было, это решение по DMA лучше, чем Serial, но не идеальное.
А в идеале надо бы попробовать режим Half Transfer Interrupt (STM32_DMA_CR_HTIE). Этот режим позволяет получить прерывание, когда _половина_ буфера заполнена.
И тогда можно сделать маленький DMA-буфер размером 2 байта и настроить это дополнительное прерывание после приёма половины буфера - т.е. 1 байта.
И мы по прерыванию этот байтик копируем в наш основной FIFO-буфер. Даже если прерывание будет задержано чем-то более приоритетным, то следующий байт мы не потеряем, т.к. DMA будет продолжать его читать на фоне, по идее.
Точно также, по второму прерыванию заполнения буфера (STM32_DMA_CR_TCIE) мы копируем себе 2-й байт, а тем временем DMA "работает" на 1-м байтом, и так далее.
Но! Проблема в том, что в драйвере UART Chibios прерывание по half-transfer не реализовано :( Это реализовано в ChibiOS только в драйверах ADC, DAC и I2S.
И чтобы это реализовать, нужно допиливать драйвер ChibiOS на предмет STM32_DMA_ISR_HTIF в UART... Я пока не знаю, стоит ли оно того, или уже "и так хорошо"...

P.S. Я вот думаю: а PLL у моего 469-го точно правильно заводится? Я-то ничего не менял из циферок 407-го, и думал, что частота у меня 168 МГц, но вдруг это не так?.. Что-то уж больно заметны у меня все эти "косяки" с таймингами, а на дискавери-407 - тишь да гладь...
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by puff »

про симулятор триггера - по-моему там нарочно вносилось какое-то искажение (во всяком случае такую идею кто-то кидал)

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

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by AndreyB »

puff 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
AndreyB
Site Admin
Posts: 14292
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by AndreyB »

andreika wrote:Как бы то ни было, это решение по DMA лучше, чем Serial
тогда PR? :)
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
andreika
donator
donator
Posts: 461
Joined: Mon Feb 13, 2017 2:35 pm
Location: Kiev

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by andreika »

russian wrote:
andreika wrote:Как бы то ни было, это решение по DMA лучше, чем Serial
тогда PR? :)
Первый вариант реализации DMA, о котором я писал, я уже выложил в своём репозитории:
https://github.com/andreika-git/rusefi/tree/uart_dma
Выложил просто в виде коммита, и PR в основную ветку rusEFI пока не оформлял.
Дело в том, что я провёл тесты на аппаратном эмуляторе ДПКВ, которые показывают, что при оборотах выше 3000 начинает теряться сигнал input capture. Завтра я ещё продолжу тестирование (попробую снизить приоритет UART'а и проверить: связь должна ухудшиться, но чтение оборотов - улучшиться).
Если хочешь, утяни к себе временно этот вариант и проверь его, как он будет работать на дискавери-407. В том числе, если можно, проверь и с ТюнерСтудио, и с Консолью через UART.
А второй, более сложный вариант, с дописыванием драйвера Chibios под half-transfer IRQ я ещё не делал - хотел вначале проверить этот вариант...
User avatar
AndreyB
Site Admin
Posts: 14292
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by AndreyB »

andreika wrote: Дело в том, что я провёл тесты на аппаратном эмуляторе ДПКВ, которые показывают, что при оборотах выше 3000 начинает теряться сигнал input capture.
а без твоих изменений как оно работает?

нужно автоматизированное стресс-тестирование мне делать :(
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
andreika
donator
donator
Posts: 461
Joined: Mon Feb 13, 2017 2:35 pm
Location: Kiev

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by andreika »

russian wrote:а без твоих изменений как оно работает?
В плане высоких оборотов ещё не знаю, буду завтра проверять ещё. А так, если не поднимать приоритеты UART и оставить дефолтный Serial, то лезет куча ошибок связи:

Code: Select all

ERROR: CRC header size
unexpected command 34
ERROR: not enough bytes in stream
Got only 3 bytes while expecting 4 for command G
и т.д.
Несколько комментариев по этому выложенному коммиту dma v1.0:
1. Старый код работы с TS/Консолью через Serial оставлен полностью, и при мердже этого кода (в том виде как он выложен сейчас), ничего не поменяется и не сломается, и связь будет по-прежнему через Serial.
2. Новый код работы через DMA включается по "TS_UART_DMA_MODE TRUE", и его нужно включить для теста нового режима (он отключен по умолчанию).
3. К сожалению, драйвер 'Uart' не хочет линковаться вместе с драйвером 'Serial', поэтому приходится жёстко выбирать между ними на уровне #if - или-или.
И, соответственно, чтобы код Uart-DMA работал, приходится для него пока временно отключать EFI_CONSOLE_UART_DEVICE и EFI_UART_GPS (в будущем, можно попробовать сделать режим DMA и для них или вылечить линковку serial+uart?).
4. Для правильной работы код требует более высоких STM32_UART_USARTx_IRQ_PRIORITY, но в отличие от Serial-драйвера, это прерывание IRQ, которое НЕ принимает биты из UART, а просто копирует полученный по DMA байт в наш кольцевой буфер - и поэтому, даже имея высокий приоритет, оно меньше сказывается на работе Precision-кода.
5. Я пока не уменьшал UNUSED_RAM_SIZE (судя по rusefi_ram_report, вроде и так терпимо)...

P.S. Но вообще у меня ощущение, что precision-код (icu+timer5) у меня почему-то выполняется существенно дольше, чем на дискавери...
User avatar
andreika
donator
donator
Posts: 461
Joined: Mon Feb 13, 2017 2:35 pm
Location: Kiev

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by andreika »

Вдогонку...
totalTriggerHandlerMaxTime=484179 :shock: Сколько оно должно быть вообще?

Code: Select all

Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: templog engine has STOPPED [A][9DB32E98] [A][9B24B4DB] 42891709
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: Template PROMETHEUS (100) trigger TT_TOOTHED_WHEEL_60_2 (8) useRiseEdge=Yes onlyFront=No useOnlyFirstChannel=No tdcOffset=536882480
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: trigger#1 event counters up=285705/down=285707
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: expected cycle events 116/0/0
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: trigger type=8/need2ndChannel=No
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: expected duty #0=0.48/#1=0.00
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: synchronizationNeeded=Yes/isError=No/total errors=3 ord_err=4/total revolutions=4926/self=No
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: gap from 2.25 to 3.75
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: VVT input: PE9 mode 0
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: VVT event counters: 0/0
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: primary trigger input: PA5
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: primary trigger simulator: PD8 OM_DEFAULT freq=1200
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: trigger error extra LED: NONE OM_DEFAULT
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: primary logic input: NONE
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: secondary logic input: NONE
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: zeroTestTime=19 maxHowFarOff=493645
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: advanceLookupTime=1952 now=-1649012074 fuelCalcTime=4799
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: ignitionSchTime=2064 injectonSchTime=0
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: mapTime=18044/hipTime=4172/rpmTime=1184/mainTriggerCallbackTime=7045
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: maxLockTime=0 / maxTriggerReentraint=0
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: maxEventQueueTime=7749
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: hipLastExecutionCount=0
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: hwSetTimerTime 480
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: totalTriggerHandlerMaxTime=484179
Sat May 20 01:18:08 EEST 2017<EOT>: postMessage EngineState: turning off c3
[/spoiler]
User avatar
AndreyB
Site Admin
Posts: 14292
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by AndreyB »

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: 14292
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by AndreyB »

Я жутко извиняюсь... Помнишь в какой-то момент я предлагал всё-таки заиметь stm32407discovery? :roll:

Code: Select all

set engine_type 23
enable self_stimulation
rpm 6000
writeconfig
2017-05-19 21_29: EngineState: primary logic input: NONE
2017-05-19 21_29: EngineState: secondary logic input: NONE
2017-05-19 21_29: EngineState: zeroTestTime=19 maxHowFarOff=170835073
2017-05-19 21_29: EngineState: advanceLookupTime=5631 now=1149469099 fuelCalcTime=5797
2017-05-19 21_29: EngineState: ignitionSchTime=2156 injectonSchTime=0
2017-05-19 21_29: EngineState: mapTime=8191/hipTime=1681/rpmTime=850/mainTriggerCallbackTime=8281
2017-05-19 21_29: EngineState: maxLockTime=0 / maxTriggerReentraint=0
2017-05-19 21_29: EngineState: maxEventQueueTime=368965
2017-05-19 21_29: EngineState: hipLastExecutionCount=1
2017-05-19 21_29: EngineState: hwSetTimerTime 479
2017-05-19 21_29: EngineState: totalTriggerHandlerMaxTime=366851



<reboot>


2017-05-19 21_30: EngineState: secondary logic input: NONE
2017-05-19 21_30: EngineState: zeroTestTime=19 maxHowFarOff=26236
2017-05-19 21_30: EngineState: advanceLookupTime=3561 now=548251097 fuelCalcTime=5191
2017-05-19 21_30: EngineState: ignitionSchTime=2141 injectonSchTime=0
2017-05-19 21_30: EngineState: mapTime=7491/hipTime=1543/rpmTime=851/mainTriggerCallbackTime=10588
2017-05-19 21_30: EngineState: maxLockTime=0 / maxTriggerReentraint=0
2017-05-19 21_30: EngineState: maxEventQueueTime=358605
2017-05-19 21_30: EngineState: hipLastExecutionCount=2
2017-05-19 21_30: EngineState: hwSetTimerTime 478
2017-05-19 21_30: EngineState: totalTriggerHandlerMaxTime=24805

у меня подозрение, что writeconfig этому счётчику вредит - я вставлю сброс максимума в writeconfig
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: 14292
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by AndreyB »

Сделал сброс второго максимума по triggerinfo, сделал сброс всех по writeconfig

Code: Select all

2017-05-19 21_50: EngineState: zeroTestTime=19 maxHowFarOff=18437
2017-05-19 21_50: EngineState: advanceLookupTime=3562 now=-1815097676 fuelCalcTime=5442
2017-05-19 21_50: EngineState: ignitionSchTime=2141 injectonSchTime=0
2017-05-19 21_50: EngineState: mapTime=7483/hipTime=1517/rpmTime=852/mainTriggerCallbackTime=10099
2017-05-19 21_50: EngineState: maxLockTime=0 / maxTriggerReentraint=0
2017-05-19 21_50: EngineState: maxEventQueueTime=26838
2017-05-19 21_50: EngineState: hipLastExecutionCount=1
2017-05-19 21_50: EngineState: hwSetTimerTime 478
2017-05-19 21_50: EngineState: totalTriggerHandlerMaxTime=24665
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
andreika
donator
donator
Posts: 461
Joined: Mon Feb 13, 2017 2:35 pm
Location: Kiev

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by andreika »

Загрузил дефолтную Serial-прошивку (текущий релиз из ветки master, без моих правок) и попробовал поизмерять totalTriggerHandlerMaxTime. Обороты делал 1200, в программной эмуляции self_stimulation. Это оказалось сложно, т.к. ошибок связи в этой версии прошивки так много, что команда выключения disable self_stimulation проходит раза с десятого. Всё-таки, драйвер Serial в этом плане явно хуже, чем DMA (пусть даже такой примитивный) - это можно считать ещё одним доказательством в пользу DMA-варианта.

Значения получил такие:
1) Первый старт сразу после заливки прошивки: totalTriggerHandlerMaxTime = 470078 (!)
2) Тут же второй старт: t = 54047.
3) Далее, после резета платы пробую снова на той же прошивке: t = 470128
4) Затем снова старт без перезагрузки: t = 54288. И ещё один t = 54266.
Причём, количество ошибок связи (потери байт) что при 470к, что при 54к... И никакие writeToFlashNow() при этом не вызывались. Я думаю, что это значение 54000 можно считать "рабочим" в моём случае. И оно явно великовато (по сравнению с 24500 на дискавери Андрея). Завтра ещё продолжу более глубокий профайлинг и попробую найти "гиблое" место в коде...
Плюс, надо бы аналогично замерить и PrecisionTimer - он ведь тоже мешает UARTу. Например, как-нибудь так:

Code: Select all

diff --git a/firmware/controllers/trigger/trigger_central.cpp b/firmware/controllers/trigger/trigger_central.cpp
index 01a96083..3a499599 100644
--- a/firmware/controllers/trigger/trigger_central.cpp
+++ b/firmware/controllers/trigger/trigger_central.cpp
@@ -390,6 +390,7 @@ extern uint32_t maxLockTime;
 extern uint32_t maxEventQueueTime;
 extern uint32_t hipLastExecutionCount;
 extern uint32_t hwSetTimerTime;
+extern uint32_t maxPrecisionTimerTime;
 
 extern int maxHowFarOff;
 extern uint32_t *cyccnt;
@@ -400,6 +401,7 @@ extern int vvtEventFallCounter;
 void resetMaxValues() {
 #if (EFI_PROD_CODE || EFI_SIMULATOR) || defined(__DOXYGEN__)
 	maxEventQueueTime = triggerMaxDuration = 0;
+	maxPrecisionTimerTime = 0;
 #endif /* EFI_PROD_CODE || EFI_SIMULATOR */
 }
 
@@ -501,6 +503,7 @@ void triggerInfo(void) {
 	scheduleMsg(logger, "hwSetTimerTime %d", hwSetTimerTime);
 
 	scheduleMsg(logger, "totalTriggerHandlerMaxTime=%d", triggerMaxDuration);
+	scheduleMsg(logger, "maxPrecisionTimerTime=%d", maxPrecisionTimerTime);
 	resetMaxValues();
 
 #endif /* EFI_PROD_CODE */
diff --git a/firmware/hw_layer/microsecond_timer.cpp b/firmware/hw_layer/microsecond_timer.cpp
index 54e4197a..b89cf2b5 100644
--- a/firmware/hw_layer/microsecond_timer.cpp
+++ b/firmware/hw_layer/microsecond_timer.cpp
@@ -15,6 +15,7 @@
 #include "microsecond_timer.h"
 #include "scheduler.h"
 #include "rfiutil.h"
+#include "efilib2.h"
 
 // https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=https%3a%2f%2fmy.st.com%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fcortex_mx_stm32%2fInterrupt%20on%20CEN%20bit%20setting%20in%20TIM7&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&currentviews=474
 
@@ -39,6 +40,8 @@ static char buff[32];
 
 static int timerFreezeCounter = 0;
 
+uint32_t maxPrecisionTimerTime = 0;
+
 extern bool hasFirmwareErrorFlag;
 
 /**
@@ -93,7 +96,13 @@ static void callback(GPTDriver *gptp) {
 //	chSysUnlockFromISR()
 //	;
 
+	uint32_t before = GET_TIMESTAMP();
+
 	globalTimerCallback(NULL);
+
+	uint32_t precisionTimerTime = GET_TIMESTAMP() - before;
+	if (precisionTimerTime > maxPrecisionTimerTime)
+		maxPrecisionTimerTime = precisionTimerTime;
 }
 
 static void usTimerWatchDog(void) {
Можно добавить нечто подобное? И сказать мне "эталонные" циферки?

* * *

И, да, всё забываю сказать о ещё одной неприятности. Если обороты нулевые, то каждые 20 секунд срабатывает сторожевой таймер Консоли, и COM-порт перезапускается:

Code: Select all

Thu May 18 17:03:33 EEST 2017<EOT>: Sending packet 4F 
Thu May 18 17:03:33 EEST 2017<EOT>: Waiting for 2 byte(s): output channels header
Thu May 18 17:03:33 EEST 2017<EOT>: Waiting for 361 byte(s): output channels body
Thu May 18 17:03:33 EEST 2017<EOT>: Sending packet 47 
Thu May 18 17:03:33 EEST 2017<EOT>: Waiting for 2 byte(s): text header
Thu May 18 17:03:33 EEST 2017<EOT>: Waiting for 5 byte(s): text body
Thu May 18 17:03:33 EEST 2017<EOT>: Sending packet 4F 
Thu May 18 17:03:33 EEST 2017<EOT>: Waiting for 2 byte(s): output channels header
Thu May 18 17:03:33 EEST 2017<EOT>: ConnectionWatchdog.reconnectTimer restarting
Thu May 18 17:03:33 EEST 2017<EOT>: postMessage SerialManager: Restarting serial IO
Thu May 18 17:03:33 EEST 2017<EOT>: postMessage SerialManager: Opening port: COM4
Причём, как видно, пакеты с платы продолжают поступать (снифер COM-порта это подтверждает). Можно было бы подумать на порченные данные и ошибки CRC, но показания датчиков-то обновляются! Хотя бы парочка пакетов за 20 секунд уж как-нибудь просочилась бы по-любому, при любой связи. Но, видимо, после requestOutputChannels() нет сброса таймера по onDataArrived() :( Для текстового протокола оно хоть ловит строчку "time", а для бинарного - не понятно... И поэтому, похоже, Консоль ждёт именно текстовых строк почему-то, и если за 20 секунд ни одна строчка не появляется, то всё - резет порта... Я не знаю, баг ли это или фича, но надо бы понять причину... :?
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by puff »

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

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by AndreyB »

Добавил и переименовал некоторые штуки. Самое интересное - maxSchedulingPrecisionLoss
А еще не понятно, почему с #define EFI_CLOCK_LOCKS TRUE не работает maxLockedDuration

А воспоминания мои про maxLockedDuration - там всё про копирование того же самого datalogger массива под локом?

enable self_stimulation
writeconfig

перезагрузка
2017-05-21 11_10: EngineState: zeroTestTime=19 maxSchedulingPrecisionLoss=229408
2017-05-21 11_10: EngineState: advanceLookupTime=3927 now=650311474 fuelCalcTime=4974
2017-05-21 11_10: EngineState: ignitionSchTime=2197 injectonSchTime=0
2017-05-21 11_10: EngineState: mapTime=7563/hipTime=1484/rpmTime=836/mainTriggerCallbackTime=7474
2017-05-21 11_10: EngineState: maxEventCallbackDuration=344272
2017-05-21 11_10: EngineState: hipLastExecutionCount=1
2017-05-21 11_10: EngineState: hwSetTimerDuration=476
2017-05-21 11_10: EngineState: totalTriggerHandlerMaxTime=342307
2017-05-21 11_10: EngineState: maxPrecisionCallbackDuration=385832




2017-05-21 11_10: EngineState: zeroTestTime=19 maxSchedulingPrecisionLoss=19590
2017-05-21 11_10: EngineState: advanceLookupTime=4018 now=-1587439871 fuelCalcTime=5009
2017-05-21 11_10: EngineState: ignitionSchTime=2197 injectonSchTime=0
2017-05-21 11_10: EngineState: mapTime=7550/hipTime=1486/rpmTime=817/mainTriggerCallbackTime=7509
2017-05-21 11_10: EngineState: maxEventCallbackDuration=26288
2017-05-21 11_10: EngineState: hipLastExecutionCount=1
2017-05-21 11_10: EngineState: hwSetTimerDuration=478
2017-05-21 11_10: EngineState: totalTriggerHandlerMaxTime=24194
2017-05-21 11_10: EngineState: maxPrecisionCallbackDuration=28650
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: 14292
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by AndreyB »

оживил EFI_CLOCK_LOCKS
2017-05-21 13_25: EngineState: ignitionSchTime=2197 injectonSchTime=0
2017-05-21 13_25: EngineState: mapTime=7571/hipTime=1486/rpmTime=817/mainTriggerCallbackTime=7166
2017-05-21 13_25: EngineState: maxLockedDuration=385284 / maxTriggerReentraint=0
2017-05-21 13_25: EngineState: maxEventCallbackDuration=344272
2017-05-21 13_25: EngineState: hipLastExecutionCount=1
2017-05-21 13_25: EngineState: hwSetTimerDuration=478
2017-05-21 13_25: EngineState: totalTriggerHandlerMaxTime=342307
2017-05-21 13_25: EngineState: maxPrecisionCallbackDuration=385952
2017-05-21 13_25: EngineState: confirmation_ls /:4
2017-05-21 13_25: EngineState: Error: No File system is mounted
2017-05-21 13_25: EngineState: confirmation_triggerinfo:11
2017-05-21 13_25: EngineState: Template CUSTOM (0) trigger TT_NISSAN_SR20VE (24) useRiseEdge=Yes onlyFront=No useOnlyFirstChannel=No tdcOffset=1431655765
2017-05-21 13_25: EngineState: trigger#1 event counters up=1539/down=1538
2017-05-21 13_25: EngineState: expected cycle events 8/0/0
2017-05-21 13_25: EngineState: trigger type=24/need2ndChannel=No
2017-05-21 13_25: EngineState: expected duty #0=0.95/#1=0.00
2017-05-21 13_25: EngineState: synchronizationNeeded=Yes/isError=No/total errors=3 ord_err=2/total revolutions=386/self=Yes
2017-05-21 13_25: EngineState: gap from 7.25 to 16.00
2017-05-21 13_25: EngineState: primary trigger input: PC6
2017-05-21 13_25: EngineState: primary trigger simulator: PD1 OM_DEFAULT freq=1200
2017-05-21 13_25: EngineState: trigger error extra LED: NONE OM_DEFAULT
2017-05-21 13_25: EngineState: primary logic input: NONE
2017-05-21 13_25: EngineState: secondary logic input: NONE
2017-05-21 13_25: EngineState: zeroTestTime=19 maxSchedulingPrecisionLoss=19066
2017-05-21 13_25: EngineState: advanceLookupTime=4050 now=-2097790646 fuelCalcTime=4783
2017-05-21 13_25: EngineState: ignitionSchTime=2197 injectonSchTime=0
2017-05-21 13_25: EngineState: mapTime=7563/hipTime=1484/rpmTime=817/mainTriggerCallbackTime=7235
2017-05-21 13_25: EngineState: maxLockedDuration=28136 / maxTriggerReentraint=0
2017-05-21 13_25: EngineState: maxEventCallbackDuration=26316
2017-05-21 13_25: EngineState: hipLastExecutionCount=1
2017-05-21 13_25: EngineState: hwSetTimerDuration=477
2017-05-21 13_25: EngineState: totalTriggerHandlerMaxTime=24222
2017-05-21 13_25: EngineState: maxPrecisionCallbackDuration=28798
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
andreika
donator
donator
Posts: 461
Joined: Mon Feb 13, 2017 2:35 pm
Location: Kiev

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by andreika »

russian wrote:Добавил и переименовал некоторые штуки. Самое интересное - maxSchedulingPrecisionLoss
А еще не понятно, почему с #define EFI_CLOCK_LOCKS TRUE не работает maxLockedDuration
Спасибо! Я тут сделал сравнительную табличку:
compare.gif
compare.gif (8.96 KiB) Viewed 18579 times
Правда, у меня почему-то maxLockedDuration по-прежнему выдаёт 0, даже с последними правками ядра (submodule update делал).
А остальные числа вроде сопоставимы.

* * *

Я, кстати, выяснил причину тех частых потерь пакетов и нестабильной работы прошивки у меня. Причина в том, что я - идиот! :lol:
Точнее, я запускал сборку прошивки просто через compile_and_program.bat, которая вызывает голый Makefile, а тот по умолчанию почему-то собирает отладочную версию прошивки, без оптимизаций. А когда я стал собирать релизную версию с параметрами из clean_compile_two_versions.bat, то UART стал работать гораздо лучше, и потери стали минимальны даже на дефолтном драйвере Serial. Так что таким растяпам как я, наверное, действительно лучше сидеть на дискавери и помалкивать - тут Андрей прав... :twisted:

* * *

Что касается текущих проблем:
1) Перезапуск COM-порта Консолью через каждые 20 секунд при нулевых оборотах - остался. Причину пока так и не выяснил. Может, кто-то что-то знает про это?

2) При запуске эмулятора (что встроенного self_stimulator, что внешнего аппаратного на Ардуино) - куча ошибок:

Code: Select all

EngineState: [self_stimulation] enabled
EngineState: WARNING: trigger not happy current 56/0/0 expected 116/0/0
EngineState: error: synchronizationPoint @ index 55 expected 116/0/0 got 56/0/0
EngineState: 688: gap=0.33/2.99/0.99 @ 1 while expected 2.25/3.75 and 0.00/100000.00 error=1
EngineState: 688: gap=0.99/0.33/2.99 @ 3 while expected 2.25/3.75 and 0.00/100000.00 error=1
EngineState: 688: gap=0.99/0.99/0.33 @ 5 while expected 2.25/3.75 and 0.00/100000.00 error=1
...
Настройки при этом такие:
board_configuration.cpp
(8.57 KiB) Downloaded 404 times
Т.е. FOUR_STROKE_CRANK_SENSOR, TT_TOOTHED_WHEEL_60_2, globalTriggerAngleOffset = 114.
Строчек с "gap=.." много, но они показываются только при "запуске" оборотов, а потом в Консоли уже не пишутся.
Обороты показываются нормально до 3000, а выше - с проблемами (скачут сильно). А на 7000 оборотах прошивка вообще зависает и связь рвётся. Повторюсь, это на self_stimulator.
При этом потери UART бывают редко, единичные, в основном, при запуске/останове оборотов.

3) Пробовал из ТюнерСтудио сделать запись параметрав RPM для эмулятора - говорит, что burned, но после перезагрузки данные не сохраняются... Что-то не так с записью во флеш?

В остальном вроде проблем пока нет. Но с этими тремя проблемами хотелось бы разобраться...
puff
contributor
contributor
Posts: 2961
Joined: Mon Nov 11, 2013 11:28 am
Location: Moskau

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by puff »

хм. про 3) - если речь просто о задании RPM эмулятора, насколько я помню, у меня тюнерстудия пару недель назад наоборот ничего не меняла, пока не перезагружу.
то есть обороты поставил, сохранил - а они никуда не меняются. зато после перезагрузки платы изменились.
User avatar
AndreyB
Site Admin
Posts: 14292
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by AndreyB »

andreika wrote:3) Пробовал из ТюнерСтудио сделать запись параметрав RPM для эмулятора - говорит, что burned, но после перезагрузки данные не сохраняются... Что-то не так с записью во флеш?
Я лично стимуляцией всегда через консоль управляю - "rpm XXX" командой. Я подозреваю, что там просо нет кода проверки, что настройки поменялись - и новые настройки не применяются. По каждой записи все параметры не пере-применяются, там в каждом месте нужно проверять, что параметры поменялись, и применять их.
isOldVersion или сравение current configurations version vs previous configurations version.
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
andreika
donator
donator
Posts: 461
Joined: Mon Feb 13, 2017 2:35 pm
Location: Kiev

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by andreika »

Понятно, спасибо. А что по первым двум пунктам можно посоветовать?
User avatar
AndreyB
Site Admin
Posts: 14292
Joined: Wed Aug 28, 2013 1:28 am
Location: Jersey City
Github Username: rusefillc
Slack: Andrey B

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by AndreyB »

andreika wrote:Я, кстати, выяснил причину тех частых потерь пакетов и нестабильной работы прошивки у меня. Причина в том, что я - идиот! :lol:
Точнее, я запускал сборку прошивки просто через compile_and_program.bat, которая вызывает голый Makefile, а тот по умолчанию почему-то собирает отладочную версию прошивки, без оптимизаций. А когда я стал собирать релизную версию с параметрами из clean_compile_two_versions.bat, то UART стал работать гораздо лучше, и потери стали минимальны даже на дефолтном драйвере Serial. Так что таким растяпам как я, наверное, действительно лучше сидеть на дискавери и помалкивать - тут Андрей прав... :twisted:
ты к себе несправедлив, скорее мы оба идиоты - в идеальной картине мира не должно поведение прошивки меняться от параметров компиляции, там запас огромный должен быть.

К сожалению ты страдаешь от того, что для тебя uart критичен - а я живу на usb и там всё проще похоже.

идей по другим вопросам нет по тем же причинам.
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
andreika
donator
donator
Posts: 461
Joined: Mon Feb 13, 2017 2:35 pm
Location: Kiev

Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)

Post by andreika »

russian wrote:идей по другим вопросам нет по тем же причинам.
Спасибо за поддержку! Ты намекаешь, что ошибки триггера 60-2 тоже связаны с uart? :o В таком случае, можно ли тебя попросить запустить у себя self_stimulator на 7000 оборотов на моих настройках? Т.е. на TT_TOOTHED_WHEEL_60_2, FOUR_STROKE_CRANK_SENSOR, globalTriggerAngleOffset = 114 - и показать текстовый лог Консоли?

P.S. Почему-то даже на виндовом симуляторе вылазят ошибки на 60-2, хоть и в меньшей степени:

Code: Select all

EngineState: WARNING: trigger not happy current 104/0/0 expected 116/0/0
EngineState: WARNING: re-adding element into event_queue
EngineState: WARNING: looks like skipped spark event 700 c3
Post Reply