diff options
author | Sergey V. DUDANOV <sergey.dudanov@gmail.com> | 2016-07-08 08:13:06 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-07-08 08:13:06 +0300 |
commit | 6f64f51639553fb62ad25737006c12c571beee23 (patch) | |
tree | 21cce67ff1418ca85b936bc3785e0e06680de189 | |
parent | f4d67852489a917f8d87d14cfbf03d27a2abe248 (diff) |
Update clunet.c
Увеличил время ожидания с 1Т до 1.5Т перед первым входом в прерывание сравнения для передачи данных, чтобы гарантированно нашу передачу остановил механизм обнаружения конфликта передачи со стороны другого устройства в процедуре внешнего прерывания чтения.
Возможно можно отказаться от стадии PREINIT, так как все должно работать без дополнительных пауз.
-rw-r--r-- | clunet.c | 10 |
1 files changed, 3 insertions, 7 deletions
@@ -39,7 +39,8 @@ clunet_start_send() if (clunetSendingState != CLUNET_SENDING_STATE_PREINIT) // Если не нужна пауза... clunetSendingState = CLUNET_SENDING_STATE_INIT; // Инициализация передачи clunetSendingCurrentByte = clunetSendingCurrentBit = 0; // Обнуляем счётчик - CLUNET_TIMER_REG_OCR = CLUNET_TIMER_REG + CLUNET_T; // Планируем таймер, обычно почему-то прерывание срабатывает сразу + // подождем 1.5Т, чтобы нас гарантированно могли остановить при передаче на линии со стороны другого устройства в процедуре внешнего прерывания + CLUNET_TIMER_REG_OCR = CLUNET_TIMER_REG + (CLUNET_T + CLUNET_T / 2); // Планируем таймер, обычно почему-то прерывание срабатывает сразу CLUNET_ENABLE_TIMER_COMP; // Включаем прерывание сравнения таймера } @@ -234,12 +235,7 @@ clunet_send(const uint8_t address, const uint8_t prio, const uint8_t command, co clunetSendingDataLength = size + (CLUNET_OFFSET_DATA + 1); - // TODO: может возникнуть ситуация, что мы прервав собственную передачу, будем вынуждены ожидать линию, которую освободили выше - // TODO: если пакет принимается размером больше, чем приемный буфер, либо более редких других ситуациях (когда нет инициализации на линии), то clunetReadingState = 0 - запустится передача, - // что приведет либо к разрешимому конфликту и стадии ожидания линии или прервет чужую передачу даже с максимальным приоритетом - // придется делать проверку на конфликт в процедуре чтения по внешнему прерыванию - - clunet_start_send(); + clunet_start_send(); // Запускаем отправку данных и полагаемся на нашу отработку конфликтов при чтении и отправки } } |