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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

Как насчет проверить?
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

VladislavS, тогда объясните почему светодиод мигает несколько раз в секунду?

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

#include "stm32f10x_conf.h"

uint8_t Delay(volatile uint32_t nCount)
{
    for (; nCount != 0; nCount--);
}

int main(void)
{
    GPIO_InitTypeDef Init;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

    Init.GPIO_Pin = GPIO_Pin_13;
    Init.GPIO_Mode = GPIO_Mode_Out_PP;
    Init.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOC, &Init);

    while(1)
    {
        if (((GPIOC->ODR ^= GPIO_Pin_13)!=1) && Delay(1000000));
    }
}
Оптимизация O2 + LTO.
Вложения
Blink.7z
(167.83 КБ) 270 скачиваний
viiv
Грызет канифоль
Сообщения: 287
Зарегистрирован: Чт ноя 06, 2014 13:09:06

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

Сообщение viiv »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3483338#p3483338"]Она ничего влияющего на вычисление значение выражения в операторе if не делает.[/uquote]
Да, на вычисление if не влияет, но чтобы выкинуть у компилятора должно быть более веское основание. Тот кто кодил delay() должен был позаботиться, чтобы компилятор не выкидывал ее (а она кроме, сообственно, задержки ничего полезного не делает). А если такое основание у него (компилятора) будет, то выкинет ее (функцию delay ()), даже если Вы эту функцию за if вынесете. :-)
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="viiv",url="/forum/viewtopic.php?p=3483408#p3483408"]даже если Вы эту функцию за if вынесете. :-)[/uquote]Да, если она ничего не делает - выкинет.


Мурик, volatile то вставил, знаешь что иначе оптимизатор почикает всё.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

[uquote="a5021",url="/forum/viewtopic.php?p=3483188#p3483188"]На самом деле, вложенных if-ов у меня получалось больше, но даже тут глубина их начинает резать глаз. Какое решение пришло в голову в конце-концов:

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

int main(void) {

  if (reset() && (delay(100), 1) && init() && (delay(100), 1) && run_cmd(MOVE_FORWARD)) {
        // do smth
  }
}

[/uquote]Какое то нестандартное решение.
Не проще было сделать ф-ию delay возвращаемой true и не городить такой огород со скобками и запятыми ?
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

VladislavS писал(а):volatile то вставил, знаешь что иначе оптимизатор почикает всё.
Это здесь причем? Без volatile оптимизатор "наведет порядок" и когда функция не в if. Хотя бывают исключения.
Речь о том что из if функция delay() не выбрасывается.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

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

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

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3483424#p3483424"]Да, если она ничего не делает - выкинет.[/uquote]
Теоретик из вас, походу, никудышный.

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

  
void custom_delay(unsigned int delay) {
  while(--delay) __NOP();
}

//...

