prottoss 0 10 июня, 2012 Опубликовано 10 июня, 2012 · Жалоба Здесь вы описываете не FIFO (очередь) а а стек (последний вышол первый вышел). Почитайте Кнут "основные алгоритмы".Не имеет значения. пусть будут два индекса - на чтение и на запись. Смысл один - нужно разрулить доступ к данным Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 10 июня, 2012 Опубликовано 10 июня, 2012 · Жалоба Разруливается это двумя индексами - у каждого процесса - свой. Вот типичная реализация (проанализируйте методы 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])) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 10 июня, 2012 Опубликовано 10 июня, 2012 · Жалоба Жарко у вас тут :) Действительно, запрещать прерывания совсем не обязательно, если есть только два индекса. Сам долго пользовался подобной реализацией, но потом все же отказался - ущерб от кратковременного запрета прерываний мизерный, а вот незадействованный элемент FIFO раздражает сильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 10 июня, 2012 Опубликовано 10 июня, 2012 · Жалоба Только когда пишет один процессор, а читает - другой, тут запрет прерываний не спасёт ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 10 июня, 2012 Опубликовано 10 июня, 2012 · Жалоба Только когда пишет один процессор, а читает - другой, тут запрет прерываний не спасёт ;) Ну, у нас тут пока только прерывания обсуждались вроде ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 10 июня, 2012 Опубликовано 10 июня, 2012 (изменено) · Жалоба Действительно, запрещать прерывания совсем не обязательно, если есть только два индекса. Это могут читать дети! Ваш совет применим, если индексы представлены типами данных, которые на процессоре атомарны. В случае, когда индексы многобайтные, а компилятор выполняет операцию выборки или присваивания несколькми командами - всё будет работать не так как ожидает программист. Изменено 10 июня, 2012 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 10 июня, 2012 Опубликовано 10 июня, 2012 · Жалоба Смотрим на название форума :) В ARM все 8-/16-/32-разрядные команды сохранения атомарны. Ну если только преднамеренно не разместить их невыровненными... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 10 июня, 2012 Опубликовано 10 июня, 2012 · Жалоба Это могут читать дети! Если "дети" пишут реализацию FIFO, то такие грабли только на пользу. Как заметили уже, на ARM такое придется делать специально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shein 0 11 июня, 2012 Опубликовано 11 июня, 2012 · Жалоба Смотрим на название форума :) В ARM все 8-/16-/32-разрядные команды сохранения атомарны. Ну если только преднамеренно не разместить их невыровненными... Кстати, про атомарность этих операций на ARM'е я провтыкал самым позорным образом :01: Да-а, трудно иногда скакать, то AVR/PIC, то ARM... Убрал запрет прерываний, а сделал просто двойное чтение: если результаты разнятся - перечитать. А выходит и это лишнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться