-
- Так проблема-то не в этом коде. Он работает. Но иногда что-то
перебивает данные. А прерываний море, как отследить где и кто
портит. POV(7 знак., 11.02.2023 21:12, картинка, картинка)
- Возможно где-то из обработчика прерывания вызывается
нереентерабельная функция. Смутно похожая шняга была недавно.
Обработчик не сохраняет регистры, так как он в своей банке
работает. А вызываемая функа обращается (по прямым адресам) к
регистрам основного банка, считая что регистры сохранены. Ну и
эпизодически чего-то херила в чужих регистрах. - LightElf(12.02.2023 01:01)
- +1 на счет вопроса реентерабельности. Там вся работа с DWORD
получается через какие-то функции компилятора, возможно выбрана не
реентерабельная версия при сборке, если там это вообще выбирается. AlexBi(204 знак., 12.02.2023 09:33)
- В самом листинг все, на мой взгляд, нормально. Хотя volatile у temp
лишний и вредный. Беда где-то в другом месте, возможно в самом
обработчике systick или даже вообще в третьем месте. Keil51
прекрасен, но оверлеинг переменных может приводить к неожиданным
результатам. - LightElf(12.02.2023 17:19)
- +1. Вангую, где-то в другом месте чуйдеса. - SciFi(12.02.2023 18:02)
- В самом листинг все, на мой взгляд, нормально. Хотя volatile у temp
лишний и вредный. Беда где-то в другом месте, возможно в самом
обработчике systick или даже вообще в третьем месте. Keil51
прекрасен, но оверлеинг переменных может приводить к неожиданным
результатам. - LightElf(12.02.2023 17:19)
- +1 на счет вопроса реентерабельности. Там вся работа с DWORD
получается через какие-то функции компилятора, возможно выбрана не
реентерабельная версия при сборке, если там это вообще выбирается. AlexBi(204 знак., 12.02.2023 09:33)
- У меня была проблема такого рода, когда я чужую либу к себе в код прикрутил. В ней было много вызовов функций с большим числом аргументов в виде uint32_t, а также локальных переменных. Стека не хватало. Выкидывал лишнее, типы данных заменил на uint16_t и меньше везде, где можно. - Costic(11.02.2023 21:32)
- Если код ни при чём, зачем он тут? Ну а с прерываниями надо просто отслеживать разделяемые ресурсы и предусматривать защиту там, где возможен конфликт. - SciFi(11.02.2023 21:20)
- Возможно где-то из обработчика прерывания вызывается
нереентерабельная функция. Смутно похожая шняга была недавно.
Обработчик не сохраняет регистры, так как он в своей банке
работает. А вызываемая функа обращается (по прямым адресам) к
регистрам основного банка, считая что регистры сохранены. Ну и
эпизодически чего-то херила в чужих регистрах. - LightElf(12.02.2023 01:01)
- Так проблема-то не в этом коде. Он работает. Но иногда что-то
перебивает данные. А прерываний море, как отследить где и кто
портит. POV(7 знак., 11.02.2023 21:12, картинка, картинка)