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

 
 
13 страниц V  « < 7 8 9 10 11 > »   
Reply to this topicStart new topic
> Как писать на С++ при создание приложений под ARM, Примеры
AHTOXA
сообщение Dec 13 2011, 03:14
Сообщение #121


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(brag @ Dec 13 2011, 08:27) *
Уже писал, одновременный вызов static T& instance() { static T Instance;
даст гонки!
вернее захочет это предотвратить и попытается вызвать __cxa_guard_acquire, которая должна в свою очередь обработать это дело (это что касается gcc).
если даже мы ее реализуем, то мютекс не всегда можно создавать, вдруг мы instance() вызовем до того, как можно создавать мютексы?
или еще хуже - вызовем из прерывания, где вообще запрещены всякие блокировки и синхронизация там происходит совсем по другим принцыпам?

Какие нафиг мутексы? Зачем они там? Элементарный флаг:
Код
int __cxa_guard_acquire(__guard *g) {return !*(char *)(g);}
void __cxa_guard_release (__guard *g) {*(char *)g = 1;}

И никаких гонок.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
brag
сообщение Dec 13 2011, 03:18
Сообщение #122


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

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Цитата
Какие нафиг мутексы? Зачем они там? Элементарный флаг:
Код
int __cxa_guard_acquire(__guard *g) {return !*(char *)(g);}
void __cxa_guard_release (__guard *g) {*(char *)g = 1;}

И никаких гонок.

че то я там не увидел, каким образом *g становится 0.
Процитирую еще раз:
Цитата
extern "C" int __cxa_guard_acquire(int *guard_object);
If the guarded object has not yet been initialized, this function returns 1. Otherwise it returns 0.

Go to the top of the page
 
+Quote Post
dxp
сообщение Dec 13 2011, 03:25
Сообщение #123


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(brag @ Dec 13 2011, 09:45) *
Критическая секция, в смысле запрет прерываний? ессли да, то в моем случаи,на пример, этого делать нельзя. прерывания разрешены всегда, еще где-то с начала старта ОС.
а то этим термином много чего называют...

Да, имелся в виду именно лок прерываний. Но там же он очень короткий - всего несколько инструкций. Мутекс-то всяко потолще будет.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 13 2011, 03:27
Сообщение #124


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(brag @ Dec 13 2011, 09:18) *
че то я там не увидел, каким образом *g становится 0.

Он изначально инициализирован нулём.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
brag
сообщение Dec 13 2011, 03:32
Сообщение #125


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

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Цитата
Да, имелся в виду именно лок прерываний. Но там же он очень короткий - всего несколько инструкций. Мутекс-то всяко потолще будет.

Потолще онозначно, но на конкретной архитектуре в конкретном месте может быть совсем по другому.
Кроме того, что религия не позволяет запрещать прерывания, может не позволить и проц, скажем в cortex-m3 в thread unprivileged mode этого делать нельзя, вывалимся в UsageFault
Там рулит lock-free конструкция из ldrex/strex, надо будет подумать, как ее можно универсально туда приаттачить...

Цитата
Он изначально инициализирован нулём.

Ну ок.
1. Допуситм g=0;
2. тогда наш return !*(char *)(g); вернет 1
3. тогда, в соответствии "If the guarded object has not yet been initialized", (см Page 19 of 24 ARM IHI 0041C, там даже кусок кода приведен, как и когда вызывается __cxa_guard_acquire) запустится конструктор.
В это время же время сменился тред и эта хрень выполнится опять начиная с пункта 1 и что в итоге будет?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 13 2011, 04:01
Сообщение #126


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(brag @ Dec 13 2011, 09:32) *
Ну ок.
1. Допуситм g=0;
2. тогда наш return !*(char *)(g); вернет 1
3. тогда, в соответствии "If the guarded object has not yet been initialized", (см Page 19 of 24 ARM IHI 0041C, там даже кусок кода приведен, как и когда вызывается __cxa_guard_acquire) запустится конструктор.
В это время же время сменился тред и эта хрень выполнится опять начиная с пункта 1 и что в итоге будет?

Второй тред сначала проверяет первый байт гуарда на равенство нулю. Если не ноль (а у нас уже не ноль), то объект считается инициализированным.
То есть, если поток прервётся до завершения инициализации, то будет бякаsm.gif Поэтому при таком подходе инициализацию желательно выполнять из одного, наиболее приоритетного потока.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
brag
сообщение Dec 13 2011, 04:11
Сообщение #127


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

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



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

Почему это не 0? конструктор запущен, void __cxa_guard_release (__guard *g) {*(char *)g = 1;} еще не вызван . распишите плиз алгоритм а то я чет наврное вас не понял...

Цитата
То есть, если поток прервётся до завершения инициализации, то будет бяка Поэтому при таком подходе инициализацию желательно выполнять из одного, наиболее приоритетного потока.

Тоесть вы предлагаете делать вызов getInstance() из другого приоритетного потока? Представляете сколько у вас уйдет времени на синхронизацию этого дела?

Вообще синхронизация - такая штука, что надо продумывать чуть ли не каждую ассемблерную инструкцию на выходе. Времени очень много занимает, чтобы сделать действительно качественный код без гонок. тестирование здесь не катит. глюк может вылесть спустя годы и натворить большой беды sm.gif
Лучше 1 раз продумать типовые конструкци и потом юзать, чем каждый раз парицца.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 13 2011, 04:52
Сообщение #128


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(brag @ Dec 13 2011, 10:11) *
Почему это не 0? конструктор запущен, void __cxa_guard_release (__guard *g) {*(char *)g = 1;} еще не вызван . распишите плиз алгоритм а то я чет наврное вас не понял...

Да, я неверно описал. Это у нас как раз получается флаг завершения инициализации.
Цитата(brag @ Dec 13 2011, 10:11) *
Тоесть вы предлагаете делать вызов getInstance() из другого приоритетного потока?

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
brag
сообщение Dec 13 2011, 05:02
Сообщение #129


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

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



в случаи вашего кода какраз в getInstance() компилятором автоматически встраивается код инициализации static Driver instance;
и для защиты его какраз применяются __cxa_guard
собсно эти guard можно реализовать на основе семафора, запрета прерываний, а можно при поддержке архитектуры на всяких хитрых lock-free конструкциях
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 13 2011, 05:20
Сообщение #130


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Да, я знаю этоsm.gif
А ещё я знаю, что перед тем, как вызвать __cxa_guard_acquire(), gcc проверяет первый байт гуарда. И если он не ноль, то объект считается инициализированным. И именно на этом факте основано то решение, которое я привёл.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Forger
сообщение Dec 13 2011, 08:55
Сообщение #131


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

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(brag @ Dec 13 2011, 05:51) *
Легко. Через интерфейсы. А выбор интерфейса где-то предусмотреть.
А экземпляр обьекта TCP создавать непосредственно перед использованием, к стати и тут может происходить выбор интерфейса.

Т.е. в стеке. А если этот класс имеет массу полей, т.е. немалый размер и толстый конструктор.
Что-то как-то громоздков выходит - каждый раз создавать и удалять объект, с которым это нужно проделывать всего один раз.
Я к чему такие вопросы задавал - наводил на мысль иерархически выстроенного проекта, в котором нет ни одного статического поля, а все классы кому-либо пренадлежат. Т.е. нет ни одного "бесхозного" объекта.

Цитата
Наверное заметили некое сходство с Qt... sm.gif Да, некоторые идеи я передрал с докуминтации Qt wink.gif

Идеи Qt дает интересные, но она изначально ориентирована на кучу.
А чтобы приучить ее к статике - нужно изрядно попотеть, а смысл?
Т.е. в эмбеддерских делах пока ей, по-моему, пока нет места.

Цитата
Нет, вы немного не поняли. Кто лочить будет static Driver instance; ?
Ведь вызватся функция static Driver& Instanse() может одновременно, когда обьект instance еще не создан.
Один тред вызвал Instanse(), та запустила конструктор для instance (тк instance еще не создан) и тут процесс посреди конструктора прервался и кто-то другой опять вызвал Instanse() и ...и сами понимаете что sm.gif
Ведь процесс создания instance мы никак не контроллируем...

Поэтому должен быть строгий порядок создания объектов и их отложенной инициализации, есть она предусмотрена.
Синглтоном может быть, например, сама OS. Она по-любому одна в проекте.
И вообще, синглтон, по-моему, это некий костыль, т.к. выглядит как-то не очень стройно и красиво.
Но без них порой никак - иначе страдает читаемость кода.

Цитата
Это процесс создания окошек. А реализация уже в других файлах. в будущем вообще этот код будет софтиной-дизайнером генерится( типа как в Qt sm.gif ).

Я тоже что-то подобное планирую для своей реализации CANopen на чистом С++.
В частности все пользовательские объекты словаря создаются исходя из содержимого EDS-файла.
В коде остается лишь реализовать методы этих объектов, привязав их к конкретномы требованиям девайса.

Цитата
Согласитесь, создание графических обьектов где-попало в коде в разных файлах приведет к еще хужему хаоссу sm.gif

Да, разумеется, должна существовать некая строгая иерархия - кто что может и кто кем владеет.

Цитата
Ну всякие там MessageBox-ы и диалоги ессно создаются в стеке когда это нужно, эти массивы надо только для построения основного ui.

Вот себе и противоречите - это ж опять костыль, в коде их не должно быть - все нужно прятатять в глубине самого gui.
А GUI нужно только указать ссылку на экзэмпляр OS и драйвер экрана. Что-то типа того.
Программер, который юзает гуи не должен думать о том, где чего создать в стеке и как обезапасить код.
Это все должно быть сделано и отлажено один раз - в гуи.

Короче, вот что я предлагал и предлагаю:
http://electronix.ru/forum/lofiversion/index.php/t82244.html
Правда, щас немного по-ловчее и лаконичнее, но в целом такая конструкция кода работает на ура.



--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
brag
сообщение Dec 13 2011, 12:39
Сообщение #132


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

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Цитата
Т.е. в стеке. А если этот класс имеет массу полей, т.е. немалый размер и толстый конструктор.

Все зависит от конкретной ситуации... стандартного решения "под онду мерку" нету

Цитата
Идеи Qt дает интересные, но она изначально ориентирована на кучу.А чтобы приучить ее к статике - нужно изрядно попотеть, а смысл?
Т.е. в эмбеддерских делах пока ей, по-моему, пока нет места.

Ну мы их и переориентировали на arm sm.gif код то свой, содраны только части названий и некоторые идеи

Цитата
Синглтоном может быть, например, сама OS.

Она довольно раздутая в плане обхвата, там своя организация...

Цитата
Это все должно быть сделано и отлажено один раз - в гуи.

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

Go to the top of the page
 
+Quote Post
brag
сообщение Mar 2 2012, 05:20
Сообщение #133


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

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Наткнулся на такой прикол (скорее всего из за незнания C++ sm.gif)
Код
MsgBox box(0,"Writing...");box.show();
.....
box.close();
box=MsgBox(0,"OK");box.show()

Я думал box=MsgBox(0,"OK"); работает аналогично delete box;box=new MsgBox(0,"OK"); только без выделения памяти, используя стековую переменную.
А оказалось оно создает новый MsgBox(0,"OK"); при чем не удаляя старого, тупо копирует из него все данные в box, а потом удаляет этот временный MsgBox(0,"OK");
В итоге при создании MsgBox он становится во всякие системные очереди итп(используя указатель this), затем сразу же после копирования удалятся из всяких очередей. А вот копия уже нерабочая - все указатели были на временный обьект, а не на реальный box, к тому же обьект вообще считается удален, тк был вызван деструктор. Ну и старый обьект вообще затертый, но не удаленный, тк для него небыл вызван деструктор
Код
new box
Widget(): 00007EEC
Widget(): 00007E5C
~Widget(): 00007E5C
Widget()::show(00007EEC)

Вобщем я пришел к выводу, что так делать нельзя, а запариватся с перегрузкой оператора = тоже влом
Go to the top of the page
 
+Quote Post
neiver
сообщение Mar 2 2012, 08:38
Сообщение #134


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



В данном случае, лучше вообще запретить копирование - сделать конструктор копирования и оператор присваивания закрытыми и без реализации.
Go to the top of the page
 
+Quote Post
brag
сообщение Mar 2 2012, 11:43
Сообщение #135


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

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Да вот я какраз хотел запретить. Спасибо за подсказку
Запретить бы вообще копирование по дефолту
Go to the top of the page
 
+Quote Post

13 страниц V  « < 7 8 9 10 11 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 07:52
Рейтинг@Mail.ru


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