|
TNeo: тщательно протестированная РТОС для Cortex-M0/M0+/M3/M4/M4F, PIC24/dsPIC, PIC32MX. |
|
|
|
Jan 18 2015, 01:41
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 16-09-14
Пользователь №: 82 835

|
Представляю новое ядро реального времени: TNeo. Как можно догадаться из названия, изначально она основана на TNKernel, но в итоге код был переписан почти полностью (потому что оригинальный код, по моему мнению, далек от совершенства), написаны подробные юнит-тесты, исправлены ошибки и добавлено много новых фич. Список найденных и исправленных ошибок в TNKernel 2.7 можно посмотреть тут: http://dfrank.bitbucket.org/tneokernel_api...implement__bugsКод TNeo написан аккуратно и тщательно, документирован очень подробно. Документация генерируется автоматически посредством doxygen, таким образом, легко поддерживать документацию в актуальном состоянии: Список новых возможностей: * Dynamic tick (опционально): если системе нечего делать, эта опция позволяет действительно ничего не делать (уйти в sleep), и даже не просыпаться каждую миллисекунду для обработки системного тика. Подробнее: http://dfrank.bitbucket.org/tneokernel_api...time_ticks.html* Timer: позволяет попросить ядро запустить пользовательскую функцию через определенный промежуток времени. Подробнее: http://dfrank.bitbucket.org/tneokernel_api...__timer_8h.html* Event group connection: позволяет "соединить" группу флагов с другими объектами РТОС. Очень удобно в случаях, когда в задаче нужно ждать, скажем, сообщения из нескольких очередей, или ждать каких-то флагов плюс сообщения из очереди. Подробнее: http://dfrank.bitbucket.org/tneokernel_api...ventgrp_connect* Profiler (опционально): позволяет узнать общее время работы каждой задачи, максимальное время работы задачи подряд и т.д. Полезно для отладки. * Software stack overflow check (опционально) - программный контроль переполнения стека, очень существенно облегчает дебаг; * Recursive mutexes (опционально) - позволяет вложенную блокировку мютексов; * Mutex deadlock detection (опционально) - в случае deadlock, ядро сообщает об этом посредством callback-функции; * Separate interrupt stack - на всех поддерживаемых платформах прерывания используют отдельный стек. Полный список фич тут: http://dfrank.bitbucket.org/tneokernel_api...l/features.htmlОтличия API TNeo от API TNKernel 2.7 тут: http://dfrank.bitbucket.org/tneokernel_api...ernel_diff.htmlЧем не устраивает TNKernel: см. документацию: Why reimplement TNKernel, также можно посмотреть мой старый пост на этом форуме: http://electronix.ru/forum/index.php?s=&am...t&p=1280109Кратко: ключевые проблемы TNKernel: - Самая основная проблема в том, что TNKernel - проект, написанный на коленке, т.е. в спешке. Огромное количество дублирования кода, непоследовательности и недостаточной продуманности.
- Проект не тестировался (только "вручную", как это нередко делается в эмбеддинге, к сожалению). Среди найденных багов есть банальнейшие ситуации с мютексами, которые не обрабатываются ядром корректно (см. ссылку на список багов выше). Ну, учитывая первый пункт про спешку, отсутствие тестов неудивительно, т.к. на них нужно огромное количество времени. У меня на тесты ушло примерно столько же времени, сколько на само ядро.
- Документация живет отдельной от самого ядра жизнью.
- Проект не поддерживается. Я присылал Юрию исправления некоторых ошибок, мои сообщения были проигнорированы.
Любопытный читатель может спросить: если уж я так сильно ругаю TNKernel, почему же я взял это ядро за основу? С удовольствием отвечу: не смотря на то, что реализация TNKernel, по моему мнению, далека от совершенства, идеи, стоящие за реализацией, я считаю в целом очень достойными. Ядро компактное и быстрое, и данные организованы грамотно. Я хотел переписать его так, чтобы на код было приятно смотреть и легко модифицировать (не боясь что-то сломать), хотел быть уверенным в отсутствии багов (посредством юнит-тестов), хотел достойную актуальную документацию. Все это готово. Попутно я реализовал вещи, которых мне самому раньше не хватало, плюс реализовал пожелания людей, заинтересовавшихся проектом (я представил TNeo на семинаре Microchip MASTERS 2014, после чего и получил предложение реализовать порт для линейки Cortex-M и несколько других фич) Выражаю огромную благодарность Юрию за проделанную работу над TNKernel: без нее, конечно, TNeo никогда не появилась бы. Полный список благодарностей можно прочитать на странице Thanks.
|
|
|
|
|
 |
