Как" сказать " компилятору C, что код не должен быть оптимизирован?

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

unsigned char  flag=0;

interrupt ADC_ISR(){
  ADC_result = ADCH;
  flag = 1;
}

void main(){
  while(!flag);
  echo ADC_result;
}

некоторые компиляторы, безусловно, сделает while(!flag); петля инфинитива, как он будет предполагать flag равно false (!flag поэтому всегда верно).

иногда я могу использовать volatile ключевое слово. И иногда это может помочь. Но на самом деле в моем случае (AVR GCC) volatile ключевое слово заставляет компилятор находить переменную в SRAM вместо регистров (что по некоторым причинам плохо). Более того, многие статьи в Интернете предлагают использовать volatile ключевое слово с большой осторожностью в результате может стать нестабильным (в зависимости от компилятора, его настроек оптимизации, платформы и так далее).

поэтому я определенно предпочел бы как-то указать инструкцию исходного кода и сказать компилятору, что этот код должен быть скомпилирован точно так, как он есть. Вроде этого: volatile while(!flag);

есть ли стандартная инструкция C для этого?

3 ответов


вы действительно должны использовать volatile as ответил Дэвид Шварц. См. также этой глава документации GCC.

если вы используете последние GCC компилятор, вы можете отключить оптимизацию в одной функции, используя соответствующий функции конкретных опций pragmas (или optimize функции атрибут), например

#pragma GCC optimize ("-O0");

перед main. Я не уверен, что это хорошо идея.

вы хотите продлен asm заявления с volatile ключевое слово.

единственным стандартным способом C является volatile. Если это не произойдет, чтобы сделать именно то, что вы хотите, вам нужно будет использовать что-то конкретное для вашей платформы.


У вас есть несколько вариантов:

  1. компиляция без оптимизаций. В отличие от некоторых компиляторов, GCC не оптимизируется по умолчанию, поэтому, если вы не скажете ему оптимизировать, вы должны получить сгенерированный код, который выглядит очень похожим на ваш источник C. Конечно, вы можете оптимизировать некоторые файлы C, а не другие, используя простые правила make.

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

  3. используйте volatile, что не позволяет компилятору делать какие-либо предположения об определенной переменной, поэтому для любого использования переменной в C компилятор вынужден генерировать нагрузку или хранилище, даже если это якобы не нужно.