Страница 284 из 386

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

Добавлено: Вт окт 16, 2018 18:46:55
a5021
Как насчет проверить?

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

Добавлено: Вт окт 16, 2018 18:56:57
Мурик
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.

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

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

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

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


Мурик, volatile то вставил, знаешь что иначе оптимизатор почикает всё.

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

Добавлено: Вт окт 16, 2018 19:31:00
А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 и не городить такой огород со скобками и запятыми ?

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

Добавлено: Вт окт 16, 2018 19:47:23
Мурик
VladislavS писал(а):volatile то вставил, знаешь что иначе оптимизатор почикает всё.
Это здесь причем? Без volatile оптимизатор "наведет порядок" и когда функция не в if. Хотя бывают исключения.
Речь о том что из if функция delay() не выбрасывается.

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

Добавлено: Вт окт 16, 2018 19:53:11
ARV
как мною и ожидалось, очередной пример того, как запятая помогает выстрелить в ногу. осмысленное её применение в for, в других случаях - цирк.

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

Добавлено: Вт окт 16, 2018 19:56:52
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]
Фиг с ней с ногой. Голову берегите.

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

Добавлено: Вт окт 16, 2018 20:00:21
VladislavS
[uquote="a5021",url="/forum/viewtopic.php?p=3483448#p3483448"]Теоретик из вас, походу, никудышный.

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

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

Уже второй пример и в обоих есть причина по которой не выкинута функция. Но в один прекрасный момент этой причины не окажется.

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

Добавлено: Вт окт 16, 2018 20:03:02
a5021
[uquote="VladislavS",url="/forum/viewtopic.php?p=3483455#p3483455"]Потому что NOP это "полезное действие" или volatile.[/uquote]
Не сочиняйте. Волатилы там нет.

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

Добавлено: Вт окт 16, 2018 20:04:03
Мурик
VladislavS, насколько помню вы писали что оптимизатор выкинет delay из if потому что она ничего не возвращает. https://radiokot.ru/forum/viewtopic.php ... 2#p3483222
Про volatile ни слова не было.

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

Добавлено: Вт окт 16, 2018 20:13:11
VladislavS
Лень включать комп, но продравшись через заголовочные файлы ты доберёшься до ассемблерной команды NOP, которую компилятор не имеет права выкинуть.

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

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

Добавлено: Вт окт 16, 2018 20:14:18
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-а ничего не может спасти.

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

Добавлено: Вт окт 16, 2018 20:15:51
Аlex
[uquote="a5021",url="/forum/viewtopic.php?p=3483448#p3483448"]И что это даст кроме ощущения преемственности поколений?[/uquote]Т.е. избавление от кучи фигурных скобок с вложенными if'ами Вам что-то дало, а избавление от скобок, запятых, 1-диничек, ... Вам ничего, кроме ощущения преемственности поколений, не даёт ?
Вы боролись с оптимизацией строк кода. Собственно, возвращаемая ф-ия delay, тоже немного подуменьшит кол-во напечатанных символов кода, не изменяя итоговый результат исполнения программы.

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

Добавлено: Вт окт 16, 2018 20:19:29
da-nie
Не сочиняйте. Волатилы там нет.
Да хватит вам спорить, посмотрите лучше статьи про барьеры компилятора и памяти, а то вам будет непонятно что, например, внутри критической секции происходит и почему там volatile не нужен. И не забудьте, что компилятор может, а не обязан выкинуть/оптимизировать такой код. Что касается _NOP(), то вот 100% внутри описания этой функции/макроса есть указание на запрет выбрасывания ассемблерного кода, типа volatile asm {nop}. Или же ваш компилятор любую конструкцию asm понимает с запретом на оптимизацию.

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

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

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

Господа, программируйте как хотите, но тут заложена потенциальная проблема. Умеете обходить, хорошо, но вспомните сколько тем "не заходит в ветку под отладкой" и им подобных от нубов. Лучше такое не пропагандировать.

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

Добавлено: Вт окт 16, 2018 20:31:11
a5021
Заходит он в отладку в таких выражениях. По каждому условию заходит. Придумайте что-то по-убедительнее.

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

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

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

Добавлено: Вт окт 16, 2018 20:43:56
Мурик
VladislavS писал(а):Убери volatile и выкинет потому что ничего не возвращает.
А если функция будет не в if ее разве не выкинет?
Не нужно пытаться оправдать себя. Просто признай ошибку.
Во первых, утверждаешь что нет последовательности вычисления в if, а это не так. Выполнение идет слева на право.
Во вторых утверждаешь что из if будет выброшена функция delay потому что ничего не возвращает и сравнивать нечего, но это не так и было доказано на практике.
Прочитай книжки по Си хотя бы для чайников, чтобы освежить знания.

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

Добавлено: Вт окт 16, 2018 20:56:31
VladislavS
Мурик, похоже вы не видели результаты работы по настоящему злобных оптимизирующих компиляторов.

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

Добавлено: Вт окт 16, 2018 21:03:45
a5021
Так покажите. Неопределенные движения рукой по направлению куда-то вдаль ничего не доказывают. Точнее доказывают, но не думаю, что вам это может нравиться.