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

 
 
> Последовательность вызова конструкторов, глобальных объектов при инициализации (ARM)
Andy Mozzhevilov
сообщение Sep 23 2010, 07:33
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Вопрос, можно ли как-то средствами расширения языка, а также параметрами и скриптами линкера (IAR ARM 5.xx) задать посделовательность инициализации (вызовов конструкторов) глобальных объектов?
То есть, например:
Код
class TSlon
{
....
};

class TMamont
{
....
};

TSlon    Slon;   // Этот объект должен быть инициализирован первым при запуске
TMamont  Mamont; // Этот объект должен быть инициализирован вторым при запуске



--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Dima_G
сообщение Sep 23 2010, 09:23
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



В свое время отказался от раздумий по очередности вызова конструкторов глобальных объектов.
Сейчас использую следующую схему:
1) Собственно сам конструктор
2) Этап Init()
3) Этам Run()

В самом конструкторе объект ведет себя изолированно от внешнего мира. Категорически не допускается взаимодействия с другими объектами (они у меня зачастую в другой единицы трансляции)
На этапе Init() происходит "налаживание связей" между объектами (обмен информацией, финальная инициализация и тд). На этапе Run() запускаются таски, включаются прерывания и тд.
Этапы Init и Run запускаются из main, что гарантирует создание глобальных объектов к этому моменту.

Код
///@function main()
///Main function
int main()
{
  * * *
  ClSystemService::Instance()->InitServices();
  ClSystemService::Instance()->RunServices();
  * * *
}


Либо возможен другой вариант: использование паттерна Singleton. Тогда обращение к объекту будет гарантировать его наличие smile.gif
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Sep 23 2010, 14:17
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(Dima_G @ Sep 23 2010, 13:23) *
На этапе Init() происходит "налаживание связей" между объектами (обмен информацией, финальная инициализация и тд).

Вызывать отдельно Инит для каждого объекта - это надо не забыть об этом.
Иногда (и зачастую) объект создается просто глобально, а потом живет своей жизнью. Дополнительные init и run - потенциальная возможность забыть их сделать, соответственно допустить ошибку, которую потом возможно будет трудно поймать.
Объект, который мне нужно заинитить первым - он один в системе.
Точнее нужно вызвать инициализацию ОС, чтобы в конструкторах всех глобальных объектов можно было использовать функции ОС по созданию сервисов (семафоров, очередей и т.п.). Иначе нужно разносить в каждом классе создание объекта и его инициализацию - это достаточно трудоемко.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post



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

 


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


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