|
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.
|
|
|
|
|
 |
Ответов
|
Apr 8 2015, 10:03
|
Участник

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

|
Так, отставить, я ерунду написал в прошлом сообщении: для TNeo-то я взял существующий настроенный проект, а для FreeRTOS создал новый, и забыл в нем оптимизацию включить. Пардон.
Так что отличия поскромнее:
В TNeo: 624 тиков (594 с отключенной проверкой переполнения стека), в FreeRTOS: 863 тиков (699 с отключенной проверкой переполнения стека).
|
|
|
|
|
Apr 8 2015, 13:42
|
Частый гость
 
Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205

|
QUOTE (dimonomid @ Apr 8 2015, 13:03)  Так, отставить, я ерунду написал в прошлом сообщении: для TNeo-то я взял существующий настроенный проект, а для FreeRTOS создал новый, и забыл в нем оптимизацию включить. Пардон.
Так что отличия поскромнее:
В TNeo: 624 тиков (594 с отключенной проверкой переполнения стека), в FreeRTOS: 863 тиков (699 с отключенной проверкой переполнения стека). Насколько я помню, автор FreeRTOS всегда упирал на большую предсказуемость. Т.е. две задачи - не показатель, а вот что будет с 20 задачами - вопрос интересный. Простой пример: TNeo реализует таймеры как callback-и из обработчика таймерного прерывания (я не ошибся?). Какой смысл говорить о времени переключения контекста в таком раскладе? Переключение реально не произойдет до тех пор, пока не будут отработаны все таймеры. Т.е. задержка не детерминирована, совсем.
Сообщение отредактировал LightElf - Apr 8 2015, 14:20
|
|
|
|
|
Apr 8 2015, 14:02
|
Участник

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

|
Цитата(LightElf @ Apr 8 2015, 17:42)  Насколько я помню, автор FreeRTOS всегда упирал на большую предсказуемость. Т.е. две задачи - не показатель, а вот что будет с 20 задачами - вопрос интересный. Как в FreeRTOS - не знаю, а в TNeo, как и в TNKernel, количество задач не влияет на скорость переключения контекста: для каждого приоритета есть связанный список задач, готовых к запуску. И есть битовая маска, каждый бит которой отражает приоритет, в котором есть готовые к запуску задачи. Таким образом, когда ядро выясняет, какую задачу нужно запустить, оно делает следующее: - Находит номер младшего установленного бита в маске. Некоторые архитектуры имеют специальную инструкцию для этой операции ( Find first set). Если такой инструкции нет, то приходится вручную проверять каждый бит, но тогда время выполнения зависит не от количества задач, а от количества приоритетов. - Передает управление первой задаче из связанного списка для соответствующего приоритета. Время константное. Цитата(LightElf @ Apr 8 2015, 17:42)  Особенно такой скользкий параметр, как максимальная задержка входа в прерывание. От количества задач эта задержка тоже не зависит.
Сообщение отредактировал dimonomid - Apr 8 2015, 14:16
|
|
|
|
|
Apr 8 2015, 14:23
|
Частый гость
 
Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205

|
QUOTE (dimonomid @ Apr 8 2015, 17:02)  т количества задач эта задержка тоже не зависит. Хм. И по спискам задач (семафоров, мутексов и т.д.) под запрещенными прерываниями не ходите?
|
|
|
|
|
Apr 8 2015, 14:38
|
Участник

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

|
Цитата(LightElf @ Apr 8 2015, 18:23)  Хм. И по спискам задач (семафоров, мутексов и т.д.) под запрещенными прерываниями не ходите? Мда, поторопился я ответить.  Прямой зависимости от количества задач нет, но, действительно, критические секции добавляют задержку: если говорить про мютексы, то чем больше задач одновременно ожидают мютекс, тем больше времени требуется, чтобы определить приоритет той задачи, которая захватила этот мютекс. Вы правы. Другое дело, что на некоторых платформах (пока только dsPIC/PIC24) есть возможность запрещать в критических секциях не все прерывания, а только определенный диапазон приоритетов прерываний. Но тогда из остальных прерываний нельзя вызывать сервисы ядра.
|
|
|
|
|
Apr 8 2015, 14:46
|
Частый гость
 
Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205

|
QUOTE (dimonomid @ Apr 8 2015, 17:38)  Мда, поторопился я ответить.  Прямой зависимости от количества задач нет, но, действительно, критические секции добавляют задержку: если говорить про мютексы, то чем больше задач одновременно ожидают мютекс, тем больше времени требуется, чтобы определить приоритет той задачи, которая захватила этот мютекс. Вы правы. Во! Значиццо есть куда стремиться.  Поскольку мутексы (по логике вещей) не используются из прерываний, логично было бы обойтись без критических секций в данном случае. QUOTE (dimonomid @ Apr 8 2015, 17:38)  Другое дело, что на некоторых платформах (пока только dsPIC/PIC24) есть возможность запрещать в критических секциях не все прерывания, а только определенный диапазон приоритетов прерываний. Но тогда из остальных прерываний нельзя вызывать сервисы ядра. Эта фишка во FreeRTOS тоже искаропки идет, как минимум на ARM Cortex-M3 и Renesas RX. Но описанные минусы напрягают.
|
|
|
|
|
Apr 8 2015, 14:56
|
Участник

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

|
Цитата(LightElf @ Apr 8 2015, 19:46)  Во! Значиццо есть куда стремиться.  Поскольку мутексы (по логике вещей) не используются из прерываний, логично было бы обойтись без критических секций в данном случае. Вам нужен AVIX тогда. http://avix-rt.com/ Она никогда не запрещает прерывания, вообще. Но денег стоит.
|
|
|
|
|
Apr 8 2015, 15:05
|
Частый гость
 
Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205

|
QUOTE (dimonomid @ Apr 8 2015, 17:56)  Вам нужен AVIX тогда. http://avix-rt.com/ Она никогда не запрещает прерывания, вообще. Но денег стоит. Это наверно оверкилл, хотя давно у меня чешется что-нить подобное наваять (естественно на архитектурах, где такое вообще возможно). Но речь здесь о TNeo vs FreeRTOS. Так вот, FreeRTOS под запрещенными прерываниями списки не обходит. Отсюда и "большие задержки".
|
|
|
|
|
Apr 8 2015, 15:13
|
Участник

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

|
Цитата(LightElf @ Apr 8 2015, 19:05)  Так вот, FreeRTOS под запрещенными прерываниями списки не обходит. Отсюда и "большие задержки". Хм. Насчет мютексов примерно ясно: действительно, можно запрещать только планировщик, а не все прерывания, т.к. мютексы в прерываниях не используются. Ок, но как, например, с таймерами? Если запущено много таймеров, то эту очередь надо как-то обслуживать, и чем больше таймеров в очереди, тем больше времени это занимает. Ладно, спасибо за инфу, когда будет время, попробую разобраться.
|
|
|
|
Сообщений в этой теме
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 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         LightElf QUOTE (dimonomid @ Apr 8 2015, 18:13) Хм.... Apr 8 2015, 15:29
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|