1.
Столкнулся с такой странностью, выглядит примерно так:
Код
typedef UINT32 flash_address_t;
flash_address_t Next_Data_Area_Address;
#define IF_PAGE_SIZE 264
void Func(void)
{
flash_address_t PageNum , PageOffs;
PageNum = Next_Data_Area_Address / IF_PAGE_SIZE;
PageOffs =Next_Data_Area_Address % IF_PAGE_SIZE;
....
}
По контексту Next_Data_Area_Address не может занимать в памяти более 3 байт. (Ну значения больше 0x0fff просто не возможны). Кстати, она глобальная! И в функции имеет правильное значение...flash_address_t Next_Data_Area_Address;
#define IF_PAGE_SIZE 264
void Func(void)
{
flash_address_t PageNum , PageOffs;
PageNum = Next_Data_Area_Address / IF_PAGE_SIZE;
PageOffs =Next_Data_Area_Address % IF_PAGE_SIZE;
....
}
При вычислении PageNum и PageOffs присутствует "мусор" в старшем байте!!!
Вылечилось таким объявлением:
volatile flash_address_t PageNum = 0, PageOffs = 0;
Включена опция полной оптимизации по размеру кода.
2.
Второй интересный случай -
Код
char Func(char a)
{
...
}
void Func_1(void)
{
char a,b;
a=0;
b=Func(a);
}
обратил внимание. что с некоторых пор функция Func стала возвращать неверное значение. Вычисляет его правильно, а возвращает - нет!!!{
...
}
void Func_1(void)
{
char a,b;
a=0;
b=Func(a);
}
Посмотрел как происходит возврат - оказалось, что Func при выходе помещает результат в R16, а вызывавшая функция принимает его в R24!!!
Стоило чуть изменить тело Func, как все встало на свои места. Изменения коснулись некоторой смены порядка выполняемых операций...
Использую
IAR C/C++ Compiler for AVR
6.11.1 (6.11.1.50453)
Может кто нибудь прокомментировать?
Больше всего интересует п.1., т.к. не знаешь, чего ждать от программы, если не понятен механизм образования мусора...