|
Система, управляемая событиями и SST(super-simple tasker), Выделено из "ООП. Классы и динамические объекты" |
|
|
|
Sep 7 2016, 09:07
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046

|
Недавно я начал пользоваться динамической памятью. Раньше пользовался только статикой, то есть placement new. Со статикой сложно работать с такими шаблонами, как фабрика обьектов, временные задачи итд. Программирую в основном под cortex-m3/m4 Код реализации аллокатора вышел довольно простым и быстрым, критически секции есть, но очень короткие(там прочитать/записать пару байт). При чем я не использую этих всяких монстров под названием RTOS, у меня свой простейший асинхронный планировщик задач, занимает строк 300 кода с комментариями(погуглите запрос "super simple tasker", поймете что это). В купе с динамическим аллокатором, variable element-size queue, новыми фишками C++ (шаблоны, лямбда-функции, auto) получается очень простой, безопасный и мощный фреймворк. Вспоминаю работу с классическими Thread-ами(с ихними стеками - куча кода было написано для анализа программ на предмет нужного обьема стека, и теперь эта куча кода отправлена на мусорку) со всеми этими тяжеленными мютексами, семафорами, вечными циклами как страшный сон.
Если кому интересно - расскажу и покажу как это все работает.
|
|
|
|
|
 |
Ответов
(165 - 179)
|
Sep 15 2016, 06:48
|

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

|
Цитата(brag @ Sep 15 2016, 00:13)  И получит права на их публикацию  Да куча сейчас либ на самом деле асинхронных или просто независимых от РТОС/блокинга, хотя согласен, есть далеко не все. Это вы наверно имеете в виду либы от Microchip-а Да, Microchip никогда не использовал RTOS, у него всегда все работало в суперцикле. И наверняка есть тысячи разработчиков пишущих сейчас в том же стиле. В конце концов все ардуинщики так делают, они же тоже программисты Но только не надо продвигать это как некий прогресс. Со своим AKOП-ом перед RTOS вы в такой же ситуации как C-и перед C++ Сейчас по аналогии, уже уместно начать доказывать, что RTOS далеко не так медлительна как тут представляется. Что там есть прерывания ядра, которые работают быстрее прерываний АКОП-а И если уж делать гибрид RTOS с другим механизмом, то лучше чистый автоматный метод применять, а не АКОП. Чистые автоматы можно хотя бы строго верифицировать в симулинке.
|
|
|
|
|
Sep 15 2016, 07:17
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046

|
не знаю что там у них за супер-цикл, лично у меня этот суперцикл выглядит следующим образом: Код while(true){ sleep(); } И он единственный во всем проекте. sleep - это обертка ассемблерной инструкции проца, если что, больше она ничего не делает. Цитата Со своим AKOП-ом перед RTOS вы в такой же ситуации как C-и перед C++ Глупо сравнивать одно с другим глипо в таком дуге. Тут скорее надо проводить аналогию Java и Javascript. Оба мощные языка и позволяют решать одни и те же задачи, но стиль программирования у них совершенно разный. Цитата И если уж делать гибрид RTOS с другим механизмом, то лучше чистый автоматный метод применять, а не АКОП. Чистый автомат во первых очень сложный получится и его развивать будет невозможно. Да еще и его скорость будет зависить от компилятора, на сколько грамотно он все это разместит в jump-tables. А на SST можно запросто делать масштабируемые приложения, как это делается на Javascripte Цитата Что там есть прерывания ядра, которые работают быстрее прерываний АКОП-а Kak это они могут быть быстрее, если в SST прерывание - это голый обработчик железного прерывания? Мало того, он ведет себя точно так же, как и обычный пользовательский код. В нем можно выполнять все те же функции, что и в юзере, а не иметь 2 версии функций под прерывания и под треды.
|
|
|
|
|
Sep 15 2016, 07:58
|

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

