Перейти к содержанию
    

ARM7 от Atmel. Запрет прерываний.

Здесь вы описываете не FIFO (очередь) а а стек (последний вышол первый вышел). Почитайте Кнут "основные алгоритмы".
Не имеет значения. пусть будут два индекса - на чтение и на запись. Смысл один - нужно разрулить доступ к данным

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разруливается это двумя индексами - у каждого процесса - свой.

Вот типичная реализация (проанализируйте методы read() и write()):

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]))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Жарко у вас тут :)

 

Действительно, запрещать прерывания совсем не обязательно, если есть только два индекса.

Сам долго пользовался подобной реализацией, но потом все же отказался - ущерб от кратковременного запрета прерываний мизерный, а вот незадействованный элемент FIFO раздражает сильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только когда пишет один процессор, а читает - другой, тут запрет прерываний не спасёт ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только когда пишет один процессор, а читает - другой, тут запрет прерываний не спасёт ;)

Ну, у нас тут пока только прерывания обсуждались вроде ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Действительно, запрещать прерывания совсем не обязательно, если есть только два индекса.

Это могут читать дети! Ваш совет применим, если индексы представлены типами данных, которые на процессоре атомарны.

В случае, когда индексы многобайтные, а компилятор выполняет операцию выборки или присваивания несколькми командами -

всё будет работать не так как ожидает программист.

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрим на название форума :)

В ARM все 8-/16-/32-разрядные команды сохранения атомарны. Ну если только преднамеренно не разместить их невыровненными...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это могут читать дети!

Если "дети" пишут реализацию FIFO, то такие грабли только на пользу. Как заметили уже, на ARM такое придется делать специально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрим на название форума :)

В ARM все 8-/16-/32-разрядные команды сохранения атомарны. Ну если только преднамеренно не разместить их невыровненными...

Кстати, про атомарность этих операций на ARM'е я провтыкал самым позорным образом :01: Да-а, трудно иногда скакать, то AVR/PIC, то ARM...

Убрал запрет прерываний, а сделал просто двойное чтение: если результаты разнятся - перечитать. А выходит и это лишнее.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...