|
|
  |
Как обойти глюки оптимизации, или мои глюки ... |
|
|
|
Dec 22 2008, 13:54
|
Местный
  
Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112

|
Это означает, что если переменная, допустим, типа int, и она проверяется в основной программе, в момент проверки, после сравнения, допустим старшего байта происходит прерываие таймера и изменяет эту переменную. В результате в операции сравнения сравнивается старший байт от старого значения, а младший - от нового. Вот такой получается косячок-с. Для того, чтоб такого не происходило, на время обращения к этой переменной прерывания надо запретить, а потом опять восстановить. (Или одно, конкретное прерывание, которое обновляет переменную).
Сообщение отредактировал forever failure - Dec 22 2008, 13:54
|
|
|
|
|
Dec 23 2008, 16:06
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Эта тема напоминает торный путь из граблей, по которому ходят все вновьприбывшие.  И каждый вновьприбывший удивляется тому факту, что дорога вроде давно протоптана, а грабли все еще лежат там же  Про volatile надо писать в FAQ крупными буквами. А по поводу оптимизации обращения к константе, расположенной по фиксированному адресу, я сам недавно писал и там же указал решение/обходной путь.
|
|
|
|
|
Dec 25 2008, 15:32
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(sonycman @ Dec 25 2008, 17:13)  Может наоборот, сравнивать младшие байты? А то ведь старшие могут быть равны, а младший отличаться. При этом результат каждого чтения будет содержать корректное на момент чтения значение пары младшего и старшего байтов. Поскольку прерывание с точки зрения программы атомарно. Т.е. не может сначала изменить младший байт с 0xFF на 0x00, потом дать немного поработать программе и только потом увеличить на 1 старший байт.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|