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

давайте делится удобными дефайнами для stm32f10x

Использование 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))
...

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


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

А в RMW-операциях можно налететь на грабли и по другому - просто записав битик туда, куда не нужно, - помечено как reserved биты, а каким образом оно себя проявить может - хз.

Можно. Но я же спросил не о новых проблемах, а о решении конкретной и реально существующей. Так кроме bitband, ещё как-то можно корректно и безопасно сделать ремап? Кстати, даже с bitband тоже не все так просто оказалось, но в итоге решилось.

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


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

Можно. Но я же спросил не о новых проблемах, а о решении конкретной и реально существующей.

Нет там никакой проблемы с ремап... есть временное недопонимание/трактование по своему...

 

Это всё из ряда:

Кстати, даже с bitband тоже не все так просто оказалось, но в итоге решилось.

 

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


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

А что - так трудно упаковать номер бита в порту в младшие 5 бит, а номер порта - в старшую часть 32бит?

Пока не выпустили корпуса с 2^32 ног это вроде не должно составлять проблем... :laughing:

Можно даже с помощью макросов сделать это красиво, а-ля:

 

Сравните с существующей реализацией:

if(con->txena) *con->txena = TX_ON;

и во что она скомпилируется.

 

Или вот такое:

WORKLED_bit ^= 1;

 

В этом плане GPIO на bit-band очень удобен.

При этом "цена вопроса" - 6кБ в соответствующем регионе!

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


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

Нет там никакой проблемы с ремап... есть временное недопонимание/трактование по своему...

 

Это всё из ряда:

Ребят, что в той ветке, что сейчас, вы оба просто не вникли в суть проблемы. поэтому ее не видите. Придется повторить ещё раз.

 

Есть регистр AFIO_MAPR, в котором есть три write only бита SWJ_CFG[2:0]. Результат чтения из них - не определен. Как модифицировать произвольный бит этого регистра, сохранив ранее установленные в SWJ_CFG[2:0] значения? Учитывая, что прочитать SWJ_CFG[2:0] невозможно.

 

Причем это не высосано из пальца, я реально налетел на эту проблему, когда понадобился remap SPI1, а биты SWJ_CFG были уже установлены. Тот редкий случай, когда получу удовольствие, если меня ткнут носом. Вот только шансов на это нет.

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


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

запомнить значение битов в переменной%) в самом начале программы, установить их и не забывать до самого конца. То есть не читать их из регистра, а брать из этой переменной)...

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


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

запомнить значение битов в переменной%) в самом начале программы, установить их и не забывать до самого конца. То есть не читать их из регистра, а брать из этой переменной)...

Как соорудить костыли, это я и сам догадаюсь. ;) Но что тогда делать с драйвером периферии, причем таких драйверов может висеть на одном SPI несколько штук. В каждый из них прописывать этот костыль? Или все-таки использовать bit-band, дабы вообще не трогать SWJ_CFG[2:0]? ;)

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


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

Ребят, что в той ветке, что сейчас, вы оба просто не вникли в суть проблемы. поэтому ее не видите. Придется повторить ещё раз.

 

Есть регистр AFIO_MAPR, в котором есть три write only бита SWJ_CFG[2:0]. Результат чтения из них - не определен. Как модифицировать произвольный бит этого регистра, сохранив ранее установленные в SWJ_CFG[2:0] значения? Учитывая, что прочитать SWJ_CFG[2:0] невозможно.

А как вы думаете... как боролись с RMW в младших ПИКах, в которых не было регистра LAT ??? Создавали "фантомный" регистр... типа:

запомнить значение битов в переменной%)

И это не считалось проблемой... считалось - решением...

 

Причем это не высосано из пальца, я реально налетел на эту проблему, когда понадобился remap SPI1, а биты SWJ_CFG были уже установлены. Тот редкий случай, когда получу удовольствие, если меня ткнут носом. Вот только шансов на это нет.

Сколько налетал на "проблему" в STM32, столько раз сам и убеждался, что просто "не дочитал/не досмотрел/не угадал вариант неоднозначной трактовки"...

 

