Email or username:

Password:

Forgot your password?
Данила Горелко

Программирование микроконтроллеров -- это весело.

Чистишь флеш.
Запускаешь прошивку.
Внезапно обнаруживаешь, что значение, переданное в функцию по указателю, не меняется после исполнения функции.

Изменяешь struct->value = x на (*struct).value = x. Авось, есть разница.
Теперь работает.
А?

Снова чистишь флеш.
Запускаешь прошивку.
Работает.
Так, хорошо.

Возвращаешь, как было, на православное "->".
Оно тоже, сука, работает.
Снова или уже.

ЧИВО?

4 comments
[DATA EXPUNGED]
Григорий Клюшников

В таких ситуациях надо скомпилировать без оптимизаций (-O0) и проверить поведение. Вполне может быть, что компилятор думает, что некоторые из твоих операций бессмысленны, потому что не влияют ни на что снаружи, и просто их удаляет. Например, если ты пишешь в какой-нибудь регистр, замапленный на память, то указатель, через который ты это делаешь, надо объявить со словом volatile, чтобы компилятор понимал, что это ты не просто байты туда-сюда перекладываешь.

Ещё, конечно, помогает дизассемблировать и посмотреть что оно там делает на самом деле.

В таких ситуациях надо скомпилировать без оптимизаций (-O0) и проверить поведение. Вполне может быть, что компилятор думает, что некоторые из твоих операций бессмысленны, потому что не влияют ни на что снаружи, и просто их удаляет. Например, если ты пишешь в какой-нибудь регистр, замапленный на память, то указатель, через который ты это делаешь, надо объявить со словом volatile, чтобы компилятор понимал, что это ты не просто байты туда-сюда перекладываешь.

Данила Горелко

Григорий, ох уж эти вечные проблемы дебаг и релиз версий)

Go Up