while (1)  {
   if ((GPIOA->BSRR = GPIO_BSRR_BS_0, 1) && (custom_delay(0x01FFFFFF), 1) && (GPIOA->BSRR = GPIO_BSRR_BR_0, 1) && (custom_delay(0x01FFFFFF), 1));
}
IAR 8, оптимизация HIGH/SIZE:

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

   \       0x72   0x....             LDR      R6,??DataTable2_3  ;; 0x1ffffff
    101            while (1)  {
    102               if ((GPIOA->BSRR = GPIO_BSRR_BS_0, 1) && (custom_delay(0x01FFFFFF), 1) && (GPIOA->BSRR = GPIO_BSRR_BR_0, 1) && (custom_delay(0x01FFFFFF), 1));
   \                     ??main_0: (+1)
   \       0x74   0x61AC             STR      R4,[R5, #+24]
   \       0x76   0x0030             MOVS     R0,R6
   \       0x78   0x.... 0x....      BL       custom_delay
   \       0x7C   0x0420             LSLS     R0,R4,#+16
   \       0x7E   0x61A8             STR      R0,[R5, #+24]
   \       0x80   0x0030             MOVS     R0,R6
   \       0x82   0x.... 0x....      BL       custom_delay
   \       0x86   0xE7F5             B        ??main_0
Весь код ответственный за блинк на месте. Это не смотря на то, что у if-а тела нет вовсе.

[uquote="Аlex",url="/forum/viewtopic.php?p=3483427#p3483427"]Не проще было сделать ф-ию delay возвращаемой true и не городить такой огород со скобками и запятыми ?[/uquote]
И что это даст кроме ощущения преемственности поколений?

[uquote="ARV",url="/forum/viewtopic.php?p=3483447#p3483447"]как мною и ожидалось, очередной пример того, как запятая помогает выстрелить в ногу.[/uquote]
Фиг с ней с ногой. Голову берегите.
Последний раз редактировалось a5021 Вт окт 16, 2018 20:00:40, всего редактировалось 1 раз.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="a5021",url="/forum/viewtopic.php?p=3483448#p3483448"]Теоретик из вас, походу, никудышный.

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

  
void custom_delay(unsigned int delay) {
  while(--delay) __NOP();
}
[/uquote]Потому что NOP это "полезное действие" или volatile.

Уже второй пример и в обоих есть причина по которой не выкинута функция. Но в один прекрасный момент этой причины не окажется.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

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

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

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

VladislavS, насколько помню вы писали что оптимизатор выкинет delay из if потому что она ничего не возвращает. https://radiokot.ru/forum/viewtopic.php ... 2#p3483222
Про volatile ни слова не было.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Лень включать комп, но продравшись через заголовочные файлы ты доберёшься до ассемблерной команды NOP, которую компилятор не имеет права выкинуть.

Добавлено after 5 minutes 32 seconds:
[uquote="Мурик",url="/forum/viewtopic.php?p=3483458#p3483458"]Про volatile ни слова не было.[/uquote]Убери volatile и выкинет потому что ничего не возвращает. Представь, если она будет скомпилирована в другом модуле. Что будет в случаях когда она возвращает значениеи или не возвращает?
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

Ноп есть. Волатилы, в том числе в заголовочных файлах, нет.

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

     65          void custom_delay(unsigned int delay) {
   \                     custom_delay: (+1)
   \        0x0   0xE000             B        ??custom_delay_0
     66            while(--delay) __NOP();
   \                     ??custom_delay_1: (+1)
   \        0x2   0xBF00             Nop      
   \                     ??custom_delay_0: (+1)
   \        0x4   0x1E40             SUBS     R0,R0,#+1
   \        0x6   0xD1FC             BNE      ??custom_delay_1
     67          }
   \        0x8   0x4770             BX       LR               ;; return
Но я почему-то ничего не слышал о волшебных свойствах этой команды, запрещающих всякую оптимизацию. Кроме того, еще недавно вы категорично утверждали, что от оптимизации внутри if-а ничего не может спасти.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

[uquote="a5021",url="/forum/viewtopic.php?p=3483448#p3483448"]И что это даст кроме ощущения преемственности поколений?[/uquote]Т.е. избавление от кучи фигурных скобок с вложенными if'ами Вам что-то дало, а избавление от скобок, запятых, 1-диничек, ... Вам ничего, кроме ощущения преемственности поколений, не даёт ?
Вы боролись с оптимизацией строк кода. Собственно, возвращаемая ф-ия delay, тоже немного подуменьшит кол-во напечатанных символов кода, не изменяя итоговый результат исполнения программы.
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

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

Сообщение da-nie »

Не сочиняйте. Волатилы там нет.
Да хватит вам спорить, посмотрите лучше статьи про барьеры компилятора и памяти, а то вам будет непонятно что, например, внутри критической секции происходит и почему там volatile не нужен. И не забудьте, что компилятор может, а не обязан выкинуть/оптимизировать такой код. Что касается _NOP(), то вот 100% внутри описания этой функции/макроса есть указание на запрет выбрасывания ассемблерного кода, типа volatile asm {nop}. Или же ваш компилятор любую конструкцию asm понимает с запретом на оптимизацию.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="a5021",url="/forum/viewtopic.php?p=3483477#p3483477"]Но я почему-то ничего не слышал о волшебных свойствах этой команды, запрещающих всякую оптимизацию.[/uquote]Не конкретно этой команды, а любых ассемблерных вставок, коих вы как пользователь iar в интринсиках можете найти достаточно много.

[uquote="a5021",url="/forum/viewtopic.php?p=3483477#p3483477"]Кроме того, еще недавно вы категорично утверждали, что от оптимизации внутри if-а ничего не может спасти.[/uquote]Если не применить специальных мер, да оптимизирует. В двух примерах эти меры были применены.

Господа, программируйте как хотите, но тут заложена потенциальная проблема. Умеете обходить, хорошо, но вспомните сколько тем "не заходит в ветку под отладкой" и им подобных от нубов. Лучше такое не пропагандировать.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

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

[uquote="VladislavS",url="/forum/viewtopic.php?p=3483490#p3483490"]Лучше такое не пропагандировать.[/uquote]
Лучше категоричные заявления от фонаря пропагандировать по вашим рецептам?

[uquote="Аlex",url="/forum/viewtopic.php?p=3483480#p3483480"]Вы боролись с оптимизацией строк кода.[/uquote]
С глубокой вложенностью я боролся. Оная вложенность заслуженно считается плохим тоном. Я же предельно конкретно об этом написал. Что за выдумки тут возникают?
Собственно, возвращаемая ф-ия delay, тоже немного подуменьшит кол-во напечатанных символов кода, не изменяя итоговый результат исполнения программы.
Если функция одна и ваша, то, возможно. Если их много и они из библиотеки, то получится гора писанины, не дающая никаких плюсов.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

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

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

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

Сообщение VladislavS »

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

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

Сообщение a5021 »

Так покажите. Неопределенные движения рукой по направлению куда-то вдаль ничего не доказывают. Точнее доказывают, но не думаю, что вам это может нравиться.
Ответить

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