Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18797
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3389
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

ARV писал(а):тем не менее, не работает: https://ideone.com/557ULM GCC 6.3
писать компиляторо-зависимый код, т.е. код, эксплуатирующий багофичи отдельных версий компилятора - разве можно придумать что-то более ужасное?
Проверил на STMке с GCC 5.4 и GCC 7. Работает нормально. Результат соответствует.
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="ARV",url="/forum/viewtopic.php?p=3483948#p3483948"]я никогда сам так не делаю[/uquote]
Да не убивайтесь вы так. Курьез был опубликован для тех, кто понимает.

[uquote="viiv",url="/forum/viewtopic.php?p=3483832#p3483832"]Я противник подобных конструкций лишь потому,[/uquote]
Лишь потому, что не привыкли. Не собираетесь же вы скобки, которые часто используют для улучшения читабельности, обвинять в том, что читабельность они ухудшают, как это сделал один из ваших предшественников?
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[uquote="a5021",url="/forum/viewtopic.php?p=3483993#p3483993"]Лишь потому, что не привыкли.[/uquote]
Хм. Как раз привык! И вполне нормально отношусь к такому в чужом коде. Если встречу, и не увижу ошибки, править такие тексты у меня даже мысли не возникнет, разве что добавть комментарий, что эта часть кода с "хитростью" работает правильно, так и задумывалось. Но,
1) как правило, мне не известна квалификация того, кто писал код, который я просматриваю. И к "хитростям" в коде отношусь осторожно. Бывает (и довольно часто), что "хитрости" применяют не до конца понимая, что они делают.
2) Надо "облегчать жизнь" читателям кода всеми доступными способами. Чем проще и "читабельнее" код, чем меньше в нем "хитростей", тем лучше.

Все это мое личное мнение и навязывать его никому не собираюсь. И спорить не буду, меня вряд ли кто сможет убедить в обратном. :-)

[uquote="a5021",url="/forum/viewtopic.php?p=3483993#p3483993"]Не собираетесь же вы скобки, которые часто используют для улучшения читабельности, обвинять в том, что читабельность они ухудшают, как это сделал один из ваших предшественников?[/uquote]
Не, не собираюсь. :)) Я приветствую все, что используются для улучшения читабельности!!! :))
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="Мурик",url="/forum/viewtopic.php?p=3483965#p3483965"]]Проверил на STMке с GCC 5.4 и GCC 7. Работает нормально. Результат соответствует.[/uquote]
Только не очень понятно, как такое пролезло из C++ в C. Вложенных функций ведь нет в Си, насколько я в курсе, уж не говоря про "замыкательный" способ использования.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18797
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

a5021 писал(а):Вложенных функций ведь нет в Си, насколько я в курсе, уж не говоря про "замыкательный" способ использования.
что такое замыкательный способ использования, я не в курсе, но вложенные функции есть в расширениях GCC для Си.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="ARV",url="/forum/viewtopic.php?p=3484130#p3484130"]что такое замыкательный способ использования,[/uquote]
Почитайте про замыкания в си ++. Часть волнительных переживаний, что вы озвучивали ранее, глядишь и утихнет.
я не в курсе, но вложенные функции есть в расширениях GCC для Си.
Я, например, не знал. Но тогда ваши стенания с заламыванием рук вообще смотрятся, как никудышная актерская работа: "If you try to call it after a containing scope level exits, and if it refers to some of the variables that are no longer in scope, you may be lucky, but it’s not wise to take the risk. If, however, the nested function does not refer to anything that has gone out of scope, you should be safe."

Мануал на GCC говорит, что вызывать вложенные функции снаружи может быть безопасно. Имеется, что возразить мануалу?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18797
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

a5021 писал(а):Почитайте про замыкания в си ++
упаси бог, оно мне надо?!
a5021 писал(а):Имеется, что возразить мануалу?
имеется.
1. я так никогда сам не делаю и другим не советую - см. ранее.
2. вложенные функции не должны быть видны за пределами {} "охватывающей функции", поэтому я сильно удивлен, каким образом происходит взятие их адресов в main... запутало одинаковое наименование вложенных функций и указателей. это меня лишний раз убедило, что так делается исключительно ради того, чтобы поставить на место зарвавшихся самоучек (см. ранее) - только гуру в этом не ошибется.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="ARV",url="/forum/viewtopic.php?p=3484144#p3484144"]упаси бог, оно мне надо?![/uquote]
Выходит, устраивать переполох без повода вам зачем-то надо.
1. я так никогда сам не делаю и другим не советую - см. ранее.
Все та же эгоцентричная модель мира. Вы в жизни никогда и не ошибались, наверное?
запутало одинаковое наименование вложенных функций и указателей. это меня лишний раз убедило, что так делается исключительно ради того, чтобы поставить на место зарвавшихся самоучек
Собственные промахи вам приятнее объяснять коварством извне? Немного странно, конечно, но вполне объяснимо.
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

