Пишу программу для микроконтроллера, нужно написать код, который просто будет крутиться в вечном цикле. Т.е. компилироваться в инструкцию b .
В голову, конечно, сразу приходит for ( ; ; ) {} но clang с оптимизацией этот цикл тупо выкидывает.
Можно написать for (volatile unsigned unused; ; unused++) {} этот код не выкидывает, но мне не нравится, что он постоянно гоняет трафик между процессором и оперативной памятью, например это может мешать DMA-передачам.
Можно ли это сделать на C, согласно стандарту и без ассемблерных вставок?
Здравствуйте, vsb, Вы писали:
vsb>В голову, конечно, сразу приходит for ( ; ; ) {} но clang с оптимизацией этот цикл тупо выкидывает.
Странно. Раньше вроде компиляторы соображали, что такой цикл — это специальный случай, и не выкидывали его на оптимизации.
vsb>Можно ли это сделать на C, согласно стандарту и без ассемблерных вставок?
Нет.
Я бы вставил в цикл пустую ассемблерную вставку. Даже не из nop, а из пустой строки.
Компилятор не понимает этих вставок, но знает, что не понимает, и поэтому не выкидывает.
Здравствуйте, Pzz, Вы писали:
Pzz>Я бы вставил в цикл пустую ассемблерную вставку. Даже не из nop, а из пустой строки.
Спасибо, так работает, конечно есть опасения, что "завтра" он может стать умней и выкинуть и такой цикл. Я так понимаю, asm это по определению implementation-defined. Ладно, будем надеяться, что хоть такой специальный случай оставят.
Здравствуйте, vsb, Вы писали:
Pzz>>Я бы вставил в цикл пустую ассемблерную вставку. Даже не из nop, а из пустой строки.
vsb>Спасибо, так работает, конечно есть опасения, что "завтра" он может стать умней и выкинуть и такой цикл.
Нет, вряд ли. Ему для этого придется научиться понимать ассемблер, а зачем ему это надо?
Здравствуйте, Pzz, Вы писали:
vsb>>Спасибо, так работает, конечно есть опасения, что "завтра" он может стать умней и выкинуть и такой цикл.
Pzz>Нет, вряд ли. Ему для этого придется научиться понимать ассемблер, а зачем ему это надо?
РаздражатьУдивлять программистов, конечно, для чего же ещё может понадобиться "оптимизировать" пустые циклы (:
Здравствуйте, vsb, Вы писали:
vsb>В голову, конечно, сразу приходит for ( ; ; ) {} но clang с оптимизацией этот цикл тупо выкидывает.
Ну так сделай это внутри отдельной функции, скажем forever() в отдельном файле. Для файла оптимизацию выключи. Не лучший варик, но хоть по всей программе не будет расползаться.
Здравствуйте, vsb, Вы писали:
vsb>В голову, конечно, сразу приходит for ( ; ; ) {} но clang с оптимизацией этот цикл тупо выкидывает.
Просто выкиньте clang и используйте нормальный компилятор.
Пишется на ассемблере загрузчик, который после инициализации стека и другой фигни
вызывает setup() и потом loop() в бесконечном цикле. Посмотрите на arduino
void setup() {
//
}
void loop() {
}
vsb>Можно ли это сделать на C, согласно стандарту и без ассемблерных вставок?
да, но для этого отключите е$@нутые оптимизации clang для файла boot.c
Здравствуйте, vsb, Вы писали:
Pzz>>Нет, вряд ли. Ему для этого придется научиться понимать ассемблер, а зачем ему это надо?
vsb>РаздражатьУдивлять программистов, конечно, для чего же ещё может понадобиться "оптимизировать" пустые циклы (:
Они по дефолту оптимизируются. Чтобы они не оптимизировались, надо специально усилия предпринимать.
P.S. В инструкции к gcc, когда я ее читал последний раз, было написано, что gcc понимает пустой цикл, как такой специальный случай, и сознательно его не оптимизирует.
Похоже, это еще одно знание, утраченное цивилизацией — то ли в clang, то ли вообще...
Здравствуйте, Нomunculus, Вы писали:
Pzz>>Похоже, это еще одно знание, утраченное цивилизацией — то ли в clang, то ли вообще...
Н>Как и любое такое знание — из разряда умения постройки пирамид. Утратилось, потому что не нать
Не, пустые циклу не опримизировать таки нать. Вообще, Си всегда был ценен именно тем, что позволял помимо всего прочего делать всякие низкоуровневые вещи. Причем хорошо вписанные в более высокоуровневую канву сишной программы.
А если теперь в нем это постепенно отмирает, нафиг он вообще нужен?
Просто раньше за ним живые люди стояли, типа Ричи и Томпсона, которые понимали, что они делают. А теперь коллективный разум в виде коммитета по стандартизации. А "коллективный" — это, считай, никакой.
Здравствуйте, Pzz, Вы писали:
Pzz>Просто раньше за ним живые люди стояли, типа Ричи и Томпсона, которые понимали, что они делают. А теперь коллективный разум в виде коммитета по стандартизации. А "коллективный" — это, считай, никакой.
Точно: — У семи нянек детё без глаза.
Здравствуйте, Pavel Dvorkin, Вы писали:
vsb>>Можно ли это сделать на C, согласно стандарту и без ассемблерных вставок?
PD>Попробуй
PD>loop : goto loop;