реклама на сайте
подробности

 
 
> Странности при вычислении значений!
Sergio66
сообщение Jan 16 2013, 06:29
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Добрый день!
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 просто не возможны). Кстати, она глобальная! И в функции имеет правильное значение...

При вычислении 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 стала возвращать неверное значение. Вычисляет его правильно, а возвращает - нет!!!
Посмотрел как происходит возврат - оказалось, что Func при выходе помещает результат в R16, а вызывавшая функция принимает его в R24!!!
Стоило чуть изменить тело Func, как все встало на свои места. Изменения коснулись некоторой смены порядка выполняемых операций...

Использую
IAR C/C++ Compiler for AVR
6.11.1 (6.11.1.50453)

Может кто нибудь прокомментировать?
Больше всего интересует п.1., т.к. не знаешь, чего ждать от программы, если не понятен механизм образования мусора...

Сообщение отредактировал IgorKossak - Jan 16 2013, 07:29
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th August 2025 - 14:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01337 секунд с 7
ELECTRONIX ©2004-2016