реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Атомарные операции (таймер Т1), что будет если...?
Stas-
сообщение Oct 25 2011, 00:01
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 157
Регистрация: 20-01-09
Из: Новосибирск
Пользователь №: 43 645



Читаю даташит на мегу1284 и никак понять не могу что там с atomic operations и к чему они ведут.
Вот, например, меговский таймер Т1 тактируется от внешней частоты, которая всего в 4 раза меньше системного клока.
Вдруг захотелось считать регистр содержимого счетчика TCNT1 (сначала low байт, потом high байт).
То есть, клоков внешней частоты на Т1 пройдет заведомо больше, чем один, за то время, пока я буду этот регистр читать.

Что я считаю из регистра TCNT1 в итоге? Наверное, ничего хорошего, но что именно?
Будет ли таймер при таких условиях считать внешнюю частоту нормально или пропустит клоки, пока читать буду?
Go to the top of the page
 
+Quote Post
dxp
сообщение Oct 25 2011, 01:55
Сообщение #2


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Stas- @ Oct 25 2011, 07:01) *
Читаю даташит на мегу1284 и никак понять не могу что там с atomic operations и к чему они ведут.
Вот, например, меговский таймер Т1 тактируется от внешней частоты, которая всего в 4 раза меньше системного клока.
Вдруг захотелось считать регистр содержимого счетчика TCNT1 (сначала low байт, потом high байт).
То есть, клоков внешней частоты на Т1 пройдет заведомо больше, чем один, за то время, пока я буду этот регистр читать.

Что я считаю из регистра TCNT1 в итоге? Наверное, ничего хорошего, но что именно?
Будет ли таймер при таких условиях считать внешнюю частоту нормально или пропустит клоки, пока читать буду?

AVR'овские таймеры были организованы так, что чтение из младшего байта таймерного регистра вызывает одновременное чтение старшего байта во временный (теневой) регистр, и последующее чтение из старшего байта таймерного регистра физически производится из упомянутого теневого регистра. Таким образом, совершенно без разницы, какие там соотношения частот тактирования ядра и таймера - чтение из таймерного 16-разрядного регистра всегда производится так, что читаются все 16 бит. Единственное, что нужно соблюдать порядок чтения половинок регистра - в документации это достаточно внятно указано.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 25 2011, 08:49
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



А Microchip для своих PIC-ов, у которых нет упомянутой выше функции, предлагал читать старшую часть таймера, потом младшую, потом снова старшую, и, если она не изменилась, считать результат чтения правильным.
Go to the top of the page
 
+Quote Post
Schulz_K
сообщение Oct 28 2011, 11:08
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 25-05-10
Из: Киев
Пользователь №: 57 515



Атомарные операции в данном случае очень важны. При чтении low байт у вас одновременно читается и high байт во временный регистр, как уже сказал dxp. Так вот, если между чтением low и high байтов у вас произойдет прерывание - в его обработчике этот временный регистр может затереться другим значением, т.к. он один для всех двухбайтных регистров I/O. Атомарная операция, это та, которую нельзя разорвать прерыванием - это нужно вручную выставлять, например: сохранить состояние бита глобальных прерываний, запретить прерывания, выполнить чтение/запись двухбайтного регистра, возобновить старое состояние бита прерываний.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Oct 28 2011, 11:13
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



QUOTE (Schulz_K @ Oct 28 2011, 15:08) *
сохранить состояние бита глобальных прерываний


это лишнее . Cli за глаза хватит


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 28 2011, 13:57
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Schulz_K @ Oct 28 2011, 15:08) *
... он один для всех двухбайтных регистров I/O.

Вы проверили это "в железе", или это - Ваши домыслы?
Чтение DS не прояснило количество временных регистров (плохо смотрел?), а термин" Temporary Register" всегда встречается в единственном числе... Что породило сомнения - я всегда считал, что временный регистр есть у каждого шестнадцатибитного регистра, за исключением тех, для которых прямо написано об их отсутствии.
Имхо, Atmel'овцы - не дураки и, вероятно, поступили "по-уму" встроив в МК отнюдь не один временный регистр. Под рукой нет МК, чтобы проверить это "в железе"...
Симулятор AVRStudio (ох, не доверяю я этим симуляторам!) утверждает, что временный регистр всё-таки не один.

Кто-то может это проверить на реальном МК и подтвердить (или опровергнуть) слова Schulz_K?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Oct 28 2011, 15:24
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



QUOTE (Палыч @ Oct 28 2011, 17:57) *
Кто-то может это проверить на реальном МК и подтвердить (или опровергнуть) слова Schulz_K?