Ответов
|
Jan 19 2015, 18:50
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 16-09-14
Пользователь №: 82 835

|
Цитата(Aner @ Jan 19 2015, 22:08)  Для кого как а для меня "мютекс" это и есть один из видов "Семафора". Главное отличие между мютексом и семафором в том, что у заблокированного мютекса есть задача-владелец. У семафора владельца нет и быть не может. Использование мютекса всегда сводится к следующему: задача А заблокировала мютекс, задача А разблокировала мютекс. Не может быть другой последовательности. Пока мютекс заблокирован задачей, никто больше не может его заблокировать, и никто кроме задачи А также не может его разблокировать. И вот тот факт, что у мютекса есть владелец, позволяет реализовать алгоритмы обхода инверсии приоритетов. И, разумеется, мютекс нельзя блокировать в прерывании. С семафором же все совершенно иначе: задача А может семафор ожидать, а задача Б, или даже прерывание, может семафорить. И корректное использование семафоров заключается именно в том, что одна задача (или прерывание) семафорит другой: типа, у меня все готово, теперь ты давай. Еще раз дам эту ссылку на stackoverflow, где человек чуть подробнее объясняет то же самое: http://stackoverflow.com/a/86021/1099240. Цитата(Aner @ Jan 19 2015, 22:08)  Но вот разницу в TNeo и Free RTOS к примеру в v7.1 не очень увидел. TNeo, возможно ценна другим, ... вот в чём? Я уже выше писал, что я всерьез не использовал FreeRTOS, так что не смогу вам ответить. Ну вот товарищ AlexandrY отметил, что в FreeRTOS нет event group connection, а это иногда ну очень удобно. От коллег слышал что FreeRTOS значительно медленнее TNKernel, но сам не проверял.
Сообщение отредактировал dimonomid - Jan 19 2015, 18:51
|
|
|
|
|
Jan 19 2015, 20:35
|

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

|
Цитата(dimonomid @ Jan 19 2015, 20:50)  Использование мютекса всегда сводится к следующему: задача А заблокировала мютекс, задача А разблокировала мютекс. Не может быть другой последовательности. Пока мютекс заблокирован задачей, никто больше не может его заблокировать, и никто кроме задачи А также не может его разблокировать.
И вот тот факт, что у мютекса есть владелец, позволяет реализовать алгоритмы обхода инверсии приоритетов. И, разумеется, мютекс нельзя блокировать в прерывании. Ну зачем париться об инверсии если не подводите структуру задач под Rate Monotonic Algorithm ? Есть там инверсия или нет инверсии вашему софту все равно будет по барабану. Это же не deadlock, а вполне себе невинная коллизия. И потом, разве в TNeo мьютекс не будет удален при удалении создавшей его задачи? Логично ожидать его удаления, а значит мьютексы можно разблокировать и из других задач. Т.е. принципиальная разница с семафором не такая уж и огромная.
|
|
|
|
|
Jan 19 2015, 21:14
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 16-09-14
Пользователь №: 82 835