|
Цитата(brag @ Sep 15 2016, 10:17)  не знаю что там у них за супер-цикл, лично у меня этот суперцикл выглядит следующим образом: Код while(true){ sleep(); } И он единственный во всем проекте. sleep - это обертка ассемблерной инструкции проца, если что, больше она ничего не делает. А может sleep это волшебный супервизор? или sleep() на самом деле переопределенный вызов суперцикла. А у меня к сведению тогда главная задача в RTOS выгдядит вот так - Код IDLE; Java и Javascript.., хм. Я бы тогда сказал Java Me Embedded и Jave SE это точнее отразит разницу в масштабе. Кстати для любителей экзотики уже вышел Java ME Embedded 8.3 . Вот где масштабируемость в истинном смысле слова по полной программе!
|
|
|
|
|
Sep 15 2016, 08:27
|

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

|
Цитата(brag @ Sep 15 2016, 11:10)  Может и супервизор, меня это не волнует, для меня это просто инструкция процессора. ME/SE стиль похож, а в JS он другой, не похожий на типичную Java. А вот это выдает подход к программированию, на мой взгляд. Люди мало программирующие обращают внимание на стиль и синтаксис. А люди много программирующие обращают внимание только на API и либы. ME и SE - земля и небо c точки зрения API. Кстати ваш пустой цикл со sleep-ом может говорить о том, что вы не знаете и не следите за реальной нагрузки своего процессора, т.е. на самом деле не занимаетесь риалтаймом. Какой-то любительский гаджет со звуком? А ? Угадал?
|
|
|
|
|
Sep 15 2016, 08:35
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046

|
За загрузкой проца я слежу отдельным событием по таймеру, использую встроенные средства в проц для подсчета тактов. Проектов много разных, в том числе и на DSP, где код должен отрабатывать быстро. А еще SST - это путь к функциональному программированию - где все переменные const(а значит нет side-эффектов), где нет циклов, но есть сборка мусора и рекурсия, где компилятор сам может менять порядок вызова функций местами(мало того - может выполнять разные функции параллельно на разных процессорах/ядрах), когда это не влияет на результат, например: Код void f(x){ printf(x); // 1 const y = sin(x); //2 const z = cos(x); //3 printf(y,z); //4 } Так вот компилятор может запросто поменять местами шаги 2 и 3, или группу {2,3,4} поменять с 1 - то есть на экран сначала напечатается y,z, а потом уже x. Но не может поменять, скажем 3,4 тк 4 требует окончания выполнения 3. Это очень продвинутое программирование, и для императивщика, а тем более блокинг-императивщика оно непонятное и непосильное  Но программы в функциональном стиле короче, чем в императиве и имеют кучу преимуществ. Каких - читайте в гугле. В SST тоже вещи могут происходить не в том порядке, в котором написано, тоже очень много констант и мало циклов - это уже шаги к функциональному стилю. Например в SST вот этот код скорее всего выполнится наоборот(а точнее практически одновременно): printf("Sending 'hello' over SPI\n"); spi->write("hello"); Сначала начнется отправка по spi, а потом уже printf. Также SST - путь к декларативному программированию. У меня много задач оформлены в декларативном виде. Рано или поздно императив уйдет, как устаревшая техника, но legacy код ессно будут поддерживать еще очень долго.
|
|
|
|
|
Sep 15 2016, 09:48
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (AHTOXA @ Sep 14 2016, 22:00)  Зря вы так ополчились на brag-а. Он говорит весьма интересные вещи. Вещи на самом деле совершенно обычные, если действительно отбросить всю мишуру. Я к такому пришел первый раз несколько десятков лет назад, когда плотно занимался телефонией и городить многие тысячи процессов со своими стеками да и еще блокировками было просто нереально, посему и естественно получались и очереди и отсутствие (в пределах оговоренных пиковых нагрузок) блокировок. Второй раз лет 15 назад, пришел к этому, когда занялся FreeRTOS. В ней всякие семафоры и иже с ними, были реализованы, КАК МАКРОСЫ НА ОЧЕРЕДЯХ. Подумал я подумал и решил, что лишние сущности плодить незачем и попробовать на нативных очередях все и делать, но, естественно, в "классической" операционной системе. QUOTE (AlexandrY @ Sep 15 2016, 11:27)  Люди мало программирующие обращают внимание на стиль и синтаксис. А люди много программирующие обращают внимание только на API и либы. Нет, на второе "обращают внимание" люди, кторые НЕ занимабтся программированием, а занимаются сшиванием чего-то из кубиков. Их можно называть прикладными программистами. QUOTE (AlexandrY @ Sep 15 2016, 09:48)  И если уж делать гибрид RTOS с другим механизмом, то лучше чистый автоматный метод применять, а не АКОП. Да, типа автоматов.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 15 2016, 10:30
|

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

|
Цитата(brag @ Sep 15 2016, 11:56)  Да, по высоко-приоритетному таймеру беру за определенный промежуток времени количество тактов из регистра(для кортекс это DWT_xx) и прогоняю через фильтр. Используете DWT_SLEEPCNT ? Отсюда ссылку взяли http://stm32f4-discovery.net/2015/05/cpu-l...-for-stm32f4xx/? Но в высоконагруженных embedded системах нету slеep-а. Цитата(sigmaN @ Sep 15 2016, 13:06)  Вот и опять подтверждается то, что я всегда и говорил: оба подхода существуют не просто так. Там где надо - значит надо. Так потому и обсуждаем чтобы узнать где надо. Пока все идет к тому, что метод TC годен для очень мелких микроконтроллеров в парой тройкой задач, которые автор в состоянии полностью написать сам не используя сторонний софт. Ниша очень узкая. Удобнее полностью перестроится под RTOS, и портировать ее даже на самые мелкие микроконтроллеры.
|
|
|
|
|
Sep 15 2016, 10:30
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (sigmaN @ Sep 15 2016, 13:06)  А наш проповедник всех тотально на один стек пересадить хочет )) Странно. Я вижу человека, который рассказывает, как он делает и объясняет, почему он так делает и зачем. И еще толпу, которая пытается ему доказать, что он все делает неправильно. Причем некоторые из этой толпы вообще не понимают, о чем идет речь.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 15 2016, 10:48
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046

