-
- Завожу переменную volatile, в неё читаю, потом добавляю пургу с
нею, типа инкремент, декремент. Обычно, особенно при нулевой
оптимизации, такое компилятор не выбрасывает - Vit(27.12.2020 17:39)
- После записи нужно ещё мемори-барьер. Иначе записать может
когда-нибудь потом, в будущем, в конце функции. - fk0(27.12.2020 18:06)
- для volatile мало инкремента? странное предположение, КМК. кстати,
а есть у PIC24F барьеры в явном виде? - Vit(27.12.2020 18:37)
- volatile говорит, что в ячейку памяти связанную с переменной нужно
записать. Но он не говорит, что записать нужно прямо сейчас.
Компилятор волен переупорядочить инструкции и эту запись сделать
сильно позже или сильно раньше. На моей практике встречалось
перекидывание таких записей в конец функции (где, видимо, есть
свободные для работы регистры). - fk0(27.12.2020 20:33)
- В дебаггере хожу ПО ШАГАМ! Для самых умных добавлю - специально в функции убрал обращения не к volatile - все обращения к SFR, ну и вот к дамми-переменной пришлось
добавлять, чтобы увидеть, что IDE - таки ГОВНО. Что, где и когда
должно тасоваться? Какая б@#$ь мне не хочет показывать SFR? Кстати,
в хедерах так и не нашёл, где объявлены регистры, а не битовые
структуры. Типа интринсик гуано в компиляторе зарыто. может оно там
и не volatile? Хотя что со Vit(40 знак., 27.12.2020 21:03)
- Да хоть на голове ходи! Или компилируй без оптимизации с -O0, или
порядок обращения с volatile-переменным и SFR-регистрам может
отличаться от порядка обращения к другим переменным и не совпадать
со строчками кода. Я не про конкретную IDE и компилятор, а вообще.
Просто, чтоб напомнить, что компилятор вправе иметь свой взгляд на
последовательность инструкций. Естесственным барьером является
вызов функции: перед вызовом, или в конце функции, точно всё
сделается, что должно было fk0(13 знак., 27.12.2020 23:50)
- Я понял, что ты вааще. Тут же трабла не в неправильном порядке
выполнения, а в том, что IDE не обновляет окошко с SFR-ами. Точнее,
с рандомной паузой таки может. Почему спросил о нативных барьерах
(функции компилер тоже может заинлайнить) - не со всеми регистрами
одинаково хреново. Есть предположение, что связано с тем, что
таймер MCCP в асинхронном режиме и тактируется от генератора
часового кварца, ну а дальше всякие фризы, характерные для дебага
могут быть. Аналогичные Vit(86 знак., 28.12.2020 00:10)
- Если открыто окно с дампом достаточно большого участка памяти, то
виснет на время считывания этого участка. Помню сталкивался с
чем-то таким. После этого дампом памяти пользовался в режиме
открыл-закрыл, и только если очень надо. - AlexBi(28.12.2020 11:59)
- Красавцы сами все SFR в одно окно засунули. - Vit(29.12.2020 01:21)
- Если открыто окно с дампом достаточно большого участка памяти, то
виснет на время считывания этого участка. Помню сталкивался с
чем-то таким. После этого дампом памяти пользовался в режиме
открыл-закрыл, и только если очень надо. - AlexBi(28.12.2020 11:59)
- Я понял, что ты вааще. Тут же трабла не в неправильном порядке
выполнения, а в том, что IDE не обновляет окошко с SFR-ами. Точнее,
с рандомной паузой таки может. Почему спросил о нативных барьерах
(функции компилер тоже может заинлайнить) - не со всеми регистрами
одинаково хреново. Есть предположение, что связано с тем, что
таймер MCCP в асинхронном режиме и тактируется от генератора
часового кварца, ну а дальше всякие фризы, характерные для дебага
могут быть. Аналогичные Vit(86 знак., 28.12.2020 00:10)
- Да хоть на голове ходи! Или компилируй без оптимизации с -O0, или
порядок обращения с volatile-переменным и SFR-регистрам может
отличаться от порядка обращения к другим переменным и не совпадать
со строчками кода. Я не про конкретную IDE и компилятор, а вообще.
Просто, чтоб напомнить, что компилятор вправе иметь свой взгляд на
последовательность инструкций. Естесственным барьером является
вызов функции: перед вызовом, или в конце функции, точно всё
сделается, что должно было fk0(13 знак., 27.12.2020 23:50)
- Порядок обращений к volatile переставлять не имеет права. Такшта не в тему >>> - SciFi(27.12.2020 20:36, ссылка)
- В дебаггере хожу ПО ШАГАМ! Для самых умных добавлю - специально в функции убрал обращения не к volatile - все обращения к SFR, ну и вот к дамми-переменной пришлось
добавлять, чтобы увидеть, что IDE - таки ГОВНО. Что, где и когда
должно тасоваться? Какая б@#$ь мне не хочет показывать SFR? Кстати,
в хедерах так и не нашёл, где объявлены регистры, а не битовые
структуры. Типа интринсик гуано в компиляторе зарыто. может оно там
и не volatile? Хотя что со Vit(40 знак., 27.12.2020 21:03)
- Нет там никаких барьеров. Кэшей нет. Volatile всегда
инкрементируется по месту. Гляньте дизассемблер. Nikolay_Po(227 знак., 27.12.2020 19:52)
- Теме уже 13 лет. Нельзя быть столько необучаемыми, ОМГ... volatile
инкрементируется, но вот о том, что "по месту" -- никто не обещал. - fk0(27.12.2020 20:36, ссылка, ссылка)
- Если по ходу исполнения программы, volatile-переменной
присваивается значение, то все действия, определяющие новое
значение, будут выполнены до присвоения. Остальное, что на volatile
переменную не влияет, скорее всего будет удалено из машинного кода. Nikolay_Po(242 знак., 27.12.2020 21:44)
- Дада, только присвоение можно увидеть не в этой строчке кода, а где-то в конце функции. А до того значение заботливо пряталось в регистрах и сохранялось через push/pop. Я вот о чём. Почему так -- х.з. видимо этих самых регистров не хватало для вычисления адреса volatile переменной, присвоить в конце (когда масса регистров уже не нужна) выгодней. - fk0(27.12.2020 23:52)
- Если по ходу исполнения программы, volatile-переменной
присваивается значение, то все действия, определяющие новое
значение, будут выполнены до присвоения. Остальное, что на volatile
переменную не влияет, скорее всего будет удалено из машинного кода. Nikolay_Po(242 знак., 27.12.2020 21:44)
- Я и так прекрасно знаю, что, где и когда должно обновиться, кроме,
сцуко, окна SFR:) И дизассемблер как бы не должен влиять на
отбражение SFR - Vit(27.12.2020 20:10)
- Этот SFR, вообще, должен читаться? Не все спец. регистры при чтении
дадут то, что в них записали! - Nikolay_Po(27.12.2020 21:27)
- Представляете, не только по доке, но даже в переменную читается
(правильное значение), которая заведена для dummy-read (чуть выше
есть об этом, если что). Вот только IDE грустное. Но мы прорвемся.
Я даже не жалуюсь. Просто иногда негодую. Кому-то и через блинк
отладку делать интересно. Не верю, что это удобно и экономит вермя
и деньги, но это их Дао. Мне вот интересно, за что эти мелкочипы
хотят денег в платной версии? Оптимизацию по совету коллег включал
как в коммерческой - Vit(450 знак., 27.12.2020 22:05)
- Про то, что MPLABX -- говнище, было сказано ещё более 10 лет
назад... С другой стороны, глядеть SFR регистры -- это не самое
главное, что нужно. Да и потом регистры же могут быть write only,
или чтение может иметь побочные эффекты (чтение регистра приёма
UART, например). Как спрашивается отладчику быть? Знать все
регистры и все биты для данной архитектуры? Главное в отладчике --
работающий printf (или свой на UART делай), брейкпоинты,
возможность рассмотреть стек и fk0(38 знак., 27.12.2020 23:55)
- Отладчику быть хотя бы не хуже, чем у других. И оно проявляется и на пиккит3, и на пикккит4. Просто я лезу туда, где явного описаня по мануалу не видно. Несколько неприятно, что пишу в регистр управления, читаю регистр статуса, а его значение и то, что показывает SFR-окошко, разные - Vit(28.12.2020 00:15)
- Про то, что MPLABX -- говнище, было сказано ещё более 10 лет
назад... С другой стороны, глядеть SFR регистры -- это не самое
главное, что нужно. Да и потом регистры же могут быть write only,
или чтение может иметь побочные эффекты (чтение регистра приёма
UART, например). Как спрашивается отладчику быть? Знать все
регистры и все биты для данной архитектуры? Главное в отладчике --
работающий printf (или свой на UART делай), брейкпоинты,
возможность рассмотреть стек и fk0(38 знак., 27.12.2020 23:55)
- Давайте не будем задавать вопросы типа "а вилку в розетку вставить не забыли?" Во всяком случае, этому сахарчанину :-) - SciFi(27.12.2020 21:31)
- Представляете, не только по доке, но даже в переменную читается
(правильное значение), которая заведена для dummy-read (чуть выше
есть об этом, если что). Вот только IDE грустное. Но мы прорвемся.
Я даже не жалуюсь. Просто иногда негодую. Кому-то и через блинк
отладку делать интересно. Не верю, что это удобно и экономит вермя
и деньги, но это их Дао. Мне вот интересно, за что эти мелкочипы
хотят денег в платной версии? Оптимизацию по совету коллег включал
как в коммерческой - Vit(450 знак., 27.12.2020 22:05)
- Этот SFR, вообще, должен читаться? Не все спец. регистры при чтении
дадут то, что в них записали! - Nikolay_Po(27.12.2020 21:27)
- Теме уже 13 лет. Нельзя быть столько необучаемыми, ОМГ... volatile
инкрементируется, но вот о том, что "по месту" -- никто не обещал. - fk0(27.12.2020 20:36, ссылка, ссылка)
- Можно попробовать asm(:::memory) ; Встречал такие конструкции для avr, cortex. Но то gcc был. - Dingo(27.12.2020 19:11)
- volatile говорит, что в ячейку памяти связанную с переменной нужно
записать. Но он не говорит, что записать нужно прямо сейчас.
Компилятор волен переупорядочить инструкции и эту запись сделать
сильно позже или сильно раньше. На моей практике встречалось
перекидывание таких записей в конец функции (где, видимо, есть
свободные для работы регистры). - fk0(27.12.2020 20:33)
- для volatile мало инкремента? странное предположение, КМК. кстати,
а есть у PIC24F барьеры в явном виде? - Vit(27.12.2020 18:37)
- После записи нужно ещё мемори-барьер. Иначе записать может
когда-нибудь потом, в будущем, в конце функции. - fk0(27.12.2020 18:06)
- Завожу переменную volatile, в неё читаю, потом добавляю пургу с
нею, типа инкремент, декремент. Обычно, особенно при нулевой
оптимизации, такое компилятор не выбрасывает - Vit(27.12.2020 17:39)