Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/clunet.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey V. DUDANOV <sergey.dudanov@gmail.com>2016-07-08 08:13:06 +0300
committerGitHub <noreply@github.com>2016-07-08 08:13:06 +0300
commit6f64f51639553fb62ad25737006c12c571beee23 (patch)
tree21cce67ff1418ca85b936bc3785e0e06680de189
parentf4d67852489a917f8d87d14cfbf03d27a2abe248 (diff)
Update clunet.c
Увеличил время ожидания с 1Т до 1.5Т перед первым входом в прерывание сравнения для передачи данных, чтобы гарантированно нашу передачу остановил механизм обнаружения конфликта передачи со стороны другого устройства в процедуре внешнего прерывания чтения. Возможно можно отказаться от стадии PREINIT, так как все должно работать без дополнительных пауз.
-rw-r--r--clunet.c10
1 files changed, 3 insertions, 7 deletions
diff --git a/clunet.c b/clunet.c
index 631a8d5..5682eb7 100644
--- a/clunet.c
+++ b/clunet.c
@@ -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(); // Запускаем отправку данных и полагаемся на нашу отработку конфликтов при чтении и отправки
}
}