Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Непонятки с оптимизацией tipedef struct
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
__nik__
Добрый день!
у меня такая проблемка образовалась, при разных уровнях оптимизации работают по разному сложения
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 выполняется.
как данное можно сделать чтоб не зависило от уровня оптимизации, код не поместится
jorikdima
TablModVal вероятно 16 битный. Вот он и не осознает как можно сделать "или" с 16 битовым числом и числом более 16 бит.
SysRq
ULL?
__nik__
TablModVal замена на 32 ничего не меняет.
появилось предположение что иар оптимизирует по длинне используемых данных
sergeeff
А каков sizeof(Typ_t __farflash*)?
MrYuran
Замечание по ходу:
Никогда не пишите так макросы.
Можно ненароком наколоться, например:
if(...) GETTABLE_PTR(...);

Обычно для макросов используют скобки do{...}while(0)
sergeeff
Для проверки:

Код
#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)
MrYuran
Цитата(sergeeff @ May 5 2011, 10:57) *
Для проверки:
...
Name = (Typ_t __farflash*)(TablModVal);
} while (0)

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


Потерялся при copy/paste. Поправил.
__nik__
Цитата(MrYuran @ May 5 2011, 10:42) *
Замечание по ходу:
Никогда не пишите так макросы.
Можно ненароком наколоться, например:
if(...) GETTABLE_PTR(...);

Обычно для макросов используют скобки do{...}while(0)


IAR не принимает ( помоему он вообще весьма болезненно относится к {} В дефайнах
MrYuran
Цитата(__nik__ @ May 5 2011, 17:12) *
IAR не принимает ( помоему он вообще весьма болезненно относится к {} В дефайнах

Не его собачье дело, обязан.
Это общепринятая методика.
Чего хоть пишет-то?

Вот, у меня работает:
#define DyrgNogoy2 do{P3OUT |= 1; P3OUT &= ~1;}while(0)
IAR для MSP430
__nik__
Цитата(MrYuran @ May 5 2011, 17:24) *
Не его собачье дело, обязан.
Это общепринятая методика.
Чего хоть пишет-то?

Вот, у меня работает:
#define DyrgNogoy2 do{P3OUT |= 1; P3OUT &= ~1;}while(0)
IAR для MSP430

у меня на такое ругатеся, разбивание действия не помогает. всетаки думаю связано с оптимизацией
все приводит к тому что возвращается или используется.
пока что так и не смог его победить (
даже большеесть две одинаковые ппрограмки, в одном месте считает верно и все работает в другом все наоборот

void activate_out(uchar number)
{
GETTABLE_PTR(CfgSFBModul,SFBSetings_t,SFBSet);
if(number > 2) return;
number--;
outs_state2bus[number].norm=0; outs_state2bus[number].active=1;
if(SFBSet->outs_flags[number]&0x01) // вот тут адрес SFBSet = 0х003BCE
{
switch(number)
...

void deactivate_out(uchar number)
{
GETTABLE_PTR(CfgSFBModul,SFBSetings_t,SFBSet);
if(number > 2) return;
number--;
outs_state2bus[number].norm=1; outs_state2bus[number].active=0;
if(SFBSet->outs_flags[number]&0x01) // вот тут адрес SFBSet = 0х013BCE как и должен быть
{
switch(number)
{
...
после многоточий код совпадает на 100% еще раз наткнулся на теже грабли в другом месте,
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.