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

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
> Программное разделение, GSM и GPS
sobr
сообщение Jul 16 2013, 02:16
Сообщение #46


Знающий
****

Группа: Свой
Сообщений: 926
Регистрация: 18-01-07
Пользователь №: 24 552



Цитата(AlexandrY @ Jul 16 2013, 02:40) *
В Delphi или Builder-е тяжковато было с потоками поскольку их VCL модель компонентов была довольно мутной и недокументированной в части взаимодействия потоков с GUI. Каждый шаг нужно было тестировать.
А в чем возникали проблемы потоков и GUI? Я в Builder'е что то делал не очень много, но с подобными проблемами не сталкивался.

Цитата(Frolov Kirill @ Jul 12 2013, 21:25) *
Если изделия "Вега-Абсолют" ваши -- то вызывает уважение. Хотя, честно говоря, не понятно как можно всё упихнуть в такой маленький контроллер (PIC18F65J15: 48КБайт ПЗУ, 2КБайт ОЗУ) без жёсткого ассемблера, вряд ли оправданного экономически (за спиной спрашивают когда будет проект готов, а я им про ассемблер, ага). С другой стороны там модем Sierra Wireless WMP100 и всё может быть (в его прошивке).
Нет, это писал не я. Но я прекрасно знаю людей, которые это делали несколько лет назад (сейчас там уже другие). Не скажу за последние модели, но в GSM 100, 110, 120, 130 WMP100 стоит не так давно, сначала сим 300 стоял, и вся программа в пике, максимум что перенесли в WMP это дтмф. Я этот подход не разделяю, и сделал подобную систему полностью на SL6087.
Go to the top of the page
 
+Quote Post
Frolov Kirill
сообщение Jul 16 2013, 12:05
Сообщение #47


Местный
***

Группа: Участник
Сообщений: 212
Регистрация: 2-02-11
Пользователь №: 62 643



Цитата(AlexandrY @ Jul 15 2013, 23:40) *
Сейчас посмотрел Windows Task Manager увидел там 1540 потоков!
Мне с RTOS за этим никогда не угнаться. wink.gif


Из частного не следует общего. Большая часть потоков порождена парочкой безумных программ, остальные однопоточные или имеют весьма ограниченное число потоков. Даже службы windows попытались компактно разместить в рамках одного svchosts.exe, а не размазывать по безумному числу процессов или потоков.

Цитата
Но даже там были скажем компоненты стека TCP/IP которые для каждого соединения создавали свой поток. Сделать случайно 1000 потоков там было как раз плюнуть.


Это специфика конкретных библиотек. Вообще для работы с TCP/IP не нужно over9000 потоков, более того, крайне вредно для массового обслуживания: google://C2K problem.
"Тяжёлые" сервера, например, могут создавать множество потоков, но уже не fork под каждое соединение (самое простое и плохое решение), а для последовательной обработки запросов одним потоком из пула свободных. А совсем тяжёлые обходятся одним потоком (процессом) и таки event driven моделью программирования.

Цитата
Так называемая "событийная" модель встречается в известной либе uC/GUI.


Она встречается в любом GUI, кроме самых примитивных может быть. Она встроена в windows, она в X-window тоже (и там вся графика отрабатывается одним потоком, одним процессом). Без событийной модели (сигналы-слоты -- по сути тоже событийная модель) я не представляю как вообще GUI построить. Из GUI toolkits без событий мне вспоминаются только поделки для текстового режима 90-х годов. Но там все окна, элементы -- модальные. Невелика хитрость.

Ещё важный момент событийно-ориентированного программирования -- отсутствие жёсткой связности компонентов на момент компиляции. Компоненты A и B могут работать вместе, но они не знают друг о друге. Т.е., например, функция A() не может напрямую вызвать функцию B(), и наоборот. Это принципиальное свойство и сколько-нибудь большие программы без него сложно построить (иначе невозможно изолировать модули, каждый должен знать о каждом). В примитивной форме такая (не)связность может обеспечиваться callback функциями и установкой в процессе исполнения (не компиляции).

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


А это говорит, что там нет очереди событий или чего-то в этом роде. А очередь событий здесь -- принципиальна необходима. Или какой-то механизм её замещающий. И тогда ни рекурсий, ни вложенности. Обработка строго последовательная. См. state-machine.com. Но мне у них что не нравится: все задают этот вопрос, а что если очередь переполнится. Такой же механизм, кстати, описан в wikipedia в статье "Embedded system", он же описывается в книгах (обработчики прерываний кладут адреса функций в очередь). Я думаю, ответ здесь должен быть такой, что некоторые события должны обрабатываться непосредственно, без очереди.

Цитата
Честно говоря хотя библиотеки С-и и могут быть настроены под RTOS (и их бинарный вид не проблема для этого)


Как это не проблема, я же явно указал на принципиальную невозможность использования _переменной_ errno. А после компиляции в бинарный вид оно уже заняло место в конкретных машинных кодах и тут ничего не изменить. Библиотеки расчитывающие на многопоточность (не многозадачность, т.к. к многозадачности с полной изоляцией процессов, а-ля unix, готова любая C-библиотека) изначально имеют что-то вроде #define errno (TLS->errno) и/или даже #define errno (*errno_location()), где функция errno_location() возвращает действительный адрес errno для данного потока.