|
Цитата(AlexandrY @ Jan 20 2015, 00:35)  Ну зачем париться об инверсии если не подводите структуру задач под Rate Monotonic Algorithm ? Есть там инверсия или нет инверсии вашему софту все равно будет по барабану. Нет, не по барабану. Если вашему софту по барабану, значит, вашим задачам и приоритизация вообще не нужна: сделать все тупо одного приоритета, да и все. У меня же бывают задачи, для которых существуют требования типа "задача X обязана отреагировать на сообщение Y в течение времени Z". Необязательно все прям рассчитывать с точностью до микросекунд, бывает просто эмпирически становится ясно, что определенная задача перестает успевать за естественными требованиями по времени. Цитата(AlexandrY @ Jan 20 2015, 00:35)  И потом, разве в TNeo мьютекс не будет удален при удалении создавшей его задачи? Логично ожидать его удаления, а значит мьютексы можно разблокировать и из других задач. Ну вы сравнили. Удаление задачи без разблокировки мютекса - это, извиняюсь за выражение, говнокод. И рассчитывать на это можно только в случае аварийной ситуации, когда нормально задачу уже никак не завершить, и ничего другого не остается, кроме как грохнуть ее без суда и следствия. При нормальном завершении, задача должна сама явно освободить все мютексы и другие ресурсы, после чего завершиться. Цитата(AlexandrY @ Jan 20 2015, 00:35)  Т.е. принципиальная разница с семафором не такая уж и огромная. Я устал тратить время на доказывание того, что белое - это белое. Как я уже сказал в самом начале, тот факт, что многие эмбеддеры не хотят понимать разницу между мютексами и семафорами, и используют одно вместо другого - для меня не новость. Можно и саморезы в стену молотком забивать - держаться будут.  Так что принципиальная разница между гвоздями и саморезами не такая уж и огромная. Если есть что-то конкретно по TNeo - с удовольствием отвечу, а если только холивар про использование примитивов синхронизации, то давайте лучше просто займемся своими делами. Цитата(Aner @ Jan 20 2015, 00:45)  Про то что FreeRTOS значительно медленнее TNKernel думаю, так говорить некорректно; от задачи и окружения зависит Ладно, это спор без фактов: как я вам сразу сказал, я сам не проверял. Насколько я слышал, сравнения проводились при прочих явных условиях без побочных вещей: типа, отправляем сообщение из задачи А в высокоприоритетную задачу Б и смотрим сколько прошло тиков до получения управления задачей Б. Если я заморочусь когда-нибудь на подобное сравнение, я напишу. Пока нечего сказать.
|
|
|
|
|
Jan 20 2015, 07:09
|

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

|
Цитата(dimonomid @ Jan 19 2015, 23:14)  Нет, не по барабану. Если вашему софту по барабану, значит, вашим задачам и приоритизация вообще не нужна: сделать все тупо одного приоритета, да и все. У меня же бывают задачи, для которых существуют требования типа "задача X обязана отреагировать на сообщение Y в течение времени Z". Необязательно все прям рассчитывать с точностью до микросекунд, бывает просто эмпирически становится ясно, что определенная задача перестает успевать за естественными требованиями по времени. Ну, и были случаи когда только мьютекс помогал задаче гарантированно выполниться до deadline? Цитата(dimonomid @ Jan 19 2015, 23:14)  Ну вы сравнили. Удаление задачи без разблокировки мютекса - это, извиняюсь за выражение, говнокод. И рассчитывать на это можно только в случае аварийной ситуации, когда нормально задачу уже никак не завершить, и ничего другого не остается, кроме как грохнуть ее без суда и следствия. Т.е. ваш код не отрабатывает аварийные ситуации, пилит и пилит дальше не смотря ни на что? А у других 90% кода это сплошь обработка аварийных ситуаций знаете-ли, иначе сертификацию не пройдут. Цитата(dimonomid @ Jan 19 2015, 23:14)  При нормальном завершении, задача должна сама явно освободить все мютексы и другие ресурсы, после чего завершиться. Не будем наделять задачи разумом, а скажем так - при вызове функции уничтожения задачи происходит уничтожение и всех объектов синхронизации которые были привязаны к ней. Уничтожение задачи можно вызвать и из другой задачи. Это стандартный подход в развитых RTOS, в MQX в частности.
|
|
|
|
|
Jan 20 2015, 08:03
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 16-09-14
Пользователь №: 82 835

