-
- А если у меня данные меняются вне контекста? - mse homjak(26.12.2024 17:45)
- Ну просто же. В том файле где меняются вне контекста - volatile, в
остальных без оного. Например при неприоритетной системе
прерываний, в файле прерывания определяем без volatile, в остальных файлах с volatile. А еще лучше использовать гетер, и волатильную
переменную не светить по всему проекту. Например так IBAH(439 знак., 26.12.2024 19:18)
- Ещё лучше исползовать локальную копию volatile там, где код в прерывании либо прерывания временно запрещены. - vpv.vpv(27.12.2024 06:55)
- Ну, скажэм так, зачем нужна переменная в прерывании, для передачи
данных из внешнего порта, если её нельзя пользовать в проекте? Т.е.
только волатильность. mse homjak(417 знак., 26.12.2024 19:55)
- Это АВР? 8бит? Волатильность не только оптимизация, это еще и
должно быть атомарное чтение - IBAH(26.12.2024 20:10)
- Не... Там даные идут регулярно и с запасом по времени. Т.е.
атомарность чтения соблюдать не надо. Об этом подумано изначально. - mse homjak(26.12.2024 20:23)
- Ну как не надо? два байта за одну команду не переслать, а если
модификация произойдет после чтение первого байта? - IBAH(26.12.2024 20:40)
- Месье намекает, что к моменту следующей модификации, его код из
main(), уже всё закончит и модификация ни на что не повлияет. А
после модификации будет поднят флаг и всё спокойно обработается
снова и завершиться раньше, чем наступит следующее обновление. - Nikolay_Po(26.12.2024 20:56)
- а к моменту первой модификации? - IBAH(26.12.2024 21:01)
- У ТС нет проблем с первой модификацией. - Nikolay_Po(26.12.2024 21:06)
- Хужэ того, если не будет успевать, то устройство принципиально неработоспособно. - mse homjak(26.12.2024 21:22)
- У ТС нет проблем с первой модификацией. - Nikolay_Po(26.12.2024 21:06)
- а к моменту первой модификации? - IBAH(26.12.2024 21:01)
- Месье намекает, что к моменту следующей модификации, его код из
main(), уже всё закончит и модификация ни на что не повлияет. А
после модификации будет поднят флаг и всё спокойно обработается
снова и завершиться раньше, чем наступит следующее обновление. - Nikolay_Po(26.12.2024 20:56)
- Ну как не надо? два байта за одну команду не переслать, а если
модификация произойдет после чтение первого байта? - IBAH(26.12.2024 20:40)
- Не... Там даные идут регулярно и с запасом по времени. Т.е.
атомарность чтения соблюдать не надо. Об этом подумано изначально. - mse homjak(26.12.2024 20:23)
- Во-во. Поэтому всегда тщательно анализируйте, какие переменные внутри контекста, а какие - из прерываний. И назначайте соответствующие квалификаторы. Я при каждом ревью кода внимательно смотрю, вплоть до составления списка, какие переменные у меня обновляются или вычитываются вне контекста. И объявляю их волатильными. Nikolay_Po(267 знак., 26.12.2024 20:01)
- Это АВР? 8бит? Волатильность не только оптимизация, это еще и
должно быть атомарное чтение - IBAH(26.12.2024 20:10)
- В общем, вредный совет насчёт там волатильная, а сям - нет. Когда-то так и делал. Нюанс в том, что запись тоже оптимизируется. Поэтому если в контексте, допустим, прерывания, запись в неволатильную память на этот контекст не влияет, она может быть упразднена. Nikolay_Po(290 знак., 26.12.2024 19:39)
- Значит, обращайтесь к ним с модификатором volatile. Если есть
уверенность, что на конкретном участке выполнения, значение
меняться не будет, то, чтобы не блокировать оптимизацию,
используйте временную не-волатильную переменную или просто
приведение типа к не-волатильному. - Nikolay_Po(26.12.2024 19:06)
- Тут неприятность возникла исключительно как частный случай. mse homjak(184 знак., 26.12.2024 20:01)
- Ну просто же. В том файле где меняются вне контекста - volatile, в
остальных без оного. Например при неприоритетной системе
прерываний, в файле прерывания определяем без volatile, в остальных файлах с volatile. А еще лучше использовать гетер, и волатильную
переменную не светить по всему проекту. Например так IBAH(439 знак., 26.12.2024 19:18)
- А если у меня данные меняются вне контекста? - mse homjak(26.12.2024 17:45)