Перейти к содержанию
    

Оптимизация констант.

Не подскажет ли кто как заставить IAR вместо выделения памяти (любой) на константы сразу использовать их значение в коде. 

 

При этот сами константы иннициализируются в отдельном Си-файле.

U32 const bm_INPUT_DRIVER_TRUNK = ((long)1<<INPUT_DRIVER_TRUNK);	

И объявляются в хеадере:

extern U32 const bm_INPUT_DRIVER_TRUNK;	

подключаемом к файлам в котором они используются:

ЗЫ. Вытаскивать иннициализацию из Си-шного файла нельзя(значение которым иннициализируется константа берутся в этом файле и вытаскивать их оттуда наружу нельзя), замена на  #define малоперспективна т.к. константы сами формируются автоматом из другого файла через  #define,  Multi file compilation использовать крайне не хочется потому как надо перебирать под него кучу кода в других в т.ч. не моих файлах.

PPS. Что-бы было понятней, пожалуй приведу текущее содержимое:

State.c

 #include "State.h"

#define EVENT_EVENTS

#define msg_EVENT(name)  name,	 
enum events_status   {
#include "events_list.h"
};
#undef msg_EVENT

#define msg_EVENT(name)    U32 const bm_##name = ((long)1<<name);
 
#include "events_list.h"

#undef msg_EVENT

#undef EVENT_EVENTS		

State.h

#define EVENT_EVENTS						///

#define msg_EVENT(name)  extern  U32 const bm_##name;
 
#include "events_list.h"

#undef msg_EVENT

#undef EVENT_EVENTS							///

Ну и впомогательный events_list.h

#ifdef	EVENT_EVENTS

msg_EVENT(EVENT_1)	  
msg_EVENT(EVENT_2)  
msg_EVENT(EVENT_3)	  
msg_EVENT(EVENT_4)	  
msg_EVENT(EVENT_5)	  

#endif

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

59 минут назад, artemkad сказал:

Не подскажет ли кто как заставить IAR вместо выделения памяти (любой) на константы сразу использовать их значение в коде.

При этот сами константы иннициализируются в отдельном Си-файле.

Если константы присоединяются на этапе линковки из другого объектного файла, то они уже в памяти. В том самом объектном файле.

Да и какой смысл? Вы думаете где константы в программе хранятся? В ARM-системе команд (не знаю какая у вас) например только некоторые константы могут находиться в составе команд. Да и то не всех команд. А в общем случае константы лежат в памяти рядом с кодом. Тем более если они уже скомпилены где-то из другого си-файла.

Да и зачем оно вообще - какая разница Вам где они хранятся?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эти константы - битовые маски. Если они компилируются в код, то от них остается только операция с одним(нужным) битом. А если они остаются в памяти, то там помимо самой памяти еще и загрузка с проверками всего лонга.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, artemkad сказал:

Эти константы - битовые маски. Если они компилируются в код, то от них остается только операция с одним(нужным) битом. А если они остаются в памяти, то там помимо самой памяти еще и загрузка с проверками всего лонга.

Тогда - только переносить их в .h. Из .obj-файла в код Вы их никак не засунете.

 

PS: И не всякая битовая маска влезет в ARM-команду. А может также сперва грузиться отдельной LDR в регистр. Я выше уже писал об этом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Перенесите ваши константы в заголовочный файл и добавьте к ним квалификатор static.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, Сергей Борщ said:

Перенесите ваши константы в заголовочный файл и добавьте к ним квалификатор static.

Ну, в конечном итоге я так и сделал. Собственно так и было изначально, но раздражало размещение рядом с ними перечисления с именами, в результате чего бесконтрольно проходили ошибки когда имя перенес, а добавить bm_ забыл. Использование сишного файла нужно было именно для скрытия исходных имен взятых из enum от остального кода. Конечный результат выглядит примерно так:

State.h

#define EVENT_EVENTS(name)  bp_##name,	 
enum  {
#include "events_list.h"
};
#undef EVENT_EVENTS

#define EVENT_EVENTS(name)  static  U32 const bm_##name = ((long)1<<bp_##name);
 
#include "events_list.h"

#undef EVENT_EVENTS

 Вспомогательный events_list.h

#ifdef	EVENT_EVENTS

EVENT_EVENTS(NAME1)	  
EVENT_EVENTS(NAME2)  
EVENT_EVENTS(NAME3)	  
EVENT_EVENTS(NAME4)	  
EVENT_EVENTS(NAME5)	  
EVENT_EVENTS(NAME6)	  
EVENT_EVENTS(NAME7)  

#endif

Итого, State.h из файла с перечисленными именами битов создает два набора констант. Один набор с добавлением bp_ - номер позиции, второй в добавлением bm_  - собственно сама битовая маска. Ну и приятным бонусом оказался контроль за переполнением числа бит в маске.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, artemkad сказал:

Собственно так и было изначально, но раздражало размещение рядом с ними перечисления с именами, в результате чего бесконтрольно проходили ошибки когда имя перенес, а добавить bm_ забыл.

А зачем такое вообще нужно? Если просто в коде написать 1ul << bp_NAME1 - неужто сам компилятор не сможет вычислить необходимую константу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 minutes ago, jcxz said:

А зачем такое вообще нужно? Если просто в коде написать 1ul << bp_NAME1 - неужто сам компилятор не сможет вычислить необходимую константу?

В коде для компилятора 1ul<<bp_NAME1 и просто bp_NAME1 равнозначны т.е. не вызывают каких либо сообщений, а значит приходим к исходной проблеме "имя перенес, а добавить bm_ забыл" только теперь забыл добавить 1ul<< . 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, artemkad сказал:

В коде для компилятора 1ul<<bp_NAME1 и просто bp_NAME1 равнозначны т.е. не вызывают каких либо сообщений, а значит приходим к исходной проблеме "имя перенес, а добавить bm_ забыл" только теперь забыл добавить 1ul<< . 

Это уже паранойя.

А не боитесь, что в другом месте программы забудете 1 << или ещё чего-нить? Или что вместо NAME1 напишете NAME2?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jcxz said:

Это уже паранойя.

А не боитесь, что в другом месте программы забудете 1 << или ещё чего-нить? Или что вместо NAME1 напишете NAME2?

Забыть(ничего не делать) проще чем что-то сделать намеренно. Да и в реальности у меня, естественно, более вменяемые названия чем NAMEx.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...