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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> повторные прерывания LPC17xx
sidy
сообщение Jan 16 2014, 18:57
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Цитата(jcxz @ Jan 16 2014, 22:24) *
Как же можно ответить ответить на Ваш вопрос, если невозможно догадаться, что у вас за регистры такие SR и CNT?
В UM на LPC17xx таковых нету.
Ну если под CNT ещё можно предположить регистр TC, то с SR вообще теряюсь в догадках....
Подозреваю что у вас не LPC17x. А в таком случае нужно указывать какой CPU имеете в виду если вопрос касается периферии и желательно указывать как она у вас сконфигурена.

Да у меня STM32F407, но думаю что переферия таймеров очень похожа с LPC17x отличия только а названиях регистров.
TIM11->CNT - счетный регистр таймера
TIM11->SR - регистр статуса таймера
TIM_SR_UIF - флаг в регистре статуса, который устанавливается при прерывании

Сообщение отредактировал sidy - Jan 16 2014, 19:09
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 16 2014, 19:39
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Только в LPC флаги прерываний квтируются не записью '0', а записью '1'.
Отвечая на Ваш вопрос, думаю что вряд-ли будет проблема из-за отсутствия барьеров после квитирования флага прерывания, так как после этой операции и до выхода из ISR у вас много команд, так что сброс флага должен успеть дойти до периферии таймера до выхода из ISR.
И опять-же - что за мания такая использовать операции чтения-модификации-записи там где нужна просто запись? А остальные флаги потерять не боитесь? Да и просто - ЗАЧЕМ????
Go to the top of the page
 
+Quote Post
sidy
сообщение Jan 16 2014, 19:44
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Цитата(jcxz @ Jan 16 2014, 23:39) *
И опять-же - что за мания такая использовать операции чтения-модификации-записи там где нужна просто запись? А остальные флаги потерять не боитесь? Да и просто - ЗАЧЕМ????

Немного не понял где у меня чтение-модификация-запись и как сделать просто запись? И какие флаги можно потерять?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 17 2014, 07:06
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



это стандартная ошибка при сбросах флагов

REG |= INTERRUPT_FLAG;

обычно эти регистры не чувствительны к одному сигналу и реагируют только на другой. в LPC, например запись 0 ничего не делает, а запись 1 сбрасывает флаг. Если в регистре лежит
0x11, а мы хотим сбросить FLAG = 0x01.
то запись REG |= FLAG равносильна REG = REG | FLAG => REG = 0x11 | 0x01 => REG = 0x11 => REG ==== 0;
то есть сбрасывая один флаг, мы случайно сбросили все остальные что были в регистрах...

именно поэтому регистр сделать не чувствителен к нулю и правильно сбрасывать

REG = FLAG => REG = 0x01 => REG ==== 0x10; То есть запись 0 в старшие биты, где стоит флаг его не тронет, снимется только младший флаг.
Go to the top of the page
 
+Quote Post
sidy
сообщение Jan 17 2014, 07:33
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Понял, т.е. мы прочитали, изменили, записали в регистр число 0x11 и сбросили 0-й бит и 5ый бит.
Т.е. операция вида REG&=~FLAG тоже относится к чтения модификация запись:
REG&=~FLAG => REG=REG&(~FLAG) => REG=0x11&(~0x10) => REG=0x11&(0x01) => REG=0x01?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 17 2014, 10:18
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



скорее так
REG&=~FLAG => REG=REG&(~FLAG) => REG=0x11&(~0x01) => REG=0x11&(0x10) => REG=0x10?
FLAG = 01
и при сбросе 0 все вроде сработает, но есть и вторая опасность.

REG = 0x011
операция
REG&=~FLAG
не делается за 1 такт

вы получите значение регистра 0x011
на след шаге 0x011 & 0x110 = 0x010 (FLAG = 0x001, ~FLAG = 0x110)
и в конце получите
REG = 0x010
младший флаг сбрасываете, второй не трогаете (это все про сброс нулем)

но если за время этих трех тактов произошло прерывание
и регистр стал REG = 0x111,
то появившийся самый старший бит вы тоже сбросите.

а если вы сразу напишите
REG = (~FLAG)

то все будет хорошо даже если произойдет прерывание во время выполнения команды сброса.


Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 17 2014, 10:50
Сообщение #22


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(sidy @ Jan 17 2014, 09:33) *
Т.е. операция вида REG&=~FLAG тоже относится к чтения модификация запись:
Ага, только REG=0x11&(~0x10) => REG=0x11&(0xEF) => REG=0x10, то есть сбросили все флаги кроме нужного


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 17 2014, 20:17
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(Сергей Борщ @ Jan 17 2014, 14:50) *
Ага, только REG=0x11&(~0x10) => REG=0x11&(0xEF) => REG=0x10, то есть сбросили все флаги кроме нужного


не это мы типа говорим про процы со сбросом 0, а не 1. Но смысл один, сбрасывать используя состояние регистра - нельзя!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 03:06
Рейтинг@Mail.ru


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