у меня есть код
const float previousTemperature = getTemperature();
someNestedFunction();
someOtherActions();
setTemperature(previousTemperature);
Моя проблема в том, что в someNestedFunction();
previousTemperature
модифицируется. Я просмотрел дизассемблирование и не могу найти никаких инструкций, которые перед вызовом выталкивали бы или извлекали бы регистр, в котором хранится previousTemperature
.
Я проверил документацию ARM и там написано:
Остальные регистры в FPU, то есть S0-S15 и FPSCR, всегда сохраняются автоматически.
Моя переменная хранится в S18, так как я могу убедиться, что она будет правильно сохранена и восстановлена? Я хотел бы найти решение, которое позволило бы избежать возни с Asm.
Мой процессор STM32F437ZGT, и я использую компилятор Keil uVision 5.
ИЗМЕНИТЬ:
До сих пор я пытался прокомментировать содержимое someNestedFunction()
, чтобы узнать, что именно изменяет регистр, в котором находится моя переменная. Оказывается, его задел звонок
snprintf(msg, 10, "%4.2f", value/100.0f);
Завтра проверю, не портит ли что-нибудь стек.
Изменить2:
Регистр, в котором находился previousTemperature
, все-таки был вытолкнут/вытолкнут. Я этого не заметил, т.к. в разборках использовался регистр D9, который затеняет S18 и S19. Кроме того, кажется, что value
в snprintf(msg, 10, "%4.2f", value/100.0f);
был каким-то неинициализированным мусором. После исправления previousTemperature
все время остается одним и тем же. Однако, почему это происходит, для меня загадка, и я боюсь, что истинная проблема все еще там, просто я не могу наблюдать никаких симптомов.
previosTemperature
— это не то же имя переменной, что и константа: обратите внимание на опечатку: (предыдущие против предыдущих). Я предполагаю, что это просто ошибка при копировании вашего кода в вопрос. Если вы не используете какой-либо встроенный ассемблер, то это звучит как ошибка компилятора, если вы каким-то образом не лжете компилятору. - person Peter Cordes   schedule 31.08.2016someNestedFunction
. Попробуйте комментировать его фрагменты, пока не сузите проблему до виновника (это, конечно, предполагает, что комментирование вызоваsomeNestedFunction
в первую очередь решает проблему) - person   schedule 31.08.2016const
наvolatile
меняет ситуацию? - person Serge   schedule 31.08.2016