Микроконтроллеры | Как пользоваться volatile на СИ ? |
|
---|---|---|
Возник такой вопрос, в языке СИ при объявлении переменной есть такая штука volatile она указывает компилятору, что не нужно производить оптимизацию кода для работы с этими данными. |
|
|
Ну, например, делаешь задержку:
Если i не volatile, то компилятор может просто не выполнять 200 циклов. Другой пример:
Ты делаешь задержку: Если ticks не volatile, то может быть глухой зависон. (Скомпилируется в одно чтение из ticks в регистр и последующее сравнение значения этого регистра с нулём). |
|
|
Цитирую: "Чтобы указать, что значение переменной может измениться независимо от программы, т.е. вследствие воздействия еще чего-либо, не являющегося оператором программы, используется квалификатор volatile. Например, в подпрограмму операционной системы можно передать адрес глобальной переменной, содержащей системное время. Значение этой переменной изменяется, даже если ей в программе не делается никаких присваиваний. Знание таких подробностей важно потому, что большенство компиляторов С автоматически оптимизирует некоторые выражения, предполагая при этом неизменность переменной, если она не встречается в левой части оператора присваивания. В этом случае при очередной ссылке на переменную может использоваться ее предыдущее значение. Некоторые компиляторы изменяют порядок вычислений в выражениях, что может привести к ошибке, если в выражений присутствует переменная, вычисляемая вне программы. Квалификатор volatile предотвращает такие изменения программы." |
|
|
Да я это читал, но .... |
|
|
Lerik: Другими словами мы таким образом объявляем глобальную переменную, так можно это понимать? Не глобальную, а «расшаренную» То есть переменную, значение которой могут изменять разные части программы. |
|
|
Ну я так это и понял а если глубже копнуть, то если переменная не volatile то шибко умный компилятор для нее использует регистры, в противном случае отводит для нее память, так? |
|
|
"разные части программы" - это обработчики прерываний, подпрограммы, функции? Да? |
|
|
то АНТОХА void delay(void) { Если i не volatile, то компилятор может просто не выполнять 200 циклов Это еще с какой стати????? переменную int i; ты объявил как локальныю в процедуре, с какой стати не будет 200 циклов ? По моему пример не корректный... Вот если б i была объявлена ранее тогда другое дело.... Но все равно 200 циклов открутилось бы (компилятор не имеет права менять логику) , но после цикла переменная i будет иметь неопределенное значение. |
|
|
|
||
Lerik: Это еще с какой стати????? |
|
|
Форум про радио — сайт, посвященный обсуждению электроники, компьютеров и смежных тем. pro-radio.online | Обратная связь |
© 2003—2024 |