123

Dependencies:   mbed

Fork of LG by igor Apu

Committer:
Diletant
Date:
Sat Mar 12 12:51:42 2016 +0000
Revision:
80:7eb5dbb80c81
Parent:
78:0ea9d02b7b46
Child:
149:abbf7663d27d
Device&settings&protocol&UART updates. Not final!!!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Diletant 80:7eb5dbb80c81 1 08.03.2016 Dile Tant
Diletant 80:7eb5dbb80c81 2 1. Строка в основном цикле:
Diletant 80:7eb5dbb80c81 3 if (Event100K) { // событие раз в 100 кГц
Diletant 80:7eb5dbb80c81 4 на самом деле выполняется каждый цикл основного цикла после первого прерывания таймера.
Diletant 80:7eb5dbb80c81 5 Смотрим:
Diletant 80:7eb5dbb80c81 6 Event100K = 0; - main.c
Diletant 80:7eb5dbb80c81 7
Diletant 80:7eb5dbb80c81 8 Event100K --; - MTimer.c, TIMER2_IRQHandler, Event100K == 65535;
Diletant 80:7eb5dbb80c81 9
Diletant 80:7eb5dbb80c81 10 if (Event100K) { - main.c, основной цикл, Event100K == 65535;
Diletant 80:7eb5dbb80c81 11 Event100K --; - main.c, основной цикл, Event100K == 65534;
Diletant 80:7eb5dbb80c81 12
Diletant 80:7eb5dbb80c81 13 if (Event100K) { - main.c, основной цикл, Event100K == 65534;
Diletant 80:7eb5dbb80c81 14 Event100K --; - main.c, основной цикл, Event100K == 65533;
Diletant 80:7eb5dbb80c81 15 и т.д. Я неправ?
Diletant 80:7eb5dbb80c81 16 2. Проверка счетчиков времени в основном цикле может приводить к ситуации, когда первый байт счетчика времени прочитан перед прерыванием, а второй байт - после.
Diletant 80:7eb5dbb80c81 17 В результате, значение счетчика будет прочитано некорректно. Например: до прерывания 0x01ff, после прерывания 0x0200, прочитано 0x0100!
Diletant 80:7eb5dbb80c81 18 Для корректной работы с таймером обращаться к счетчикам времени следует только в прерывании таймера.
Diletant 80:7eb5dbb80c81 19 Для основного цикла должны быть доступны только флаги временных событий, выставляемые в прерывании, проверяемые и сбрасываемые в основном цикле в процессе обработки события.
Diletant 80:7eb5dbb80c81 20
Diletant 78:0ea9d02b7b46 21 06.03.2016 Dile Tant
Diletant 78:0ea9d02b7b46 22 Прием команд может быть организован через прерывание: DeviceUART.h/DeviceUART.c.
Diletant 78:0ea9d02b7b46 23 Заполнение программного кольцевого буфера приема в прерывании независимо от чтения из него и выполнения команд в основном цикле.
Diletant 78:0ea9d02b7b46 24
Diletant 71:7835a18110bd 25 23.02.2016 Dile Tant
Diletant 71:7835a18110bd 26 % - деление по модулю (остаток от деления)
Diletant 71:7835a18110bd 27 int length = (start > end) ? (end + InputBufferSize - start) : (end - start);
Diletant 71:7835a18110bd 28 Если (start > end), то length = (end + InputBufferSize - start), иначе length = (end - start)
Diletant 71:7835a18110bd 29 Выздоравливай
Diletant 71:7835a18110bd 30
igor_v 70:9cc252048c59 31 22,02,2013 Апухтин
igor_v 70:9cc252048c59 32 Про очеред запрсов!
igor_v 70:9cc252048c59 33 1 я не знаю, но думаю что не надо, в гороскопе нет я процесов, которые должны чегото ждать, или не так?
igor_v 70:9cc252048c59 34 запросили счетчик вот получай, выставили напряжении вот тебе, => все команды должны быть выполненны сразу, я так думаю.
igor_v 70:9cc252048c59 35 естественно должно быть запрос и сразу ответ, гирос всегда ведомый, если запрос широковешателный, то пускай ждут ответа какоето время
igor_v 70:9cc252048c59 36 лишняя путаница
igor_v 70:9cc252048c59 37
igor_v 70:9cc252048c59 38 чтобы получать сразу несколко команд, можно их хранить в буфере приема (считывать не стирая).
igor_v 70:9cc252048c59 39
igor_v 70:9cc252048c59 40 1. Буфер приема должен иметь возможность содержать очередь запросов. Все запросы должны быть обработаны в порядке приема.
igor_v 70:9cc252048c59 41 2. Новый запрос отменяет отправку ответа на предыдущий запрос, если ответ еще не отправлен. -- ок
igor_v 70:9cc252048c59 42 3. Буфер передачи должен содержать только один ответ одновременно. -- ок
igor_v 70:9cc252048c59 43 4. Буфер приема целесообразно организовать как кольцевой с размером, достаточным для 10 команд.
igor_v 70:9cc252048c59 44 5. Буфер передачи целесообразно организовать как линейный с размером, достаточным для хранения самого длинного ответа.
igor_v 70:9cc252048c59 45
igor_v 70:9cc252048c59 46 по остальному не знаю, наверно очеред на команды не нужна
igor_v 70:9cc252048c59 47
igor_v 70:9cc252048c59 48
igor_v 70:9cc252048c59 49 при этом все данные зранятся в буфере приема (нераскодированные) они уже сделанны, я их сейчас переписываю
igor_v 70:9cc252048c59 50 с тебя просто обработчик команды и потом его мне (строкой) и с задержкой. приболел я
igor_v 70:9cc252048c59 51
igor_v 70:9cc252048c59 52
igor_v 70:9cc252048c59 53 завтра позвоню
igor_v 70:9cc252048c59 54
igor_v 70:9cc252048c59 55 чо значит (b->buffer[(start + 1) % InputBufferSize]) знак %
igor_v 70:9cc252048c59 56 int length = (start > end) ? (end + InputBufferSize - start) : (end - start); и вот это
igor_v 70:9cc252048c59 57
igor_v 70:9cc252048c59 58
igor_v 70:9cc252048c59 59
igor_v 70:9cc252048c59 60
igor_v 70:9cc252048c59 61 мистер Л
Diletant 69:70849751d98e 62 *** Обработка запросов ***
Diletant 69:70849751d98e 63 1. Нужно ли предусматривать возможность программного буфера передачи UART1 содержать ответ более чем на 1 запрос?
Diletant 69:70849751d98e 64 1.1. В старой программе буфер содержит 1 ответ. Запросы поступают с достаточным интервалом для передачи ответа.
Diletant 69:70849751d98e 65 1.2. Для разных запросов могут быть разными: время задержки ответа при широковещательном запросе, период ответа,
Diletant 69:70849751d98e 66 скорость ответа и скорость ожидаемого запроса. Значит нужно хранить не ответы, а запросы, причем для каждого запроса
Diletant 69:70849751d98e 67 нужен свой счетчик задержки или периода.
Diletant 69:70849751d98e 68 Если поступают два широковещательных запроса без достаточного интервала, устанавливать разные задержки ответа?
Diletant 69:70849751d98e 69 В какой момент переключать ожидаемую скорость запроса и скорость ответа?
Diletant 69:70849751d98e 70 Требуется сценарий использования.
Diletant 69:70849751d98e 71 2. Нужно ли предусматривать возможность программного буфера приема UART1 содержать более 1 запроса?
Diletant 69:70849751d98e 72 2.1. Если не нужен ответ на каждый из запросов к прибору, то имеет смысл отправлять эти запросы без интервала ожидания.
Diletant 69:70849751d98e 73 Каждый новый запрос отменяет ответ на предыдущий запрос.
Diletant 69:70849751d98e 74
Diletant 69:70849751d98e 75 Выводы:
Diletant 69:70849751d98e 76 1. Буфер приема должен иметь возможность содержать очередь запросов. Все запросы должны быть обработаны в порядке приема.
Diletant 69:70849751d98e 77 2. Новый запрос отменяет отправку ответа на предыдущий запрос, если ответ еще не отправлен.
Diletant 69:70849751d98e 78 3. Буфер передачи должен содержать только один ответ одновременно.
Diletant 69:70849751d98e 79 4. Буфер приема целесообразно организовать как кольцевой с размером, достаточным для 10 команд.
Diletant 69:70849751d98e 80 5. Буфер передачи целесообразно организовать как линейный с размером, достаточным для хранения самого длинного ответа.