Если библиотека не предполагает вытеснение -- здесь ничего не сделать. Только использовать её в кооперативной ОС. В таком случае тоже... есть проблемы с рядом функций вроде strtok(), но таких функций действительно по пальцам пересчитать и можно их переписать самому.

А malloc()? Тут очевидно. Не reentrant и не thread-safe.

А printf? Невозможен одновременный доступ к структуре FILE. А ведь на PC из разных потоков всё работает... Не reentrant и не thread-safe.

И самое главное -- для ускорения вычислений некоторые, особенно математические, функции могут использовать статические переменные. Не reentrant и не thread-safe.

Цитата
но я предпочитаю просто не использовать небезопасных для многозадачности функций.


Не надо путать thread-safe и reentrant-safe функции. Это разные понятия, хотя и похожие. Функции для вытесняющей многозадачности должны быть thread-safe.

Цитата
Этих функций на C-и по пальцам можно пересчитать.


Это "безопасные" можно по пальцам сосчитать.

И вы туда же: "мы не используем функций C-библиотеки". Вы сами не знаете чего не используете. Потому, что одни функции могут вызываться из других или из функций сторонних библиотек. И вы не знаете какие проблемы связывают C-библиотеку и многозадачность -- вот я о чём. А всё туда же. Не имею ничего против многозадачности, но она возможна только в рамках соответствующей библиотеки и ОС. Я пример привёл: и eCOS и newlib, например, подразумевают многопотчность. А библиотека фирмы dinkumware -- нет, и здесь возможна, максимум, кооперативная ОС, или вообще не возможна. Или можно "не использовать библиотечных функций", но это очень порочный путь.
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Jul 16 2013, 22:13
Сообщение #48


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

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Цитата
Так вот в мире PC не пытаются строить программы с безумным количеством потоков непонятно ради чего, а приходят к event driven архитектуре ПО

В мире РС над одним проектом работают десятки, сотни, а иногда и тысячи программистов. Когда у нас подобным запахнет, тогда возможно и задуматься над увеличением объёма памяти и архитектуры...
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jul 17 2013, 06:28
Сообщение #49


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Frolov Kirill @ Jul 16 2013, 15:05) *
А это говорит, что там нет очереди событий или чего-то в этом роде. А очередь событий здесь -- принципиальна необходима.

Как это не проблема, я же явно указал на принципиальную невозможность использования _переменной_ errno.

Библиотеки расчитывающие на многопоточность (не многозадачность, т.к. к многозадачности с полной изоляцией процессов, а-ля unix, готова любая C-библиотека)


Какая может быть очередь в однозадачной библиотеке?

Как правильно сами сказали есть как минимум механизм Thread-local storage (TLS) в GCC. Вот там и помещаете errno если используете GCC.

Но я не использую GCC.
В RVCT все гораздо проще. Просто переопределяете функцию __aeabi_errno_addr(). Она вызывается библиотеками C-и на низком уровне для получения адреса errno.
Наверно вы не забываете при создании задач выделять память для переменных задачи с помещением указателя на нее в управляющую структуру задачи.
В любой RTOS эта память из любого места задачи доступна по идентификатору задачи. Вот там и храните errno, пулы памяти для malloc и все прочее что надо.

И вот такими переопределениями низкоуровневых функций весь retargeting и производится. Сами библиотеки при этом остаются в бинарном виде .

Насчет терминологии. Говорю только о RTOS без виртуализации памяти. Поэтому применяю термин многозадачность .
Go to the top of the page
 
+Quote Post
rat
сообщение Aug 7 2013, 03:30
Сообщение #50


Местный
***

Группа: Свой
Сообщений: 497
Регистрация: 9-06-05
Из: Новосибирск
Пользователь №: 5 852



Вопрос в продолжение темы: прошу общих рекомендаций по работе с прерываниями в STM32F1. Особенности, специфика при работе с несколькими прерываниями, на что стоит обратить внимание, грабли, тонкости?
Go to the top of the page
 
+Quote Post
Falkon_99
сообщение Aug 7 2013, 09:04
Сообщение #51


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 26-03-12
Из: Харьков
Пользователь №: 71 010



Писали про UART, DMA - рулит, и забыть про прерывания.
Go to the top of the page
 
+Quote Post
=F8=
сообщение Aug 7 2013, 10:16
Сообщение #52


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Цитата(rat @ Aug 7 2013, 06:30) *
Вопрос в продолжение темы: прошу общих рекомендаций по работе с прерываниями в STM32F1. Особенности, специфика при работе с несколькими прерываниями, на что стоит обратить внимание, грабли, тонкости?

Честно говоря никакой особой специфики не заметил. Из общих рекомендаций... ну удобно читать данные из uart в циклический буфер, есть там такая настройка у dma контроллера.
PS в конфе по армам есть целая прикрепленная ветка по STM32

Цитата
Писали про UART, DMA - рулит, и забыть про прерывания.

У dma тоже есть прерывания.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th June 2025 - 08:13
Рейтинг@Mail.ru


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