Вечер добрый!
Хочу добавить универсальности своему коду на СИ, но никак не соображу как это сделать)
Есть строки, которые атомарно переключают пины микроконтроллера STM32F103, при этом если пин меньше 8, то нужно писать:

Код: Выделить всё

GPIOA->CRL = GPIO_BSSR_BSx
а если больше, то:

Код: Выделить всё

GPIOA->CRH = GPIO_BSSR_BSx

Можно ли как-то сделать макроопределение, чтоб оно определяло по номеру вывода какой регистр нужно использовать CRL или CRH?
Интересует именно макроопределение, так как после компиляции должна получиться простая строка типа:

Код: Выделить всё

GPIOA->CRL = GPIO_BSSR_BS1
иначе об атомарности можно забыть.

Как я это представляю:

Код: Выделить всё

#define GPIO_PIN_SET(PORT, PIN) // а тут должно быть условие типа if(PIN<8){тут что-то типа такого: GPIO##PORT->CRL= GPIO_BSSR_BS##PIN} else {тут что-то типа такого: GPIO##PORT->CRH= GPIO_BSSR_BS##PIN}
Главное, чтоб в коде строка

Код: Выделить всё

GPIO_PIN_SET(A, 9);
была преобразована компилятором в строку

Код: Выделить всё

GPIOA->CRH= GPIO_BSSR_BS9;
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Запись в BSR и BSRR атомарна в любом случае, неважно, есть ли до этого какие-то проверки на номер пина или нет.
Контактная информация:
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

Мне нужно чтоб при выполнении кода не было никаких лишних действий - чисто запись регистра и все!

Кстати, а вот такая портянка имеет право на существование? Компилятор вроде не ругается...

Код: Выделить всё

#define ISX_GPIO_PIN_SET (PORT, PIN)  #if PIN<8 GPIO##PORT->CRL = ISX_GPIO_BS##PIN #else GPIO##PORT->CRH = ISX_GPIO_BS##PIN
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

isx, вы могли бы словами описать что хотите сделать? А то с виду это какая-то дичь

Код: Выделить всё

GPIOA->CRL = GPIO_BSSR_BSx
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

GPIOA->CRL указывает на младшую группу (0-7) пинов порта А. Запись бита в этот регистр устанавливает соответствующий пин.
GPIO_BSSR_BSx - это дефайн- маска конкретного пина (типа 0b00000000000000001)
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Ну да, какая разница. Зачем привыкать делать как надо, если хочется через ж.

Добавлено after 1 minute 50 seconds:
[uquote="isx",url="/forum/viewtopic.php?p=3484323#p3484323"]GPIOA->CRL указывает на младшую группу (0-7) пинов порта А. Запись бита в этот регистр устанавливает соответствующий пин.[/uquote]
Вы уверены?
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[uquote="isx",url="/forum/viewtopic.php?p=3484323#p3484323"]GPIOA->CRL указывает на младшую группу (0-7) пинов порта А. Запись бита в этот регистр устанавливает соответствующий пин.[/uquote]
СпойлерИзображение
Если нужен именно сброс/установка то, если это будет сделано записью в BRR или BSSR, то эта операция будет атомарной. Хоть макросом, хоть еще как. "Читение-модификация-запись" не атомарна, а запись всегда атомарна.
Друг Кота
Аватара пользователя
Сообщения: 3389
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

dosikus писал(а):Вы уверены?
Вот, а вы писали что регистры это тру и прочее. :))) Юзая либы такую глупую ошибку не совершить. :)
Хотя как можно было регистры перепутать, хз.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Мурик, ты точно уверен? :)))
Если в самих либах таааакие ляпы, а не зная железа можно таких дров наломать.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

isx, вижу в хрустальном шаре ваш STM32F103 :)

У него устновка пина делается командой

Код: Выделить всё

GPIOx->BSRR = GPIO_BSRR_BSy;
А сброс

Код: Выделить всё

GPIOx->BSRR = GPIO_BSRR_BRy;
//или
GPIOx->BRR = GPIO_BRR_BRу;
Друг Кота
Аватара пользователя
Сообщения: 3389
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

dosikus писал(а):Если в самих либах таааакие ляпы
Не знаю как HAL и LL (их не использую), а в SPL для F0 и F1 ошибок пока не обнаружил, по крайней мере таких, из-за которых МК работал не так как задумано.
Ответить

Вернуться в «Разные вопросы по МК»