|
Цитата(AlexandrY @ Jan 20 2015, 11:09)  Ну, и были случаи когда только мьютекс помогал задаче гарантированно выполниться до deadline? Уж конечно я не измерял, т.к. для блокировки ресурсов всегда сразу использую корректный объект синхронизации (мютекс), но назовите мне причину, по которой я должен оставлять потенциальную возможность инверсии приоритетов? Цитата(AlexandrY @ Jan 20 2015, 11:09)  Т.е. ваш код не отрабатывает аварийные ситуации, пилит и пилитдальше не смотря ни на что? А у других 90% кода это сплошь обработка аварийных ситуаций знаете-ли, иначе сертификацию не пройдут. Конечно обрабатывает, только называть удаление задачи способом "разблокировать мютекс" и говорить, что, дескать, значит семафор и мютекс это одно и то же - некорректно, т.к. для семафора ожидание и сигнализирование из разных задач - рабочая ситуация, а для мютекса - крайняя и аварийная. И приведите пожалуйста примеры, когда вы используете удаление задачи в качестве разрешения нештатной ситуации? Цитата(AlexandrY @ Jan 20 2015, 11:09)  Не будем наделять задачи разумом, а скажем так - при вызове функции уничтожения задачи происходит уничтожение и всех объектов синхронизации которые были привязаны к ней. Уничтожение задачи можно вызвать и из другой задачи. Это стандартный подход в развитых RTOS, в MQX в частности. Единственный объект синхронизации, привязанный к задаче - мютекс. Например, выделенная из TN_FMem или вообще из кучи память никак не привязывается к задаче (т.к. память легко может быть выделена в одной задаче, а освобождена в другой), так что удаление задачи, выделяющей память динамически, может привести к утечке памяти. Хотя, конечно, не удивлюсь, если вы и динамическое выделение памяти не используете.
|
|
|
|
|
Jan 20 2015, 09:46
|
Частый гость
 
Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205

|
QUOTE (dimonomid @ Jan 20 2015, 12:03)  Хотя, конечно, не удивлюсь, если вы и динамическое выделение памяти не используете. Да, многие не используют динамическое распределение памяти в embedded системах. Одна из холиварных тем.  Но кучи в системах высокой ответственности - однозначное зло.
Сообщение отредактировал LightElf - Jan 20 2015, 09:49
|
|
|
|
|
Jan 20 2015, 10:55
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 16-09-14
Пользователь №: 82 835

