jcxz 236 9 февраля, 2013 Опубликовано 9 февраля, 2013 · Жалоба Использование bitband позволит избавиться от ENTER_CRITICAL()/EXIT_CRITICAL(). Ну и как теперь, выигрыш "просмотрелся"(с) ? ;) С чего-бы это?? Только разве что в одном конкретном случае - если область, которую надо защитить критической секцией, ограничивается одним словом и только на одну операцию (укладывающуюся в одну команду ASM). Всё то же самое (и даже гораздо больше) решается с помощью LDREX/STREX. Ну-ка реализуйте мне пожалуйста с помощью битбандинга стандартную атомарную операцию CompareAndExchange? :laughing: А с помощью LDREX/STREX это делается легко (или с помощью ENTER_CRITICAL()/EXIT_CRITICAL()). А в RMW-операциях можно налететь на грабли и по другому - просто записав битик туда, куда не нужно, - помечено как reserved биты, а каким образом оно себя проявить может - хз.Думаю - вряд-ли. Скорей всего такие биты прочитаются с тем значением, которое туда можно безопасно записывать. Написал библиотеку для работы с UART. При инициализации передаем адрес бита ножки GPIO, отвечающую за передачу в RS-485. Как быть теперь? Применить свою виртуальную адресацию битов портов? По библиотеке для этих целей могу "протащить" лишь одну 32-битную переменную. А что - так трудно упаковать номер бита в порту в младшие 5 бит, а номер порта - в старшую часть 32бит? Пока не выпустили корпуса с 2^32 ног это вроде не должно составлять проблем... :laughing: Можно даже с помощью макросов сделать это красиво, а-ля: //определения пинов: #define PIN_RS485_1_OE 1, 25 #define PIN_RS485_2_OE 0, 26 // #define RS485init2(..., port, pin) RS485_Init(..., (port) << 5 | (pin)) #define RS485init(..., port_pin) RS485init2(..., port_pin) void RS485_Init(..., uint pinOE) { ... } //Вызов: RS485init(..., PIN_RS485_1_OE); RS485init(..., PIN_RS485_2_OE); Если Вам больше нравится именование портов не через 0,1,2..., а через A,B,C,... то нетрудно выполнить макрозамену: #define PIN_RS485_1_OE B, 25 #define PIN_RS485_2_OE A, 26 // #define PORTA 0 #define PORTB 1 ... #define concatAB_(a, b) a##b #define concatAB(a, b) concatAB_(a, b) #define RS485init2(..., port, pin) RS485_Init(..., concatAB(PORT, port) << 5 | (pin)) ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tahoe 0 9 февраля, 2013 Опубликовано 9 февраля, 2013 · Жалоба А в RMW-операциях можно налететь на грабли и по другому - просто записав битик туда, куда не нужно, - помечено как reserved биты, а каким образом оно себя проявить может - хз. Можно. Но я же спросил не о новых проблемах, а о решении конкретной и реально существующей. Так кроме bitband, ещё как-то можно корректно и безопасно сделать ремап? Кстати, даже с bitband тоже не все так просто оказалось, но в итоге решилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HHIMERA 0 9 февраля, 2013 Опубликовано 9 февраля, 2013 · Жалоба Можно. Но я же спросил не о новых проблемах, а о решении конкретной и реально существующей. Нет там никакой проблемы с ремап... есть временное недопонимание/трактование по своему... Это всё из ряда: Кстати, даже с bitband тоже не все так просто оказалось, но в итоге решилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 9 февраля, 2013 Опубликовано 9 февраля, 2013 · Жалоба А что - так трудно упаковать номер бита в порту в младшие 5 бит, а номер порта - в старшую часть 32бит? Пока не выпустили корпуса с 2^32 ног это вроде не должно составлять проблем... :laughing: Можно даже с помощью макросов сделать это красиво, а-ля: Сравните с существующей реализацией: if(con->txena) *con->txena = TX_ON; и во что она скомпилируется. Или вот такое: WORKLED_bit ^= 1; В этом плане GPIO на bit-band очень удобен. При этом "цена вопроса" - 6кБ в соответствующем регионе! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tahoe 0 9 февраля, 2013 Опубликовано 9 февраля, 2013 · Жалоба Нет там никакой проблемы с ремап... есть временное недопонимание/трактование по своему... Это всё из ряда: Ребят, что в той ветке, что сейчас, вы оба просто не вникли в суть проблемы. поэтому ее не видите. Придется повторить ещё раз. Есть регистр AFIO_MAPR, в котором есть три write only бита SWJ_CFG[2:0]. Результат чтения из них - не определен. Как модифицировать произвольный бит этого регистра, сохранив ранее установленные в SWJ_CFG[2:0] значения? Учитывая, что прочитать SWJ_CFG[2:0] невозможно. Причем это не высосано из пальца, я реально налетел на эту проблему, когда понадобился remap SPI1, а биты SWJ_CFG были уже установлены. Тот редкий случай, когда получу удовольствие, если меня ткнут носом. Вот только шансов на это нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 9 февраля, 2013 Опубликовано 9 февраля, 2013 · Жалоба запомнить значение битов в переменной%) в самом начале программы, установить их и не забывать до самого конца. То есть не читать их из регистра, а брать из этой переменной)... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tahoe 0 9 февраля, 2013 Опубликовано 9 февраля, 2013 · Жалоба запомнить значение битов в переменной%) в самом начале программы, установить их и не забывать до самого конца. То есть не читать их из регистра, а брать из этой переменной)... Как соорудить костыли, это я и сам догадаюсь. ;) Но что тогда делать с драйвером периферии, причем таких драйверов может висеть на одном SPI несколько штук. В каждый из них прописывать этот костыль? Или все-таки использовать bit-band, дабы вообще не трогать SWJ_CFG[2:0]? ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HHIMERA 0 9 февраля, 2013 Опубликовано 9 февраля, 2013 (изменено) · Жалоба Ребят, что в той ветке, что сейчас, вы оба просто не вникли в суть проблемы. поэтому ее не видите. Придется повторить ещё раз. Есть регистр AFIO_MAPR, в котором есть три write only бита SWJ_CFG[2:0]. Результат чтения из них - не определен. Как модифицировать произвольный бит этого регистра, сохранив ранее установленные в SWJ_CFG[2:0] значения? Учитывая, что прочитать SWJ_CFG[2:0] невозможно. А как вы думаете... как боролись с RMW в младших ПИКах, в которых не было регистра LAT ??? Создавали "фантомный" регистр... типа: запомнить значение битов в переменной%) И это не считалось проблемой... считалось - решением... Причем это не высосано из пальца, я реально налетел на эту проблему, когда понадобился remap SPI1, а биты SWJ_CFG были уже установлены. Тот редкий случай, когда получу удовольствие, если меня ткнут носом. Вот только шансов на это нет. Сколько налетал на "проблему" в STM32, столько раз сам и убеждался, что просто "не дочитал/не досмотрел/не угадал вариант неоднозначной трактовки"... ИМХО... Вся сложность STM32 - в его простоте... при широких возможностях... Изменено 9 февраля, 2013 пользователем HHIMERA Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tahoe 0 9 февраля, 2013 Опубликовано 9 февраля, 2013 · Жалоба И это не считалось проблемой... считалось - решением... С каких пор, вырезание гландов через анус, называется "решением"? И что тогда называть "костылём", если создание фантомного регистра - "решение". Реальное решение, это использовать bit-band. Вот это - действительно решение. А наплодить тонну фантомных регистров, создать прослойку для работы с ними и радоваться, что хоть как-то разрулили аппаратный недостаток... Философия Microchip/Microsoft в действии? :) Сколько налетал на "проблему" в STM32, столько раз сам и убеждался, что просто "не дочитал/не досмотрел/не угадал вариант неоднозначной трактовки"... ИМХО... Вся сложность STM32 - в его простоте... при широких возможностях... Ну вот, опять общие слова - "вы не поняли", "вы не дочитали". Ну а конкретно-то можно? Что именно я "недочитал" и "не понял", касательно работы с AFIO_MAPR_SWJ_CFG? Может наоборот, это вы оба недочитали, раз не используете bit-band, а заводите какую-то левую переменную в памяти? Да чего уж скромничать, продублируем все регистры ядра и периферии в памяти. Вот будет веселье. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HHIMERA 0 9 февраля, 2013 Опубликовано 9 февраля, 2013 · Жалоба С каких пор, вырезание гландов через анус, называется "решением"? И что тогда называть "костылём", если создание фантомного регистра - "решение". Реальное решение, это использовать bit-band. Вот это - действительно решение. А наплодить тонну фантомных регистров, создать прослойку для работы с ними и радоваться, что хоть как-то разрулили аппаратный недостаток... Философия Microchip/Microsoft в действии? :) Разрулить аппаратный "недостаток" (а для меня это просто факт, особенность регистра, не более) - и есть решение... А постоянно ныть о "проблемах" (которые многие просто, почему-то, и не замечают) - и есть хождение "на костылях"... Вот будет веселье. Вот... лучше не надо... веселья... поверьте... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tahoe 0 9 февраля, 2013 Опубликовано 9 февраля, 2013 · Жалоба Разрулить аппаратный "недостаток" (а для меня это просто факт, особенность регистра, не более) - и есть решение... Есть много разных способов избавиться от головной боли. Гильотина - не лучший. Хотя некоторые сочтут его вполне годным. В данном случае, никто не ноет. Есть вариант с bit-band. Это - решение. Все остальное - не решения, а какая-то отрыжка из конца 90-х, с их кривыми PIC-ами. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HHIMERA 0 9 февраля, 2013 Опубликовано 9 февраля, 2013 · Жалоба Есть много разных способов избавиться от головной боли. Гильотина - не лучший. Хотя некоторые сочтут его вполне годным. "Проблемы индейцев - вождя не колышат!"(С)... В данном случае, никто не ноет. Есть вариант с bit-band. Это - решение. Все остальное - не решения, а какая-то отрыжка из конца 90-х, с их кривыми PIC-ами. :) "Решение"... или... "праздничный костыль"??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 9 февраля, 2013 Опубликовано 9 февраля, 2013 · Жалоба не очень понимаю в чем спор то? раньше бит-банда не было, его не хватало, его сделали. Появился инструмент, появился он не просто так, значит он нужен, и его надо использовать. Но с другой стороны и без него решали задачи, в 9 и 7 арме если не ошибаюсь его не было. Мои проекты вообще далеки от драйверов, операционок и прочих прелестей, я если что-то иничу или ремаплю, то делаю это один раз, и могу выбрать последовательность в которой все пройдет гладко, и могу не заморачиватся с ним. Но и отрицать его и гонятся за ним с крестом тоже не стану%)... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tahoe 0 9 февраля, 2013 Опубликовано 9 февраля, 2013 · Жалоба "Проблемы индейцев - вождя не колышат!"(С)... "Решение"... или... "праздничный костыль"??? Понятно. Т.е. нормального решения предложено не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HHIMERA 0 9 февраля, 2013 Опубликовано 9 февраля, 2013 · Жалоба не очень понимаю в чем спор то? Да если честно... я тоже... Нет там никаких проблем с ремапом... ни в каком виде... изначально... всё это надуманно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться