|
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 18 2015, 12:30
|

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

|
Цитата(dimonomid @ Jan 18 2015, 03:41)  Попутно я реализовал вещи, которых мне самому раньше не хватало, плюс реализовал пожелания людей, заинтересовавшихся проектом (я представил TNeo на семинаре Microchip MASTERS 2014, после чего и получил предложение реализовать порт для линейки Cortex-M и несколько других фич) Не могли бы вы показать примеры ваших разработок с использованием RTOS? Просто интересно чем вызвана такая мотивированность, делаете ли вы это ради искусства или действительно есть некая производственная потребность. Скажем такие страсти вокруг мьютексов. С виду нужная фича. Но вот смотрю в MQX в основном дистрибутиве и не нахожу где бы вызывались сервисы мьютексов. Хотя в RTOS они реализованы, хорошо документированы, развиты. Но во всем промежуточном ПО включая файловую систему, USB стеки, TCP/IP стеки, сетевые сервисы, командные оболочки, драйверы нигде не применяются мьютексы. Т.е. разработчики потратили на мьютексы уйму времени, а зачем они нужны в жизни не знают. Комично однако.
|
|
|
|
|
Jan 18 2015, 13:15
|
Участник

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

|
Цитата(AlexandrY @ Jan 18 2015, 17:30)  Не могли бы вы показать примеры ваших разработок с использованием RTOS? Просто интересно чем вызвана такая мотивированность, делаете ли вы это ради искусства или действительно есть некая производственная потребность. Скажем такие страсти вокруг мьютексов. С виду нужная фича. Но вот смотрю в MQX в основном дистрибутиве мьютексы вообще! нигде не применяются. Хотя в RTOS они есть, хорошо документированы, развиты. Но во всем промежуточном ПО включая файловую систему, USB стеки, TCP/IP стеки, сетевые сервисы, командные оболочки, драйверы нигде не применяются мьютексы. Т.е. разработчики потратили на мьютексы уйму времени, а зачем они нужны в жизни не знают. Комично однако.  Опен-сорсных разработок нет, только для конторы, так что показать примеры не могу. Может потом добавлю что-нибудь в examples, но вряд ли скоро. То, что многие эмбеддеры не знают, зачем нужны мютексы, не новость: вот яркий пример http://www.microchip.su/showthread.php?p=1...near#post185067 . Да что там мютексы, многие не знают зачем нужна РТОС. Типа, и так можно написать. Спорить не буду - можно и без мютексов написать, и без РТОС, и без C, и т.д. Вот очень хорошая небольшая статья на тему мютексов и семафоров http://www.barrgroup.com/Embedded-Systems/...Mutex-SemaphoreВкратце, мютекс нужен для доступа к разделяемому ресурсу. Например, если в двух (или более) задачах используется, скажем, внешняя SPI-флешка, т.е. они обе эту флешку читают/пишут, то нужно быть уверенным в том, что они не будут друг другу мешать работать с флешкой. С этим не будете спорить? Можно, конечно, на каждый ресурс делать задачу и слать ей сообщения. Иногда это разумно, иногда разумнее использовать мютекс. Панацеи нет. То, что в большинстве библиотек не используются мютексы - логично, потому что в большинстве случаев мютексы должны уже использоваться в самом приложении, а не в библиотеке. Взять вот тот же пример с флешкой: допустим, я оформлю библиотеку для чтения-записи во флеш в виде библиотеки. Если в приложении эта библиотека будет использоваться, например, только из одной задачи, то и мютекс тут необязателен. Так зачем включать его использование в либу? Разумнее сделать так: обязать пользователя реализовать две функции: lock() / unlock(), и при работе с флешкой вызывать их. Если пользователь либы решит использовать мютекс, он будет его использовать в этих lock() / unlock(). А может, он решит как-то иначе обеспечивать атомарный доступ, а может вообще не нужна ему блокировка, тогда он оставит эти функции пустыми, и все. У меня в среднего размера проекте обычно 5-7 задач и около 10 мютексов, если что. Вообще, рассуждать на эти темы нет особого желания. Если человек утверждает, что мютексы-де не нужны, то обычно получается просто религиозный спор. Как я уже сказал, да, можно все написать и без мютексов, и без РТОС, и т.д.
|
|
|
|
|
Jan 18 2015, 21:42
|

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

|
Цитата(dimonomid @ Jan 18 2015, 15:15)  То, что многие эмбеддеры не знают, зачем нужны мютексы, не новость: вот яркий пример http://www.microchip.su/showthread.php?p=1...near#post185067 . Да что там мютексы, многие не знают зачем нужна РТОС. Типа, и так можно написать. Спорить не буду - можно и без мютексов написать, и без РТОС, и без C, и т.д. Вот очень хорошая небольшая статья на тему мютексов и семафоров http://www.barrgroup.com/Embedded-Systems/...Mutex-SemaphoreВкратце, мютекс нужен для доступа к разделяемому ресурсу. Например, если в двух (или более) задачах используется, скажем, внешняя SPI-флешка, т.е. они обе эту флешку читают/пишут, то нужно быть уверенным в том, что они не будут друг другу мешать работать с флешкой. С этим не будете спорить? Да, на форуме microchip.su некто клаccно отмахнулся. Дескать нет таких примеров где абсолютно необходим мьютекс. Как и нет таких примеров где нельзя без RTOS. Да вот примеров где нельзя без RTOS навалом. Намедни я вон даже у ардуино RTOS обнаружил. Статья на barrgroup.com в принципе правильная. И указывает однозначно, что необходимость в мьютексах возникает при наличии некой третьей мешающей задачи. В сценарии SPI я не вижу третьей задачи которая вмешалась бы и нарушила работу планировщика на основе Rate Monotonic Algorithm (RMA) Более того если задача обращается к разделяемому ресурсу я ее сразу же перестаю считать realtime задачей, а следовательно и принцип RMA на нее не распространяю. Т.е. ей и мьютекс уже как бы не требуется. Тут я вижу некое противоречие. Вот скажите честно, вы применяете теорию RMA на практике? Оцениваете точно длительности выполнения всех задач? У вас все задачи всегда выполняются в строго отведенное известное время?
|
|
|
|
|
Jan 18 2015, 22:52
|
Участник

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

|
Цитата(AlexandrY @ Jan 19 2015, 02:42)  Да, на форуме microchip.su некто клаccно отмахнулся. Дескать нет таких примеров где абсолютно необходим мьютекс. Как и нет таких примеров где нельзя без RTOS.
Да вот примеров где нельзя без RTOS навалом. Намедни я вон даже у ардуино RTOS обнаружил. Действительно нет примеров где нельзя без РТОС. Всякими суперлупами и прочими недо-РТОСовыми решениями можно что угодно написать. Другое дело, разумно ли.. Цитата(AlexandrY @ Jan 19 2015, 02:42)  ... необходимость в мьютексах возникает при наличии некой третьей мешающей задачи. В сценарии SPI я не вижу третьей задачи которая вмешалась бы и нарушила работу планировщика на основе Rate Monotonic Algorithm (RMA) Зачем третья задача? Двух задач, использующих флешку без блокировки этого ресурса, достаточно для нарушения нормальной работы. Например, предположим что для записи во флеш нужно сначала передать по SPI команду на запись, потом адрес, потом передавать данные для записи. И есть две задачи: А хочет записать какие-то 100 байт по адресу 0x1000, Б хочет записать 100 байт по адресу 0x2000. Теперь последовательность без мютекса: * Задача А передает команду на запись и адрес 0x1000 * Задача А начинает передавать данные для записи - передала 10 байт из 100 * Высокоприоритетная задача Б вытесняет задачу А * Задача Б передает команду на запись и адрес 0x2000 * Задача Б передает данные для записи - 100 байт * Задача Б уходит в ожидание, управление передается задаче А * Задача А продолжает передавать данные - передает оставшиеся 90 байт, но они уже будут записаны не туда, куда нужно. Цитата(AlexandrY @ Jan 19 2015, 02:42)  Вот скажите честно, вы применяете теорию RMA на практике? Оцениваете точно длительности выполнения всех задач? У вас все задачи всегда выполняются в строго отведенное известное время? Нет. Цитата(Xenia @ Jan 19 2015, 03:14)  В этой связи у меня к вам просьба похаять FreeRTOS, указав на присущие ей недостатки, но которые отсутствуют у TNKernel/TNeo. Не буду хаять, извините, потому что сам всерьез и не использовал. От коллег, имевших опыт работы как с FreeRTOS, так и с TNKernel, наслушался, что FreeRTOS очень медленная по сравнению с TN: назывались цифры типа от момента отправки сообщения в задачу до получения задачей управления происходит примерно в 2 раза больше инструкций, чем в случае с TN. Но сам я все это не проверял, так что ручаться не буду. Может когда-нибудь и дойдут руки до подобных сравнений, но пока нет. Есть более важные вещи. Вообще, по чесноку, я на вашем месте, наверное, взял бы FreeRTOS и не парился. Если не будете успевать - возьмите железо мощнее.  Ведь, как вы заметили, над FreeRTOS работает команда, а не один человек, так что шансы на то, что проект вдруг перестанет поддерживаться, у FreeRTOS гораздо ниже. TNKernel вот уже, фактически, не поддерживается; TNeo сегодня поддерживается, а завтра - неизвестно.
|
|
|
|
Сообщений в этой теме
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 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 Aner Философия однако, не даром западные программисты в... Jan 19 2015, 18:08 dimonomid Цитата(Aner @ Jan 19 2015, 22:08) Для ког... Jan 19 2015, 18:50  AlexandrY Цитата(dimonomid @ Jan 19 2015, 20:50) Ис... Jan 19 2015, 20:35   dimonomid Цитата(AlexandrY @ Jan 20 2015, 00:35) Ну... Jan 19 2015, 21:14    AlexandrY Цитата(dimonomid @ Jan 19 2015, 23:14) Не... Jan 20 2015, 07:09     dimonomid Цитата(AlexandrY @ Jan 20 2015, 11:09) Ну... Jan 20 2015, 08:03      LightElf QUOTE (dimonomid @ Jan 20 2015, 12:03) Хо... Jan 20 2015, 09:46       dimonomid Цитата(LightElf @ Jan 20 2015, 13:46) Но ... Jan 20 2015, 10:55      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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|