artemkad 51 28 июля, 2019 Опубликовано 28 июля, 2019 · Жалоба Не подскажет ли кто как заставить 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 182 28 июля, 2019 Опубликовано 28 июля, 2019 · Жалоба 59 минут назад, artemkad сказал: Не подскажет ли кто как заставить IAR вместо выделения памяти (любой) на константы сразу использовать их значение в коде. При этот сами константы иннициализируются в отдельном Си-файле. Если константы присоединяются на этапе линковки из другого объектного файла, то они уже в памяти. В том самом объектном файле. Да и какой смысл? Вы думаете где константы в программе хранятся? В ARM-системе команд (не знаю какая у вас) например только некоторые константы могут находиться в составе команд. Да и то не всех команд. А в общем случае константы лежат в памяти рядом с кодом. Тем более если они уже скомпилены где-то из другого си-файла. Да и зачем оно вообще - какая разница Вам где они хранятся? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 51 28 июля, 2019 Опубликовано 28 июля, 2019 · Жалоба Эти константы - битовые маски. Если они компилируются в код, то от них остается только операция с одним(нужным) битом. А если они остаются в памяти, то там помимо самой памяти еще и загрузка с проверками всего лонга. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 182 28 июля, 2019 Опубликовано 28 июля, 2019 · Жалоба 3 минуты назад, artemkad сказал: Эти константы - битовые маски. Если они компилируются в код, то от них остается только операция с одним(нужным) битом. А если они остаются в памяти, то там помимо самой памяти еще и загрузка с проверками всего лонга. Тогда - только переносить их в .h. Из .obj-файла в код Вы их никак не засунете. PS: И не всякая битовая маска влезет в ARM-команду. А может также сперва грузиться отдельной LDR в регистр. Я выше уже писал об этом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 51 28 июля, 2019 Опубликовано 28 июля, 2019 · Жалоба Ну, мне сложнеепроще - у меня AVR... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 28 июля, 2019 Опубликовано 28 июля, 2019 · Жалоба Перенесите ваши константы в заголовочный файл и добавьте к ним квалификатор static. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 51 29 июля, 2019 Опубликовано 29 июля, 2019 · Жалоба 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_ - собственно сама битовая маска. Ну и приятным бонусом оказался контроль за переполнением числа бит в маске. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 182 29 июля, 2019 Опубликовано 29 июля, 2019 · Жалоба 11 минут назад, artemkad сказал: Собственно так и было изначально, но раздражало размещение рядом с ними перечисления с именами, в результате чего бесконтрольно проходили ошибки когда имя перенес, а добавить bm_ забыл. А зачем такое вообще нужно? Если просто в коде написать 1ul << bp_NAME1 - неужто сам компилятор не сможет вычислить необходимую константу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 51 29 июля, 2019 Опубликовано 29 июля, 2019 · Жалоба 15 minutes ago, jcxz said: А зачем такое вообще нужно? Если просто в коде написать 1ul << bp_NAME1 - неужто сам компилятор не сможет вычислить необходимую константу? В коде для компилятора 1ul<<bp_NAME1 и просто bp_NAME1 равнозначны т.е. не вызывают каких либо сообщений, а значит приходим к исходной проблеме "имя перенес, а добавить bm_ забыл" только теперь забыл добавить 1ul<< . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 182 29 июля, 2019 Опубликовано 29 июля, 2019 · Жалоба 13 минут назад, artemkad сказал: В коде для компилятора 1ul<<bp_NAME1 и просто bp_NAME1 равнозначны т.е. не вызывают каких либо сообщений, а значит приходим к исходной проблеме "имя перенес, а добавить bm_ забыл" только теперь забыл добавить 1ul<< . Это уже паранойя. А не боитесь, что в другом месте программы забудете 1 << или ещё чего-нить? Или что вместо NAME1 напишете NAME2? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 51 29 июля, 2019 Опубликовано 29 июля, 2019 · Жалоба 1 hour ago, jcxz said: Это уже паранойя. А не боитесь, что в другом месте программы забудете 1 << или ещё чего-нить? Или что вместо NAME1 напишете NAME2? Забыть(ничего не делать) проще чем что-то сделать намеренно. Да и в реальности у меня, естественно, более вменяемые названия чем NAMEx. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться