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

 
 
> Непонятки с оптимизацией tipedef struct, компилятор игнорирует сложение при разных уровнях оптимизации
__nik__
сообщение May 4 2011, 10:46
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 52
Регистрация: 30-11-05
Из: С-Пб
Пользователь №: 11 619



Добрый день!
у меня такая проблемка образовалась, при разных уровнях оптимизации работают по разному сложения
Name = (Typ_t __farflash*)( TablModVal|0x010000L);
замена | на + результата не приносит.

все данные арсположены выше 0х10000
есть хеадер с дефаном
#define data 0x3333
#define data2 0x4444

сам макрос
использование
//GETTABLE_PTR(адрес расположения ссылки на таблицу,имя типедеф стректуры,Name)

#define GETTABLE_PTR(TablMod,Typ_t,Name) Typ_t __farflash *Name;\
Addr16_t TablModVal;\
TablModVal = * (Addr16_t __farflash*)(TablMod|0x10000L);\
Name = (Typ_t __farflash*)( TablModVal|0x010000L); <---вот тут складывает не верно вернее берет только 16бит

в результате последняя операция |0x010000L вовсе игнорируется и копируются 16 бит данных в результате старший байт абреса становится любым. это раньше работало но вот в одном месте наткнулся на вот такой глюк. если поменять оптимизацию то |0x010000L выполняется.
как данное можно сделать чтоб не зависило от уровня оптимизации, код не поместится
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sergeeff
сообщение May 5 2011, 06:57
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Для проверки:

Код
#define GETTABLE_PTR(TablMod,Typ_t,Name) do { Typ_t __farflash *Name;   \
Addr32_t TablModVal = (Addr32_t)TablMod;                                \
TablModVal |= 0x10000L; \
TablModVal = *( (Addr32_t __farflash*)(TablModVal)); \
TablModVal |= 0x10000L; \
Name = (Typ_t __farflash*)(TablModVal); \
} while (0)
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 5 2011, 09:03
Сообщение #3


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(sergeeff @ May 5 2011, 10:57) *
Для проверки:
...
Name = (Typ_t __farflash*)(TablModVal);
} while (0)

Одного слеша не хватает sm.gif


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 5 2011, 09:15
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(MrYuran @ May 5 2011, 13:03) *
Одного слеша не хватает sm.gif


Потерялся при copy/paste. Поправил.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 26th July 2025 - 06:39
Рейтинг@Mail.ru


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