Re: ВАЗ-2103 "Рыжик" (1977) :: Lada 1500 "Ryzhik" (1977)
Posted: Sun May 14, 2017 7:47 pm
Я закоммитил под https://github.com/rusefi/rusefi/issues/414 - можешь проверить?
The most advanced open source ECU
https://rusefi.com/forum/
Проверил. Если просто подключиться, то всё нормально, нет проблем. Но если включить эмулятор оборотов, то опять помехи. Видимо, precise-таймер гадит UARTу, когда есть обороты...russian wrote:Я закоммитил под https://github.com/rusefi/rusefi/issues/414 - можешь проверить?
Написал первичный код DMA. И он даже частично работает. Работает он при коннекте с TunerStudio. А вот при коннекте с Консолью - прошивка виснет намертво.russian wrote:Я согласен на dma, буду рад PR
Code: Select all
static log_buf_t pendingBuffers0 CCM_OPTIONAL;
Ооо, знакомое чувство!andreika wrote:Я целый вечер убил на полуслепой дебаг, пока понял, в чём дело!..
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
*/
ТС не присылает Текстовые сообщения, а консоль присылаетpuff wrote:О. И вот как это объяснить что с тс работает, а с консолью - нет?
"Жопой чую", что оно может быть связано с моим багом.
Спасибо, это помогло! Теперь к Консоли коннектится без проблем.russian wrote:Сделал просто static log_buf_t pendingBuffers0;
Code: Select all
#define PRECISE_SCHEDULING_TIMER_PRIORITY 5 // сигналы катушек, форсунок
#define ICU_PRIORITY 4 // захват сигналов ДПКВ
#define UART_DMA_IRQ_PRIORITY 3 // копирование байта из UART
Code: Select all
chSysLockFromISR();
chIQPutI(&tsUartDma.fifoRxQueue, c);
chSysUnlockFromISR();
нетpuff wrote:про симулятор триггера - по-моему там нарочно вносилось какое-то искажение
тогда PR?andreika wrote:Как бы то ни было, это решение по DMA лучше, чем Serial
Первый вариант реализации DMA, о котором я писал, я уже выложил в своём репозитории:russian wrote:тогда PR?andreika wrote:Как бы то ни было, это решение по DMA лучше, чем Serial
а без твоих изменений как оно работает?andreika wrote: Дело в том, что я провёл тесты на аппаратном эмуляторе ДПКВ, которые показывают, что при оборотах выше 3000 начинает теряться сигнал input capture.
В плане высоких оборотов ещё не знаю, буду завтра проверять ещё. А так, если не поднимать приоритеты UART и оставить дефолтный Serial, то лезет куча ошибок связи:russian wrote:а без твоих изменений как оно работает?
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
и т.д.
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
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
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
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¤tviews=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) {
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
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
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
Спасибо! Я тут сделал сравнительную табличку: Правда, у меня почему-то maxLockedDuration по-прежнему выдаёт 0, даже с последними правками ядра (submodule update делал).russian wrote:Добавил и переименовал некоторые штуки. Самое интересное - maxSchedulingPrecisionLoss
А еще не понятно, почему с #define EFI_CLOCK_LOCKS TRUE не работает maxLockedDuration
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
...
Я лично стимуляцией всегда через консоль управляю - "rpm XXX" командой. Я подозреваю, что там просо нет кода проверки, что настройки поменялись - и новые настройки не применяются. По каждой записи все параметры не пере-применяются, там в каждом месте нужно проверять, что параметры поменялись, и применять их.andreika wrote:3) Пробовал из ТюнерСтудио сделать запись параметрав RPM для эмулятора - говорит, что burned, но после перезагрузки данные не сохраняются... Что-то не так с записью во флеш?
ты к себе несправедлив, скорее мы оба идиоты - в идеальной картине мира не должно поведение прошивки меняться от параметров компиляции, там запас огромный должен быть.andreika wrote:Я, кстати, выяснил причину тех частых потерь пакетов и нестабильной работы прошивки у меня. Причина в том, что я - идиот!
Точнее, я запускал сборку прошивки просто через compile_and_program.bat, которая вызывает голый Makefile, а тот по умолчанию почему-то собирает отладочную версию прошивки, без оптимизаций. А когда я стал собирать релизную версию с параметрами из clean_compile_two_versions.bat, то UART стал работать гораздо лучше, и потери стали минимальны даже на дефолтном драйвере Serial. Так что таким растяпам как я, наверное, действительно лучше сидеть на дискавери и помалкивать - тут Андрей прав...
Спасибо за поддержку! Ты намекаешь, что ошибки триггера 60-2 тоже связаны с uart? В таком случае, можно ли тебя попросить запустить у себя self_stimulator на 7000 оборотов на моих настройках? Т.е. на TT_TOOTHED_WHEEL_60_2, FOUR_STROKE_CRANK_SENSOR, globalTriggerAngleOffset = 114 - и показать текстовый лог Консоли?russian wrote:идей по другим вопросам нет по тем же причинам.
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