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

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

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

Сообщение VladislavS »

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

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

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

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

Сообщение isx »

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

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

Сообщение dosikus »

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

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

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

Сообщение viiv »

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

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

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

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

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

Сообщение dosikus »

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

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

Сообщение VladislavS »

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

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

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

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

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

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

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

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

dosikus писал(а):Если в самих либах таааакие ляпы
Не знаю как HAL и LL (их не использую), а в SPL для F0 и F1 ошибок пока не обнаружил, по крайней мере таких, из-за которых МК работал не так как задумано.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

В ветке арм за всех адептов 25ый позитиф отдуваясь, красноречиво доказывает что "легкий порог" вхождения с калокубом и спл лишь в ваших влажных фантазиях. И железо знать обязательно...
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

А ты попробуй рассказать ему про регистры и посоветуй писать прогу без либ. :))) Посмотрим что получится. :)))
Если не понимаешь что делаешь, нет разницы, используются либы или нет, результат одинаков - нестабильно работающий код.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

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

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

Сообщение VladislavS »

[uquote="Мурик",url="/forum/viewtopic.php?p=3484552#p3484552"]А ты попробуй рассказать ему про регистры и посоветуй писать прогу без либ. :))) Посмотрим что получится. :)))[/uquote]Вот смотри, в результате многодневной прочистки кармы он родил вот это.

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

void USART3_IRQHandler(void)
{
/* USER CODE BEGIN USART3_IRQn 0 */
uint8_t X; // Описание приемника числа. 
/* USER CODE END USART3_IRQn 0 */

HAL_UART_IRQHandler(&huart3);
/* USER CODE BEGIN USART3_IRQn 1 */	

HAL_UART_Receive_IT(&huart3, &X, 1); // Вызов прерывания по uаrt.	

TIM1->CCR1 = X; // Записываем в счетный регистр принятый по uart X.

/* USER CODE END USART3_IRQn 1 */
}
Неужели трудней было написать

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

void USART3_IRQHandler(void)
{
  TIM1->CCR1 = USART3->DR;
}
Видя старания, мы бы раскрутили до такого

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

void USART3_IRQHandler(void)
{
  if(USART3->SR & (USART_SR_PE | USART_SR_FE | USART_SR_NE | USART_SR_ORE))
  { //Была ошибка в приеме байта
    USART3->DR;
  }
  else
  { //Байт принят корректно
    TIM1->CCR1 = USART3->DR;
  } 
}
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

[uquote="a5021",url="/forum/viewtopic.php?p=3484181#p3484181"][uquote="ARV",url="/forum/viewtopic.php?p=3484144#p3484144"]упаси бог, оно мне надо?![/uquote]Собственные промахи вам приятнее объяснять коварством извне? Немного странно, конечно, но вполне объяснимо.[/uquote]ваш тупой психоанализ абсолютно неуместен.
если вы сумеете объяснить, с какой целью следует писать то, что вы приводил в качестве курезного примера, я готов признать вашу правоту на счет коварства. если же не сумеете, то вам придется признать, что так пишут исключительно ради выпендрёжа, чтобы продемонстрировать глубины "понимания" Си.

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

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

Мой уютный бложик... заходите!
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

Пардон, действительно фигню сморозил. Последнее время приходится работать с HAL - походу стал деградировать на этом фоне :)))
Собственно из-за чего весь кипишь. У меня последнее время часто возникает ситуация, когда нужно портировать проекты с STM32F1 на STM32F0,F3 и наоборот. А у этих серий есть серьёзное различие -в серии F1 скорость и режим работы выводов устанавливаются в регистрах CRL (для пинов 0-7) и CRH (для пинов 8-15), а в F0 и F3 за режим отвечает регистр MODE, а за скорость OSPEEDR. Вот я и хочу написать универсальный макрос, чтоб при каждом портировании не заниматься массовым переименовыванием 80-ти пинов.
А вообще, куб штука хорошая, если нужно быстро написать какую-то программу, но не дай бог потом вам проводить манипуляции с периферией (особенно если вы вносили изменения в их местами убогие библиотеки), то это все -
пи*дец :)
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

[uquote="isx",url="/forum/viewtopic.php?p=3484269#p3484269"]Мне нужно чтоб при выполнении кода не было никаких лишних действий - чисто запись регистра и все![/uquote]
Есть мнение, что оптимизатор сводит конструкцию типа:

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

if (7 < 5)
  a = b;
else
  a = c;
к так что даже ужас типа многостраничного switch по известному на момент компиляции параметру сведётся к подстановке тела соответствующего case. Ну и чаще всего это легко проверяется по ассемблерному листингу в папке с промежуточными файлами компиляции.
[uquote="isx",url="/forum/viewtopic.php?p=3484269#p3484269"]Кстати, а вот такая портянка имеет право на существование? Компилятор вроде не ругается...

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

#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
[/uquote]
Опять-же вспомним учение о троице - препроцессор, компилятор и линкер. Между первым и вторым результат подстановки вашего этого #define будет уже известен - включите в свойствах проекта опцию preprocessing only или do not remove intermediate files (ну или где-то как-то так) и посмотрите после компиляции в папке с промежуточными файлами, что на самом деле передаётся компилятору от препроцессора. Вот там и увидите во что превратилась ваша конструкция.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

VladislavS писал(а):Неужели трудней было написать
Надо было в той теме писать. Сюда он наверно не зайдет.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Мурик",url="/forum/viewtopic.php?p=3484902#p3484902"]Надо было в той теме писать. Сюда он наверно не зайдет.[/uquote]А я не ему это писал. Там знаний ноль без палочки, бесполезная трата времени. Наиграется со своей дискавери или сожжёт и забьёт на это всё.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

VladislavS писал(а):А я не ему это писал.
Для меня писали? :)
Я бы возможно сделал по другому. Если данные в USART приходят часто, прерывание от USART настроил бы только на события ошибок, а копирование из USART3->DR в TIM1->CCR1 сделал бы через DMA, при наличии свободного канала связанного с USART3. :) Если данные приходят редко, вероятно сделал бы как вы.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

[uquote="ARV",url="/forum/viewtopic.php?p=3484794#p3484794"]если вы сумеете объяснить, с какой целью следует писать то, что вы приводил в качестве курезного примера[/uquote]
А с чего вы заключили, что это были рекомендации? Ваши фантазии и ничего кроме. Как обычно, впрочем.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

[uquote="Мурик",url="/forum/viewtopic.php?p=3484943#p3484943"]Я бы возможно сделал по другому.[/uquote]
Конечно по другому, но и не как ты.
Передавать по UART однобайтовыми транзакциями могут только ты и позитиф25, вменяемые оперируют пакетами...
Ответить

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