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

 
 
> уникальный идентификатор, как при помощи макросов сформировать уникальный идентификатор
ARV
сообщение Mar 27 2009, 11:50
Сообщение #1


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

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



собственно, вместо многократного повторения __attribute__ ((naked, section(".init7"))) для разных функций типа void foo(void) в разных файлах хочу сделать какой-то макрос, который сам бы это дело дописал перед каким-то автоматически сгенерированным идентификатором. в общем, пишем:
Код
initialize{тут код начальной инициализации}
а получаем фактически что-то типа
Код
__attribute__ ((naked, section(".init7"))) void _name120097553(void){nen код начальной инициализации}


подскажите, как сделать? ничего путнего не получается... проблема в формировании уникального идентификатора....


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
demiurg_spb
сообщение Mar 27 2009, 23:38
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



А для чего, простите, весь сыр-бор. Чтобы лишь автоматизировать инициализацию какого-либо программного модуля?
Если так, то Вы ребята далеко ушли от программирования на С. Что неужели трудно явно вызывать процедуру инициализации? А как быть с расстановкой очерёдности инициализации разных модулей? С простотой портирования? С наглядностью наконец? На мой взгляд происходит подмена понятия программирования. Извините, но хочется понять глубинный смысл сего явления. Ответ типа: мне удобно т.к. я догадался до такого "извращения" - не то, что хочется услышатьsmile.gif Я сторонник глубинного понимания языка программирования, а не фишек линкера и прочего инструментария, входящего в комплект поставки компилятора. Да это знать и понимать тоже нужно, но использовать так... Уж если считаете, что Вам стал жать С используйте С++ с его конструкторами и деструкторами, шаблонами и всем-всем остальным что Вам будет нужно. Так будет честнее. ИМХО.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Mar 28 2009, 16:50
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(demiurg_spb @ Mar 28 2009, 01:38) *
А как быть с расстановкой очерёдности инициализации разных модулей?
...
Уж если считаете, что Вам стал жать С используйте С++ с его конструкторами и деструкторами,
А что, очерёдность вызовов конструкторов (т.е. инициализации) статических объектов из разных модулей в С++ будет определена?

И неужели Вы думаете, что при наличии функции init_XXX(), которая может вызываться по ходу программы в разных местах кто-то будет дублировать её тело в init-блоке? Хотя можно её вызов вставить в
Код
INIT(8) { init_XXX(); }
:-)
Cам подход "подключили модуль - он автоматически проинициализируется по умолчанию" имеет право на жизнь, у того же борланда это делалось через #pragma startup/#pragma exit.
И дело не только в экономии нескольких байт и тактов, но и в автоматизации того, что можно и нужно автоматизировать, а не нагружать себя самого созданием нагромождения вызовов init_XXX() в начале функции main() (заодно явно видно, какие инициализации терпят перестановку местами, а уж то, что осталось в виде init_XXX() - обкомментировать как и почему оставлено и в каком порядке должно вызываться, если это важно).

Ну и кроме того случаи бывают разные, например, может захотеться у той же меги64 или 162 внешнюю память сделать продолжением внутренней и "без дырок" - стек разместить в конце внешней памяти (да, будет работать несколько медленнее, "ну и что"). Тогда включить внешнюю шину надо до первого вызова, даже в С++ с его конструкторами. Вот тогда фрагмент комментария из темы по ссылке выше как раз и поможет.
Код
*  INIT_CODE(1)
*  {
*    MCUCR = (1 << SRE);
*    XMCRA = (4 << SRL0) | (0 << SRW00);
*    XMCRB = (1 << XMBK);
*  }
static inline тут не поможет.