|
Цитата(LightElf @ Jan 20 2015, 13:46)  Но кучи в системах высокой ответственности - однозначное зло.  Куча - согласен, зло, т.к. поведение недетерминировано. Но кроме кучи есть другие инструменты для динамического распределения памяти - например, TN_FMem (и аналоги в других ядрах). Это - не зло
|
|
|
|
Сообщений в этой теме
dimonomid TNeo: тщательно протестированная РТОС для Cortex-M0/M0+/M3/M4/M4F, PIC24/dsPIC, PIC32MX. Jan 18 2015, 01:41 Aner Под IAR c Cortex не планируется? Jan 18 2015, 11:11 dimonomid Цитата(Aner @ Jan 18 2015, 15:11) Под IAR... Jan 18 2015, 11:23 AlexandrY Цитата(dimonomid @ Jan 18 2015, 03:41) По... Jan 18 2015, 12:30 dimonomid Цитата(AlexandrY @ Jan 18 2015, 17:30) Не... Jan 18 2015, 13:15  AlexandrY Цитата(dimonomid @ Jan 18 2015, 15:15) То... Jan 18 2015, 21:42   dimonomid Цитата(AlexandrY @ Jan 19 2015, 02:42) Да... Jan 18 2015, 22:52 nill Планируете переносить TN NET на своё ядро? И есть ... Jan 18 2015, 13:58 dimonomid Цитата(nill @ Jan 18 2015, 17:58) Планиру... Jan 18 2015, 14:14 Xenia Цитата(dimonomid @ Jan 18 2015, 04:41) Пр... Jan 18 2015, 14:30 dimonomid Цитата(Xenia @ Jan 18 2015, 18:30) А скач... Jan 18 2015, 14:39  Xenia Цитата(dimonomid @ Jan 18 2015, 17:39) Во... Jan 18 2015, 15:09   dimonomid Цитата(Xenia @ Jan 18 2015, 20:09) 1. Изв... Jan 18 2015, 15:32    Xenia Цитата(dimonomid @ Jan 18 2015, 18:32) Пр... Jan 18 2015, 16:10     dimonomid Цитата(Xenia @ Jan 18 2015, 20:10) А как ... Jan 18 2015, 16:31 Xenia Цитата(dimonomid @ Jan 18 2015, 19:31) Та... Jan 18 2015, 22:14 AlexandrY Цитата(Xenia @ Jan 19 2015, 00:14) В этой... Jan 19 2015, 09:52  dimonomid Цитата(AlexandrY @ Jan 19 2015, 14:47) В ... Jan 19 2015, 10:21   megajohn рассмотрите возможность 11. не плохо бы разместить... Jan 19 2015, 10:34    dimonomid Цитата(megajohn @ Jan 19 2015, 15:34) рас... Jan 19 2015, 11:18   AlexandrY Цитата(dimonomid @ Jan 19 2015, 12:21) Мо... Jan 19 2015, 11:40    dimonomid Цитата(AlexandrY @ Jan 19 2015, 16:40) Вс... Jan 19 2015, 11:59  den_po Цитата(AlexandrY @ Jan 19 2015, 14:52) Та... Jan 19 2015, 11:36   dimonomid Цитата(den_po @ Jan 19 2015, 16:36) http:... Jan 19 2015, 11:40      AlexandrY Цитата(dimonomid @ Jan 20 2015, 10:03) Уж... Jan 20 2015, 11:03       den_po Цитата(AlexandrY @ Jan 20 2015, 15:03) Не... Jan 20 2015, 14:17       dimonomid Цитата(AlexandrY @ Jan 20 2015, 15:03) Пр... Jan 20 2015, 16:39        AlexandrY Цитата(dimonomid @ Jan 20 2015, 18:39) Мд... Jan 21 2015, 07:24         dimonomid Цитата(AlexandrY @ Jan 21 2015, 12:24) Ва... Jan 21 2015, 08:56          AlexandrY Цитата(dimonomid @ Jan 21 2015, 10:56) Со... Jan 21 2015, 09:47           dimonomid Цитата(AlexandrY @ Jan 21 2015, 14:47) А ... Jan 21 2015, 10:03            AlexandrY Цитата(dimonomid @ Jan 21 2015, 12:03) Ни... Jan 21 2015, 10:11             dimonomid Цитата(AlexandrY @ Jan 21 2015, 15:11) Па... Jan 21 2015, 12:29              AlexandrY Цитата(dimonomid @ Jan 21 2015, 14:29) Не... Jan 22 2015, 08:03               dimonomid Цитата(AlexandrY @ Jan 22 2015, 13:03) ... Jan 22 2015, 09:52                AlexandrY Цитата(dimonomid @ Jan 22 2015, 11:52) По... Jan 22 2015, 10:16                 dimonomid Цитата(AlexandrY @ Jan 22 2015, 15:16) Я ... Jan 22 2015, 11:12 Aner Про то что FreeRTOS значительно медленнее TNKernel... Jan 19 2015, 20:45 Mahagam Aner, фриртос действительно тормознее других перек... Jan 20 2015, 07:17 Aner QUOTE (Mahagam @ Jan 20 2015, 11:17) Aner... Jan 20 2015, 09:20  Mahagam QUOTE (Aner @ Jan 20 2015, 12:20) кроме b... Jan 20 2015, 11:33   Aner QUOTE (Mahagam @ Jan 20 2015, 15:33) поме... Jan 20 2015, 14:45    Mahagam QUOTE (Aner @ Jan 20 2015, 17:45) Да блин... Jan 20 2015, 17:10  dimonomid Насчет FreeRTOS:
Цитата(Mahagam @ Jan 20 201... Apr 7 2015, 23:58 Valentine Loginov Спасибо! Будем смотреть.
А тесты в открытом до... Jan 20 2015, 08:06 dimonomid Цитата(Valentine Loginov @ Jan 20 2015, 12... Jan 20 2015, 08:10 Aner Шизу про догнал развивать не стоит. Я о тормозах и... Jan 20 2015, 19:35 ViKo Здесь много разговора про мьютексы. В Keil CMSIS-R... Jan 22 2015, 10:01 AHTOXA Цитата(ViKo @ Jan 22 2015, 15:01) Я испол... Jan 22 2015, 11:56  ViKo Цитата(AHTOXA @ Jan 22 2015, 14:56) То ес... Jan 22 2015, 12:07   AHTOXA Цитата(ViKo @ Jan 22 2015, 17:07) Нет. Мь... Jan 22 2015, 15:37    ViKo Цитата(AHTOXA @ Jan 22 2015, 18:37) Вот э... Jan 22 2015, 16:51     dimonomid Цитата(ViKo @ Jan 22 2015, 21:51) Почитай... Jan 22 2015, 17:13 _Pasha Мне вообще даже эти все разговоры про ртосы не нра... Jan 22 2015, 10:18 Alex B._ dimonomid – можно рассмотреть кейс, когда на... Jan 22 2015, 11:26 dimonomid Цитата(Alex B._ @ Jan 22 2015, 16:26) dim... Jan 22 2015, 11:35  Alex B._ Цитата(dimonomid @ Jan 22 2015, 14:35) Я ... Jan 22 2015, 11:40 ViKo Хотите семафоров? - их есть у Кейла. Как говорится... Jan 22 2015, 20:33 Valentine Loginov Ай пошли войны. Создали бы тему или блог какой и о... Jan 23 2015, 06:49 ViKo Нашел принципиальное отличие мьютекса от семафора.... Jan 23 2015, 07:04 LightElf QUOTE (ViKo @ Jan 23 2015, 11:04) Так что... Jan 23 2015, 12:01  ViKo Цитата(LightElf @ Jan 23 2015, 15:01) При... Jan 23 2015, 12:42 zaicev_ekb Прошу прошения.
А почему такой древний компилятор ... Feb 9 2015, 10:47 dimonomid Цитата(zaicev_ekb @ Feb 9 2015, 15:47) Пр... Feb 9 2015, 16:30 dimonomid Так, отставить, я ерунду написал в прошлом сообщен... Apr 8 2015, 10:03 LightElf QUOTE (dimonomid @ Apr 8 2015, 13:03) Так... Apr 8 2015, 13:42  dimonomid Цитата(LightElf @ Apr 8 2015, 17:42) Наск... Apr 8 2015, 14:02   LightElf QUOTE (dimonomid @ Apr 8 2015, 17:02) т к... Apr 8 2015, 14:23    dimonomid Цитата(LightElf @ Apr 8 2015, 18:23) Хм. ... Apr 8 2015, 14:38     LightElf QUOTE (dimonomid @ Apr 8 2015, 17:38) Мда... Apr 8 2015, 14:46      dimonomid Цитата(LightElf @ Apr 8 2015, 19:46) Во... Apr 8 2015, 14:56       LightElf QUOTE (dimonomid @ Apr 8 2015, 17:56) Вам... Apr 8 2015, 15:05        dimonomid Цитата(LightElf @ Apr 8 2015, 19:05) Так ... Apr 8 2015, 15:13         LightElf QUOTE (dimonomid @ Apr 8 2015, 18:13) Хм.... Apr 8 2015, 15:29
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|