123
Fork of LG by
develop.txt@80:7eb5dbb80c81, 2016-03-12 (annotated)
- 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?
User | Revision | Line number | New 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. Буфер передачи целесообразно организовать как линейный с размером, достаточным для хранения самого длинного ответа. |