Я таким образом настраиваю всякие таймерные и не только прерывания - рядом с обработчиком ISR() и (если они есть) функциями доступа к разделяемым с прерываниям данными торчит INIT(8), который это всё хозяйство инициализирует. Пусть он себе "вызывается" автоматичекски.
Рассматривайте этот метод как расширение возможностей start-up-модуля, но без модификации его текста (чем этот метод и является) и станет понятно, когда его удобно и "правильно" применять.
start-up-модуль занимается подготовкй окружения для функции main() (можно було бы ведь в начале функции main() вызывать библиотечные функции clear_bss(); init_initialized_data(); - Вы же не боретесь за право это делать? ) для общго случая, а код в отданных программисту секциях .init1/3/5/7/8 уточняет это для данной конкретной программы.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Mar 28 2009, 18:54
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



ReAl, искреннее Вам спасибо! Всё разложили по полочкам!
Так действительно может оказаться нагляднее и удобнее, нежели править startup.S, чем я обычно и занимался по мере необходимости.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Mar 28 2009, 20:56
Сообщение #5


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(demiurg_spb @ Mar 28 2009, 20:54) *
Так действительно может оказаться нагляднее и удобнее, нежели править startup.S
И отдельное спасибо авторам за раскладку секций:
Код
*  .init0  Start here after reset.
*  .init1
*  .init2  Clear __zero_reg__, set up stack pointer.
*  .init3
*  .init4  Initialize data and BSS.
*  .init5
*  .init6  C++ constructors.
*  .init7
*  .init8
*  .init9  Call main()
Имеем достаточно мелкую "нарезку" для того, чтобы подсунуть своё именно на нужном этапе.
Да, с init1 надо осторожно, если встречается что-то в духе
MCUSR = 0;
то это надо делать в init3, так как оно будет скомпилировано отправкой в SFR регистра r1, а он обнуляется в init2.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 30 2009, 06:24
Сообщение #6


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(ReAl @ Mar 28 2009, 23:56) *
Да, с init1 надо осторожно

Я вот тоже не правлю стартап, но в секциях init* пишу асмовый код. На всякий случай, вдруг концепция измениццо smile.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ARV   уникальный идентификатор   Mar 27 2009, 11:50
- - _Pasha   Цитата(ARV @ Mar 27 2009, 15:50) подскажи...   Mar 27 2009, 12:17
|- - ARV   Цитата(_Pasha @ Mar 27 2009, 15:17) Если ...   Mar 27 2009, 12:22
|- - solosh   Попробуйте для создания уникальных имен использова...   Mar 27 2009, 13:07
|- - ARV   Цитата(solosh @ Mar 27 2009, 16:07) Попро...   Mar 27 2009, 13:24
|- - solosh   Нужен еще один проход препроцессора. Вот как раз В...   Mar 27 2009, 14:16
||- - ARV   Цитата(solosh @ Mar 27 2009, 17:16) Нужен...   Mar 27 2009, 19:31
||- - ReAl   Цитата(ARV @ Mar 27 2009, 21:31) она искл...   Mar 27 2009, 19:45
|- - Petka   Цитата(ARV @ Mar 27 2009, 16:24) так вот ...   Mar 27 2009, 14:25
|- - Сергей Борщ   Цитата(demiurg_spb @ Mar 28 2009, 01:38) ...   Mar 28 2009, 08:57
||- - demiurg_spb   Цитата(Сергей Борщ @ Mar 28 2009, 11:57) ...   Mar 28 2009, 10:41
|- - ARV   Цитата(ReAl @ Mar 29 2009, 00:56) И отдел...   Mar 30 2009, 05:02
||- - ReAl   Цитата(ARV @ Mar 30 2009, 08:02) дык в до...   Mar 30 2009, 13:05
- - ARV   2 demiurg_spb: спасибо, уже не надо, тем более, чт...   Mar 28 2009, 13:14
- - demiurg_spb   Да тут есть свой прикол. Я даже использую это в та...   Mar 28 2009, 13:43
- - _Pasha   Цитата(demiurg_spb @ Mar 28 2009, 17:43) ...   Mar 28 2009, 14:12
- - KRS   Цитата(demiurg_spb @ Mar 28 2009, 17:43) ...   Mar 30 2009, 22:19


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 02:20
Рейтинг@Mail.ru


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