CODE
  lds  temp,OCR1AL
  lds  temp1,ADCH  
  lds  mean0,ADCL
  lds  mean1,OCR1AL

Сделал так , для каждого из устройств получил свои значения. Т.е получается у ADC свой временный регистр у таймера свой.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение Oct 28 2011, 15:39
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



Цитата(ILYAUL @ Oct 28 2011, 18:24) *
Код
  lds  temp,OCR1AL
  lds  temp1,ADCH  
  lds  mean0,ADCL
  lds  mean1,OCR1AL

Сделал так , для каждого из устройств получил свои значения. Т.е получается у ADC свой временный регистр у таймера свой.


У АЦП вообще нет временного регистра. Там при чтении ADCL обновление результата преобразования вообще блокируется до пока ADCH не прочитают. Со всеми вытекающими.


Да и вообще у вас с кодом чето не то.

Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Oct 28 2011, 16:02
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



QUOTE (Artem_Petrik @ Oct 28 2011, 19:39) *
У АЦП вообще нет временного регистра. Там при чтении ADCL обновление результата преобразования вообще блокируется до пока ADCH не прочитают. Со всеми вытекающими.
Да и вообще у вас с кодом чето не то.


Да с АЦП - промашка, но других 16 битных нет. Хотя и OCR тоже без TEMP Запросил support Atmel .
CODE
lds  temp,TCNT1L
  lds  temp1,ICR1H  
  lds  mean0,ICR1L
  lds  mean1,TCNT1H
Если считывать так , то в temp-ах значения TCNT , а в mean значения ICR , но для тааймера всё таки он един
А Вы , что первый раз asm видите?


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение Oct 28 2011, 18:14
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



Цитата(ILYAUL @ Oct 28 2011, 19:02) *
А Вы , что первый раз asm видите?

в отцитированном у меня коде Вы дважды читаете OCR1AL и ни разу OCR1AH. Сначала читается ADCH, потом ADCL, хотя нормальные люди делают наоборот. Так что не в асме дело sm.gif
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Oct 28 2011, 18:44
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



QUOTE (Artem_Petrik @ Oct 28 2011, 22:14) *
в отцитированном у меня коде Вы дважды читаете OCR1AL и ни разу OCR1AH. Сначала читается ADCH, потом ADCL, хотя нормальные люди делают наоборот. Так что не в асме дело sm.gif


Ох извините , когда писал пост , чуточку ошибся, вместо
CODE
lds mean1,OCR1AL
читать OCR1AH


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 28 2011, 19:14
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ILYAUL @ Oct 28 2011, 15:13) *
это лишнее . Cli за глаза хватит

Нет, отнюдь не лишнее.

Цитата(ILYAUL @ Oct 28 2011, 20:02) *
Запросил support Atmel .

Зачем?
Цитата
Each 16-bit timer has a single 8-bit register for temporary storing of the
high byte of the 16-bit access. The same Temporary Register is shared between all 16-
bit registers within each 16-bit timer

Казалось бы, все ясно написано.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Oct 28 2011, 20:10
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



QUOTE (aaarrr @ Oct 28 2011, 23:14) *
Нет, отнюдь не лишнее.

Что может произойти кроме RESET в момент чтения/записи если cli
QUOTE
Each 16-bit timer has a single 8-bit register for temporary storing of the
high byte of the 16-bit access. The same Temporary Register is shared between all 16-
bit registers within each 16-bit timer

Спасибо.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 28 2011, 20:24
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Запрещать/разрешать прерывания в произвольный момент времени можно только в очень простой программе, когда заведомо известно, что в данный момент они действительно разрешены.
Более правильный и универсальный подход - сохранить-запретить-восстановить.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Oct 28 2011, 20:38
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



QUOTE (aaarrr @ Oct 29 2011, 00:24) *
Запрещать/разрешать прерывания в произвольный момент времени можно только в очень простой программе, когда заведомо известно, что в данный момент они действительно разрешены.
Более правильный и универсальный подход - сохранить-запретить-восстановить.

Подождите. Когда программа подходит к месту чтения из 16-bit регистров , Вам не пофиг разрешены или запрещены прерывания. CLI либо изменит состояние I, либо нет. При этом не нарушив ход выполнения программы , так как другие флаги не изменятся. Я видел , конечно примеры в DS, но помоэму это избыточно.
И это хорошо , если есть свободный регистр куда можно пихнуть SREG , а если нет , надо запомнить регистр , запихнуть SREG и все потом в обратном порядке
. Тогда уж сразу отдельная подпрограмма.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 20:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.0148 секунд с 7
ELECTRONIX ©2004-2016