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:
authorAlexey 'Cluster' Avdyukhin <ClusterM@users.noreply.github.com>2016-07-09 12:26:52 +0300
committerGitHub <noreply@github.com>2016-07-09 12:26:52 +0300
commita12360de38007fce42a8b7d97abaca4e03d9d511 (patch)
tree68bc2de582a57a4d4693fda74c3167854d2da3d4
parentb6ae8a32f6d53af09f19f5cef4e80b26687581cc (diff)
parent6da96206cdb9e3bd9ee54f7d4334a1e2e638a736 (diff)
Merge pull request #8 from dudanov/master
Оптимизация кода
-rw-r--r--clunet.c64
-rw-r--r--clunet.h2
2 files changed, 26 insertions, 40 deletions
diff --git a/clunet.c b/clunet.c
index 3d03e35..197abfb 100644
--- a/clunet.c
+++ b/clunet.c
@@ -104,8 +104,6 @@ clunet_data_received(const uint8_t src_address, const uint8_t dst_address, const
/* Процедура прерывания сравнения таймера */
ISR(CLUNET_TIMER_COMP_VECTOR)
{
- uint8_t now = CLUNET_TIMER_REG; // Запоминаем текущее значение таймера
-
/* Если достигли фазы завершения передачи, то завершим ее и освободим передатчик */
if (clunetSendingState == CLUNET_SENDING_STATE_DONE)
{
@@ -124,52 +122,42 @@ ISR(CLUNET_TIMER_COMP_VECTOR)
{
CLUNET_SEND_INVERT; // Инвертируем значение сигнала
- /* Если отпустили линию */
+ /* Если отпустили линию, то запланируем время паузы перед следующей передачей длительностью 1Т */
if (!CLUNET_SENDING)
- CLUNET_TIMER_REG_OCR = now + CLUNET_T; // то запланируем время паузы перед следующей передачей длительностью 1Т
+ CLUNET_TIMER_REG_OCR += CLUNET_T;
/* Если прижали линию к земле, то запланируем время передачи сигнала в зависимости от текущей фазы передачи */
+ /* Фаза передачи данных */
+ else if (clunetSendingState == CLUNET_SENDING_STATE_DATA)
+ {
+ /* Планируем следующее прерывание в зависимости от значения бита */
+ CLUNET_TIMER_REG_OCR += ((dataToSend[clunetSendingCurrentByte] & (1 << clunetSendingCurrentBit)) ? CLUNET_1_T : CLUNET_0_T);
+ /* Если передан байт данных */
+ if (++clunetSendingCurrentBit & 8)
+ {
+ /* Если не все данные отосланы */
+ if (++clunetSendingCurrentByte < clunetSendingDataLength)
+ clunetSendingCurrentBit = 0; // начинаем передачу следующего байта с бита 0
+ /* Иначе передача всех данных закончена */
+ else
+ clunetSendingState++; // переходим к следующей фазе завершения передачи пакета
+ }
+ }
else
- switch (clunetSendingState)
+ switch (clunetSendingState++)
{
- /* Фаза передачи данных */
- case CLUNET_SENDING_STATE_DATA:
-
- // Планируем следующее прерывание чтобы отпустить линию в зависимости от значения бита
- CLUNET_TIMER_REG_OCR = now + ((dataToSend[clunetSendingCurrentByte] & (1 << clunetSendingCurrentBit)) ? CLUNET_1_T : CLUNET_0_T);
-
- /* Если передан байт данных */
- if (++clunetSendingCurrentBit & 8)
- {
- /* и не все данные отосланы */
- if (++clunetSendingCurrentByte < clunetSendingDataLength)
- clunetSendingCurrentBit = 0; // то начинаем передачу следующего байта с бита 0
- /* и передача всех данных закончена */
- else
- clunetSendingState++; // то переходим к следующей фазе завершения передачи пакета
- }
- break;
-
/* Фаза инициализации передачи пакета (время 10Т) */
case CLUNET_SENDING_STATE_INIT:
-
- CLUNET_TIMER_REG_OCR = now + CLUNET_INIT_T; // Планируем следующее прерывание
- clunetSendingState++; // К следующей фазе передачи старшего бита приоритета
+ CLUNET_TIMER_REG_OCR += CLUNET_INIT_T;
break;
-
/* Фаза передачи приоритета (старший бит) */
case CLUNET_SENDING_STATE_PRIO1:
-
- CLUNET_TIMER_REG_OCR = now + ((clunetCurrentPrio > 2) ? CLUNET_1_T : CLUNET_0_T);
- clunetSendingState++; // К следующей фазе передачи младшего бита приоритета
+ CLUNET_TIMER_REG_OCR += ((clunetCurrentPrio > 2) ? CLUNET_1_T : CLUNET_0_T);
break;
-
/* Фаза передачи приоритета (младший бит) */
case CLUNET_SENDING_STATE_PRIO2:
-
- CLUNET_TIMER_REG_OCR = now + ((clunetCurrentPrio & 1) ? CLUNET_0_T : CLUNET_1_T);
- clunetSendingCurrentByte = clunetSendingCurrentBit = 0; // Обнуляем счётчик
- clunetSendingState++; // К следующей фазе передачи данных
+ CLUNET_TIMER_REG_OCR += ((clunetCurrentPrio & 1) ? CLUNET_0_T : CLUNET_1_T);
+ clunetSendingCurrentByte = clunetSendingCurrentBit = 0; // Готовим счётчики передачи данных
}
}
}
@@ -223,6 +211,7 @@ ISR(CLUNET_INT_VECTOR)
/* Если линию прижало к нулю */
if (CLUNET_READING)
{
+ clunetTimerStart = now; // Запомним время начала сигнала
/* Если мы в режиме передачи и прижали не мы, то замолкаем и ожидаем, тем более, что наши передаваемые данные уже битые */
/* Обеспечивается быстрая отработка ошибки на линии во избежание конфликтов */
if (clunetSendingState && !CLUNET_SENDING)
@@ -230,7 +219,6 @@ ISR(CLUNET_INT_VECTOR)
CLUNET_DISABLE_TIMER_COMP;
clunetSendingState = CLUNET_SENDING_STATE_WAITING_LINE;
}
- clunetTimerStart = now; // Запомним время начала сигнала
}
/* Иначе если линию отпустило */
@@ -326,9 +314,7 @@ clunet_init()
MCUCSR = 0;
}
-/*
- Возвращает 0, если готов к передаче, иначе приоритет текущей задачи
-*/
+/* Возвращает 0, если готов к передаче, иначе приоритет текущей задачи */
uint8_t
clunet_ready_to_send()
{
diff --git a/clunet.h b/clunet.h
index 80b4161..f6fb677 100644
--- a/clunet.h
+++ b/clunet.h
@@ -18,7 +18,7 @@
#define CLUNET_SENDING_STATE_PRIO2 3
#define CLUNET_SENDING_STATE_DATA 4
#define CLUNET_SENDING_STATE_DONE 5
-#define CLUNET_SENDING_STATE_WAITING_LINE 6
+#define CLUNET_SENDING_STATE_WAITING_LINE 8
#define CLUNET_READING_STATE_IDLE 0
#define CLUNET_READING_STATE_INIT 1