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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> ARM7 от Atmel. Запрет прерываний., почему он заходит в Spurious Interrupt
prottoss
сообщение Jun 10 2012, 16:24
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(MaslovVG @ Jun 10 2012, 22:17) *
Здесь вы описываете не FIFO (очередь) а а стек (последний вышол первый вышел). Почитайте Кнут "основные алгоритмы".
Не имеет значения. пусть будут два индекса - на чтение и на запись. Смысл один - нужно разрулить доступ к данным


--------------------
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 10 2012, 16:32
Сообщение #17


Гуру
******

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



Разруливается это двумя индексами - у каждого процесса - свой.
Вот типичная реализация (проанализируйте методы read() и write()):
CODE
class clas {
volatile size_t rpos, wpos;
u8 buf[N + 1];
public:
size_t write(int);
int read();
clas() { rpos = wpos = 0; }
}
int clas::read() //если нет данных - возвращает отрицательное
{
int i;
size_t j = rpos;
if (i = j - wpos) {
i = buf[j] + 1;
rpos = ((j) ? j: ncell(buf)) - 1;
}
return i - 1;
}
size_t clas::write(int c) //если не удалось записать (буфер полон) возвращает != 0
{
size_t i, i1, i2;
if (!(i1 = i2 = wpos)) i1 = ncell(buf);
if (i = (--i1 - rpos)) {
buf[i2] = c;
wpos = i1;
}
return i;
}
#define ncell(m) (sizeof(m) / sizeof((m)[0]))
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 10 2012, 16:53
Сообщение #18


Гуру
******

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



Жарко у вас тут sm.gif

Действительно, запрещать прерывания совсем не обязательно, если есть только два индекса.
Сам долго пользовался подобной реализацией, но потом все же отказался - ущерб от кратковременного запрета прерываний мизерный, а вот незадействованный элемент FIFO раздражает сильно.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 10 2012, 17:11
Сообщение #19


Гуру
******

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



Только когда пишет один процессор, а читает - другой, тут запрет прерываний не спасёт wink.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 10 2012, 17:17
Сообщение #20


Гуру
******

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



Цитата(jcxz @ Jun 10 2012, 21:11) *
Только когда пишет один процессор, а читает - другой, тут запрет прерываний не спасёт wink.gif

Ну, у нас тут пока только прерывания обсуждались вроде wink.gif
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jun 10 2012, 18:04
Сообщение #21


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(aaarrr @ Jun 10 2012, 20:53) *
Действительно, запрещать прерывания совсем не обязательно, если есть только два индекса.

Это могут читать дети! Ваш совет применим, если индексы представлены типами данных, которые на процессоре атомарны.
В случае, когда индексы многобайтные, а компилятор выполняет операцию выборки или присваивания несколькми командами -
всё будет работать не так как ожидает программист.

Сообщение отредактировал Genadi Zawidowski - Jun 10 2012, 18:31
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 10 2012, 18:17
Сообщение #22


Гуру
******

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



Смотрим на название форума sm.gif
В ARM все 8-/16-/32-разрядные команды сохранения атомарны. Ну если только преднамеренно не разместить их невыровненными...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 10 2012, 18:20
Сообщение #23


Гуру
******

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



Цитата(Genadi Zawidowski @ Jun 10 2012, 22:04) *
Это могут читать дети!

Если "дети" пишут реализацию FIFO, то такие грабли только на пользу. Как заметили уже, на ARM такое придется делать специально.
Go to the top of the page
 
+Quote Post
Shein
сообщение Jun 11 2012, 22:31
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 4-03-07
Пользователь №: 25 855



Цитата(jcxz @ Jun 10 2012, 21:17) *
Смотрим на название форума sm.gif
В ARM все 8-/16-/32-разрядные команды сохранения атомарны. Ну если только преднамеренно не разместить их невыровненными...

Кстати, про атомарность этих операций на ARM'е я провтыкал самым позорным образом 01.gif Да-а, трудно иногда скакать, то AVR/PIC, то ARM...
Убрал запрет прерываний, а сделал просто двойное чтение: если результаты разнятся - перечитать. А выходит и это лишнее.
Go to the top of the page
 
+Quote Post

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

 


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


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