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

 
 
> Странности при вычислении значений!
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
 
Start new topic
Ответов
prottoss
сообщение Jan 16 2013, 09:13
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Sergio66 @ Jan 16 2013, 12:29) *
По контексту Next_Data_Area_Address не может занимать в памяти более 3 байт. (Ну значения больше 0x0fff просто не возможны). Кстати, она глобальная! И в функции имеет правильное значение...
Вообще то в памяти она занимает 4 байта - т.к. базовый тип - UINT32

Цитата(Sergio66 @ Jan 16 2013, 12:29) *
Посмотрел как происходит возврат - оказалось, что Func при выходе помещает результат в R16, а вызывавшая функция принимает его в R24!!!
...
Использую
IAR C/C++ Compiler for AVR
6.11.1 (6.11.1.50453)
Функция обязана возвращать результат в R16, только если компилятор ее не оптимизировал и не заинлайнил sm.gif, и вызывающая функция, если вызываемая функция не заинлайнина, примет результат в R16, в противном случае вполне возможно что как раз из R24.

Почитайте FUNCTION ENTRANCE в мануале на компилятор.


--------------------
Go to the top of the page
 
+Quote Post



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

 


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


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