|
Не оттуда, взял из документации на ARM. Но смысл тот же. sleeр у меня есть всегда и мониторит загрузку проца отлично. Там, где подобного механизма нет - считаю загрузку вручную через хуки. Я не любитель загружать проц по максимуму, всегда оставляю резерв на будущее. Цитата А наш проповедник всех тотально на один стек пересадить хочет )) Не зависимо от задачи и процессора. Я никого не пересаживаю. Если нужны legacy блокинг-либы, либо коллектив/заказчик хочет блокинг, либо просто работаете над проектом, где уже все написано в блокинг и переход на нонблокинг будет очень сложным и бессмысленным - тогда ССТ Вам не подходит. Вы жестко привязаны к платформе, либам, языку, стилю и технике. ССТ это для тех, кто хочет развиваться, осваивать и делать что-то новое. Подход да, очень стар, даже РТОС тогда наверное не было. Но он имеет кучу своих преимуществ и удобств, особенно, если есть хороший мощный высокоуровневый язык. Цитата Эт Сергей такой добрый пока brag на ScmRTOS не покатил бочку. biggrin.gif А че там катить, нормальная ОС, да еще и на плюсах. Хотя есть к чему придраться. Но и к любому коду можно придряться(моему в том числе). Но этот топик про SST, а не про ScmRTOS Мы рассматриваем ССТ в техническом аспекте, его возможности и недостатки. Вопросов совместимости его из блокинг-либами касаться смысла нет - он с ними не совместим. Можете считать это недостатком. Для кого-то он решающий, а для кого-то - несущественный.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|