diff options
author | Alexey 'Cluster' Avdyukhin <ClusterM@users.noreply.github.com> | 2016-07-09 12:26:52 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-07-09 12:26:52 +0300 |
commit | a12360de38007fce42a8b7d97abaca4e03d9d511 (patch) | |
tree | 68bc2de582a57a4d4693fda74c3167854d2da3d4 | |
parent | b6ae8a32f6d53af09f19f5cef4e80b26687581cc (diff) | |
parent | 6da96206cdb9e3bd9ee54f7d4334a1e2e638a736 (diff) |
Merge pull request #8 from dudanov/master
Оптимизация кода
-rw-r--r-- | clunet.c | 64 | ||||
-rw-r--r-- | clunet.h | 2 |
2 files changed, 26 insertions, 40 deletions
@@ -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() { @@ -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 |