ИМХО... Вся сложность STM32 - в его простоте... при широких возможностях...

 

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

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


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

И это не считалось проблемой... считалось - решением...

С каких пор, вырезание гландов через анус, называется "решением"? И что тогда называть "костылём", если создание фантомного регистра - "решение". Реальное решение, это использовать bit-band. Вот это - действительно решение. А наплодить тонну фантомных регистров, создать прослойку для работы с ними и радоваться, что хоть как-то разрулили аппаратный недостаток... Философия Microchip/Microsoft в действии? :)

 

Сколько налетал на "проблему" в STM32, столько раз сам и убеждался, что просто "не дочитал/не досмотрел/не угадал вариант неоднозначной трактовки"...

ИМХО... Вся сложность STM32 - в его простоте... при широких возможностях...

Ну вот, опять общие слова - "вы не поняли", "вы не дочитали". Ну а конкретно-то можно? Что именно я "недочитал" и "не понял", касательно работы с AFIO_MAPR_SWJ_CFG? Может наоборот, это вы оба недочитали, раз не используете bit-band, а заводите какую-то левую переменную в памяти? Да чего уж скромничать, продублируем все регистры ядра и периферии в памяти. Вот будет веселье. :biggrin:

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


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

С каких пор, вырезание гландов через анус, называется "решением"? И что тогда называть "костылём", если создание фантомного регистра - "решение". Реальное решение, это использовать bit-band. Вот это - действительно решение. А наплодить тонну фантомных регистров, создать прослойку для работы с ними и радоваться, что хоть как-то разрулили аппаратный недостаток... Философия Microchip/Microsoft в действии? :)

Разрулить аппаратный "недостаток" (а для меня это просто факт, особенность регистра, не более) - и есть решение...

А постоянно ныть о "проблемах" (которые многие просто, почему-то, и не замечают) - и есть хождение "на костылях"...

Вот будет веселье. :biggrin:

Вот... лучше не надо... веселья... поверьте... :lol::lol:

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


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

Разрулить аппаратный "недостаток" (а для меня это просто факт, особенность регистра, не более) - и есть решение...

Есть много разных способов избавиться от головной боли. Гильотина - не лучший. Хотя некоторые сочтут его вполне годным.

 

В данном случае, никто не ноет. Есть вариант с bit-band. Это - решение. Все остальное - не решения, а какая-то отрыжка из конца 90-х, с их кривыми PIC-ами. :)

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


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

Есть много разных способов избавиться от головной боли. Гильотина - не лучший. Хотя некоторые сочтут его вполне годным.

"Проблемы индейцев - вождя не колышат!"(С)... :biggrin:

В данном случае, никто не ноет. Есть вариант с bit-band. Это - решение. Все остальное - не решения, а какая-то отрыжка из конца 90-х, с их кривыми PIC-ами. :)

"Решение"... или... "праздничный костыль"??? :biggrin:

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


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

не очень понимаю в чем спор то?

раньше бит-банда не было, его не хватало, его сделали. Появился инструмент, появился он не просто так, значит он нужен, и его надо использовать.

Но с другой стороны и без него решали задачи, в 9 и 7 арме если не ошибаюсь его не было.

 

Мои проекты вообще далеки от драйверов, операционок и прочих прелестей, я если что-то иничу или ремаплю, то делаю это один раз, и могу выбрать последовательность в которой все пройдет гладко, и могу не заморачиватся с ним. Но и отрицать его и гонятся за ним с крестом тоже не стану%)...

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


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

"Проблемы индейцев - вождя не колышат!"(С)... :biggrin:

 

"Решение"... или... "праздничный костыль"??? :biggrin:

Понятно. Т.е. нормального решения предложено не будет.

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


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

не очень понимаю в чем спор то?

Да если честно... я тоже...

Нет там никаких проблем с ремапом... ни в каком виде... изначально... всё это надуманно...

 

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


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

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

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

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

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

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

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

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

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

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