А вот ещё в ту же тему вопрос: как добится валидности 4 байтной величины, если её значение меняется в прерывании? (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
|
Отправлено
507 29 ноября 2006 г. 01:45
|
|
|
|
Ясно что в АВР с 4 байтами одной командой работать не будет. Т.е. в процессе чтения, сравнения и копирования можем получить 1,2,3 байта старые, а остатки новые. Чепуха получится. Как этого получше избежать?
Запрещать прерывания на время чтения? Если честно, не очень красиво. Во-первых не поплывет ли точность, во-вторых мало-ли что там ещё крутится будет...
Можно семафор забацать. Типа один-байт переменная. Её выставляем в 1 перед чтением. В прерывании её чекаем - если 1, то не трогаем 4-байтный счетчик. а семафор щелкаем на 2. проца чтения декрементит семафор и если он остался в 1, то увеличивает счетчик на 1.
"Не, бред полный, но как рассказывает!" (с) День Радио
Составить ответ
|||
Конференция
|||
Архив
Ответы
- например - иметь две переменных и бинарный указатель на них — йцукен (29.11.2006 21:04 195.151.194.51, пустое)
- Ответ: все гораздо проще — hugo (29.11.2006 19:36 213.221.17.130, 180 байт)
- примени счетчик считанных байтов. Считал/обновил байт - прирастил счетчик. Обрабатывать данные можно только при счетчике = 4, После обработки счетчик сбросил - и по новой. — =L.A.= (29.11.2006 10:58 213.134.214.10, пустое)
- Чтите 3(три) раза и мажорируйте:-) — -=ВН=- (29.11.2006 10:23 217.25.80.230, пустое)
- Если уж на несколько команд прерывания нельзя запретить, то контроллер и схемотехника выбраны явно неудачно. — VL (29.11.2006 09:28 82.209.192.210, пустое)
- Выставляем семафор, по семафору прерывание переписывает переменную в другую, по факту сброса семафора юзаем корректное данное. Правда латентность на одно прерывание. — SM (29.11.2006 02:20 213.141.159.26, пустое)
- Запрещать прерывания на время чтения - проще всего, и никаких проблем, флаг таймера запоминается и точность никак не страдает — =AVR= (29.11.2006 02:07 80.92.96.19, пустое)
- Очень просто. Читаем в локальную переменную, а затем сравниваем с исходной. Если не ОК, то снова. — rezident (29.11.2006 02:00 89.148.212.143, пустое)
Перейти к списку ответов
|||
Конференция
|||
Архив
|||
Главная страница
|||
Содержание