Вопросы по С/С++ (СИ)
Re: Вопросы по С/С++ (СИ)
Как насчет проверить?
Re: Вопросы по С/С++ (СИ)
VladislavS, тогда объясните почему светодиод мигает несколько раз в секунду?Оптимизация O2 + LTO.
Код: Выделить всё
#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));
}
}- Вложения
-
- Blink.7z
- (167.83 КБ) 270 скачиваний
Re: Вопросы по С/С++ (СИ)
[uquote="VladislavS",url="/forum/viewtopic.php?p=3483338#p3483338"]Она ничего влияющего на вычисление значение выражения в операторе if не делает.[/uquote]
Да, на вычисление if не влияет, но чтобы выкинуть у компилятора должно быть более веское основание. Тот кто кодил delay() должен был позаботиться, чтобы компилятор не выкидывал ее (а она кроме, сообственно, задержки ничего полезного не делает). А если такое основание у него (компилятора) будет, то выкинет ее (функцию delay ()), даже если Вы эту функцию за if вынесете.
Да, на вычисление if не влияет, но чтобы выкинуть у компилятора должно быть более веское основание. Тот кто кодил delay() должен был позаботиться, чтобы компилятор не выкидывал ее (а она кроме, сообственно, задержки ничего полезного не делает). А если такое основание у него (компилятора) будет, то выкинет ее (функцию delay ()), даже если Вы эту функцию за if вынесете.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[uquote="viiv",url="/forum/viewtopic.php?p=3483408#p3483408"]даже если Вы эту функцию за if вынесете.
[/uquote]Да, если она ничего не делает - выкинет.
Мурик, volatile то вставил, знаешь что иначе оптимизатор почикает всё.
Мурик, volatile то вставил, знаешь что иначе оптимизатор почикает всё.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
[uquote="a5021",url="/forum/viewtopic.php?p=3483188#p3483188"]На самом деле, вложенных if-ов у меня получалось больше, но даже тут глубина их начинает резать глаз. Какое решение пришло в голову в конце-концов:
[/uquote]Какое то нестандартное решение.
Не проще было сделать ф-ию delay возвращаемой true и не городить такой огород со скобками и запятыми ?
Код: Выделить всё
int main(void) {
if (reset() && (delay(100), 1) && init() && (delay(100), 1) && run_cmd(MOVE_FORWARD)) {
// do smth
}
}
Не проще было сделать ф-ию delay возвращаемой true и не городить такой огород со скобками и запятыми ?
Re: Вопросы по С/С++ (СИ)
Это здесь причем? Без volatile оптимизатор "наведет порядок" и когда функция не в if. Хотя бывают исключения.VladislavS писал(а):volatile то вставил, знаешь что иначе оптимизатор почикает всё.
Речь о том что из if функция delay() не выбрасывается.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
как мною и ожидалось, очередной пример того, как запятая помогает выстрелить в ногу. осмысленное её применение в for, в других случаях - цирк.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
[uquote="VladislavS",url="/forum/viewtopic.php?p=3483424#p3483424"]Да, если она ничего не делает - выкинет.[/uquote]
Теоретик из вас, походу, никудышный.
IAR 8, оптимизация HIGH/SIZE:
Весь код ответственный за блинк на месте. Это не смотря на то, что у if-а тела нет вовсе.
[uquote="Аlex",url="/forum/viewtopic.php?p=3483427#p3483427"]Не проще было сделать ф-ию delay возвращаемой true и не городить такой огород со скобками и запятыми ?[/uquote]
И что это даст кроме ощущения преемственности поколений?
[uquote="ARV",url="/forum/viewtopic.php?p=3483447#p3483447"]как мною и ожидалось, очередной пример того, как запятая помогает выстрелить в ногу.[/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));
}Код: Выделить всё
\ 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
[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: Вопросы по С/С++ (СИ)
[uquote="a5021",url="/forum/viewtopic.php?p=3483448#p3483448"]Теоретик из вас, походу, никудышный.
[/uquote]Потому что NOP это "полезное действие" или volatile.
Уже второй пример и в обоих есть причина по которой не выкинута функция. Но в один прекрасный момент этой причины не окажется.
Код: Выделить всё
void custom_delay(unsigned int delay) {
while(--delay) __NOP();
}
Уже второй пример и в обоих есть причина по которой не выкинута функция. Но в один прекрасный момент этой причины не окажется.
Re: Вопросы по С/С++ (СИ)
[uquote="VladislavS",url="/forum/viewtopic.php?p=3483455#p3483455"]Потому что NOP это "полезное действие" или volatile.[/uquote]
Не сочиняйте. Волатилы там нет.
Не сочиняйте. Волатилы там нет.
Re: Вопросы по С/С++ (СИ)
VladislavS, насколько помню вы писали что оптимизатор выкинет delay из if потому что она ничего не возвращает. https://radiokot.ru/forum/viewtopic.php ... 2#p3483222
Про volatile ни слова не было.
Про volatile ни слова не было.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Лень включать комп, но продравшись через заголовочные файлы ты доберёшься до ассемблерной команды NOP, которую компилятор не имеет права выкинуть.
Добавлено after 5 minutes 32 seconds:
[uquote="Мурик",url="/forum/viewtopic.php?p=3483458#p3483458"]Про volatile ни слова не было.[/uquote]Убери volatile и выкинет потому что ничего не возвращает. Представь, если она будет скомпилирована в другом модуле. Что будет в случаях когда она возвращает значениеи или не возвращает?
Добавлено after 5 minutes 32 seconds:
[uquote="Мурик",url="/forum/viewtopic.php?p=3483458#p3483458"]Про volatile ни слова не было.[/uquote]Убери volatile и выкинет потому что ничего не возвращает. Представь, если она будет скомпилирована в другом модуле. Что будет в случаях когда она возвращает значениеи или не возвращает?
Re: Вопросы по С/С++ (СИ)
Ноп есть. Волатилы, в том числе в заголовочных файлах, нет.
Но я почему-то ничего не слышал о волшебных свойствах этой команды, запрещающих всякую оптимизацию. Кроме того, еще недавно вы категорично утверждали, что от оптимизации внутри if-а ничего не может спасти.
Код: Выделить всё
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
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
[uquote="a5021",url="/forum/viewtopic.php?p=3483448#p3483448"]И что это даст кроме ощущения преемственности поколений?[/uquote]Т.е. избавление от кучи фигурных скобок с вложенными if'ами Вам что-то дало, а избавление от скобок, запятых, 1-диничек, ... Вам ничего, кроме ощущения преемственности поколений, не даёт ?
Вы боролись с оптимизацией строк кода. Собственно, возвращаемая ф-ия delay, тоже немного подуменьшит кол-во напечатанных символов кода, не изменяя итоговый результат исполнения программы.
Вы боролись с оптимизацией строк кода. Собственно, возвращаемая ф-ия delay, тоже немного подуменьшит кол-во напечатанных символов кода, не изменяя итоговый результат исполнения программы.
- da-nie
- Говорящий с текстолитом
- Сообщения: 1590
- Зарегистрирован: Вс июн 24, 2012 16:07:00
- Откуда: Лен.Обл.
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Да хватит вам спорить, посмотрите лучше статьи про барьеры компилятора и памяти, а то вам будет непонятно что, например, внутри критической секции происходит и почему там 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
Мои программки: 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: Вопросы по С/С++ (СИ)
[uquote="a5021",url="/forum/viewtopic.php?p=3483477#p3483477"]Но я почему-то ничего не слышал о волшебных свойствах этой команды, запрещающих всякую оптимизацию.[/uquote]Не конкретно этой команды, а любых ассемблерных вставок, коих вы как пользователь iar в интринсиках можете найти достаточно много.
[uquote="a5021",url="/forum/viewtopic.php?p=3483477#p3483477"]Кроме того, еще недавно вы категорично утверждали, что от оптимизации внутри if-а ничего не может спасти.[/uquote]Если не применить специальных мер, да оптимизирует. В двух примерах эти меры были применены.
Господа, программируйте как хотите, но тут заложена потенциальная проблема. Умеете обходить, хорошо, но вспомните сколько тем "не заходит в ветку под отладкой" и им подобных от нубов. Лучше такое не пропагандировать.
[uquote="a5021",url="/forum/viewtopic.php?p=3483477#p3483477"]Кроме того, еще недавно вы категорично утверждали, что от оптимизации внутри if-а ничего не может спасти.[/uquote]Если не применить специальных мер, да оптимизирует. В двух примерах эти меры были применены.
Господа, программируйте как хотите, но тут заложена потенциальная проблема. Умеете обходить, хорошо, но вспомните сколько тем "не заходит в ветку под отладкой" и им подобных от нубов. Лучше такое не пропагандировать.
Re: Вопросы по С/С++ (СИ)
Заходит он в отладку в таких выражениях. По каждому условию заходит. Придумайте что-то по-убедительнее.
[uquote="VladislavS",url="/forum/viewtopic.php?p=3483490#p3483490"]Лучше такое не пропагандировать.[/uquote]
Лучше категоричные заявления от фонаря пропагандировать по вашим рецептам?
[uquote="Аlex",url="/forum/viewtopic.php?p=3483480#p3483480"]Вы боролись с оптимизацией строк кода.[/uquote]
С глубокой вложенностью я боролся. Оная вложенность заслуженно считается плохим тоном. Я же предельно конкретно об этом написал. Что за выдумки тут возникают?
[uquote="VladislavS",url="/forum/viewtopic.php?p=3483490#p3483490"]Лучше такое не пропагандировать.[/uquote]
Лучше категоричные заявления от фонаря пропагандировать по вашим рецептам?
[uquote="Аlex",url="/forum/viewtopic.php?p=3483480#p3483480"]Вы боролись с оптимизацией строк кода.[/uquote]
С глубокой вложенностью я боролся. Оная вложенность заслуженно считается плохим тоном. Я же предельно конкретно об этом написал. Что за выдумки тут возникают?
Если функция одна и ваша, то, возможно. Если их много и они из библиотеки, то получится гора писанины, не дающая никаких плюсов.Собственно, возвращаемая ф-ия delay, тоже немного подуменьшит кол-во напечатанных символов кода, не изменяя итоговый результат исполнения программы.
Re: Вопросы по С/С++ (СИ)
А если функция будет не в if ее разве не выкинет?VladislavS писал(а):Убери volatile и выкинет потому что ничего не возвращает.
Не нужно пытаться оправдать себя. Просто признай ошибку.
Во первых, утверждаешь что нет последовательности вычисления в if, а это не так. Выполнение идет слева на право.
Во вторых утверждаешь что из if будет выброшена функция delay потому что ничего не возвращает и сравнивать нечего, но это не так и было доказано на практике.
Прочитай книжки по Си хотя бы для чайников, чтобы освежить знания.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
Мурик, похоже вы не видели результаты работы по настоящему злобных оптимизирующих компиляторов.
Re: Вопросы по С/С++ (СИ)
Так покажите. Неопределенные движения рукой по направлению куда-то вдаль ничего не доказывают. Точнее доказывают, но не думаю, что вам это может нравиться.