|
RTOS, тупые вопросы |
|
|
|
Jun 3 2016, 12:47
|

Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 10-12-04
Из: Earth
Пользователь №: 1 437

|
Привет, друзья!
Вот изучаю как делают RTOS и имею ряд нубских вопросов:
1. Для чего каждая задача в ртосах оформляется в вечный цикл? Чтобы не быть завершенной и забытой "естественным путем"? А если задача больше не нужна, то ее надо прибивать самому с помощью какой-нибудь, условно говоря, os_task_kill(this_task)? 2. Конкретно под Cortex-M4. Как понять какие именно регистры сохранять, а какие - не сохранять при переключении контекста (не считая R0-R3, SP, LR, PC)? 3. Для начала достаточно ли будет делать только переключение контекста в PendSV_Handler шедулером или есть еще какие-либо тонкости? 4. Где физически находятся все эти стеки, на которые указывают регистры?
Спасибо!
|
|
|
|
|
Jun 3 2016, 13:18
|

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

|
Цитата(spectr @ Jun 3 2016, 15:47)  Спасибо! Не в каждой RTOS надо делать в задачах циклы. В MQX RTOS когда задача доходит до конца ее RTOS стирает из системы без следа а заодно и все ресурсы которые задача захватила, и освобождает все объекты синхронизации захваченные задачей и не освобожденные ею. Какие регистры сохранять решает компилятор на основании соглашения с производителем чипов. Для ARM есть такое соглашение которое соблюдают все производители компиляторов под ARM. В вытесняющих RTOS есть как минимум два типа переключателей контекста: переключатель по прерываниям и переключатель программный. Стеки где скажете там и будут. Можно выделить статически, можно динамически при создании задач. Динамически выделяются из менеджеров памяти которые сами память распределяют из статических областей. Сами области указываются в конфигурационном файле линковщика.
|
|
|
|
|
Jun 6 2016, 05:35
|

Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 10-12-04
Из: Earth
Пользователь №: 1 437

|
Цитата(AlexandrY @ Jun 3 2016, 16:18)  Не в каждой RTOS надо делать в задачах циклы. В MQX RTOS когда задача доходит до конца ее RTOS стирает из системы без следа а заодно и все ресурсы которые задача захватила, и освобождает все объекты синхронизации захваченные задачей и не освобожденные ею. Понятно, т.е. если задача не удаляется, то после завершения остается висеть в idle и шедулер ее в общем случае тупо пропускает при переключениях? Цитата(AlexandrY @ Jun 3 2016, 16:18)  Какие регистры сохранять решает компилятор на основании соглашения с производителем чипов. Для ARM есть такое соглашение которое соблюдают все производители компиляторов под ARM. Эммм, извините конечно, но может быть это решает разработчик ОС, а не компилятор? Не просто так же ручками пишется асмовый код для сохранения именно этих, вот этих и еще вон тех регистров. Цитата(yes @ Jun 3 2016, 16:22)  2. в порте RTOS уже сделано. если собираетесь портировать, то вообще-то сохраняют все регистры - так как в общем случае переключение задачи асинхронно к процессу - то есть может произойти в любой момент, а вернуться нужно туда же в том же состоянии. 3. какая RTOS? Не портирую, а пишу свой велосипед. Чисто из интереса и ради лулзов. Цитата(AlexandrY @ Jun 3 2016, 18:14)  Есть и другие ухищрения при переключении контекста для уменьшения количества сохраняемых регистров. А можно парочку примеров?
|
|
|
|
|
Jun 6 2016, 12:05
|

Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 10-12-04
Из: Earth
Пользователь №: 1 437

|
Вопрос по стеку задачи. У каждой задачи есть свой стек, в котором хранятся все её локальные переменные, указатели "на куда-то туда и вон туда", а также указатели на стеки вызываемых внутри функций. Верно? Но регистров-то у процессора не бесконечное количество - всего с десяток-другой штук. А если в одной задаче переменных 30 штук используется и регистров не хватит, то что тогда? Цитата(ViKo @ Jun 6 2016, 14:33)  Что-то мне кажется, сохранять все регистры проще, чем шарить по всем функциям задачи, выискивая, какие регистры используются. Ради чего такие муки? Нескольких тактов, нескольких байтов? Согласен что проще сохранять/восстанавливать все подряд. Ну я думал, может это моветон так просто и четко делать.
|
|
|
|
|
Jun 6 2016, 12:19
|
Гуру
     
Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640

|
Цитата(spectr @ Jun 6 2016, 08:35)  Не портирую, а пишу свой велосипед. Чисто из интереса и ради лулзов. посмотреть советую 1) scmrtos (сильно связана с данным форумом  2) uc-os там есть книжка, которую автор, наверно, писал, когда сам пытался разобраться. на мой взгляд слегка колхозно (не помню уже что и как, но такое впечатление осталось) - но все понятно. 3) freeRTOS - серьезный проект с кучей саппорта и т.д. еще есть всякие ecos, rtems у всего перечисленного ++ в том, что доступны исходники. --------- про MQX - не пользовал. к пропиентарным "осям" испытываю некое предубеждение - когда начнешь разбираться, выяснится, что за что-то нужно платить, лицензировать и т.д. тем более она под тяжелые процессоры (если не ошибаюсь под i.mx-ы), для которых тот же линукс есть...
|
|
|
|
|
Jun 6 2016, 12:38
|

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

|
Цитата(yes @ Jun 6 2016, 15:19)  про MQX - не пользовал. к пропиентарным "осям" испытываю некое предубеждение - когда начнешь разбираться, выяснится, что за что-то нужно платить, лицензировать и т.д. тем более она под тяжелые процессоры (если не ошибаюсь под i.mx-ы), для которых тот же линукс есть... Скорее так: scmrtos - это не то что RTOS, а такой же велосипед как тут думает делать TC. А на велосипеды доки не бывает в принципе. Т.е. это не пример для изучения. uC/OS это безусловно сила. Именно её и надо изучать OSестроителям за интерес. freeRTOS деньги зарабатывает на том, что не дает бесплатно мануала, а продает его. Это очень некрасиво. Куча авторов кое-как и фрагментарно описывают FreeRTOS, но это все не то ради чего стоит копаться. А вот если надо изучить RTOS и одновременно сделать Вещь, то MQX самое то. MQX по движку аналогична uC/OS и freeRTOS. К линуксу никакого отношения не имеет. Если не думать что родство с линуксом определяется по наличию функций read и write в структурах драйверов. Путаница с линуксом может возникнуть от того, что в MQX есть стек межзадачного взаимодействия портированный в частности и на линукс. Поэтому MQX очень легко связать с линуксом в мультикристальных SoC-ах
|
|
|
|
|
Jun 7 2016, 05:51
|
Участник

Группа: Свой
Сообщений: 52
Регистрация: 7-11-05
Из: Чебоксары
Пользователь №: 10 546

|
Цитата(AlexandrY @ Jun 6 2016, 15:38)  MQX по движку аналогична uC/OS и freeRTOS. А кому из них аналогичнее? Возврат из прерывания в MQX происходит как в uC/OS-II через выяснение и переключение на самую приоритетную из задач? Или как во FreeRTOS, прерывание может вернуть управление именно туда, что прервалось, без переключений контекста? MQX сейчас доступен для чего-либо, кроме kinetis? Судя по тому, что freescale.com редиректит на nxp.com, стоит ли ждать MQX для NXP?
|
|
|
|
|
Jun 7 2016, 06:43
|
Частый гость
 
Группа: Участник
Сообщений: 78
Регистрация: 7-04-10
Из: Пушкино
Пользователь №: 56 462

|
Цитата(spectr @ Jun 6 2016, 15:05)  Вопрос по стеку задачи. У каждой задачи есть свой стек, в котором хранятся все её локальные переменные, указатели "на куда-то туда и вон туда", а также указатели на стеки вызываемых внутри функций. Верно? Но регистров-то у процессора не бесконечное количество - всего с десяток-другой штук. А если в одной задаче переменных 30 штук используется и регистров не хватит, то что тогда? Начните с того, что поиграйтесь с дизасмом и посмотрите где и как компилятор размещает глобальные/локальные переменные, аргументы функций и прочее. Очень интересно и по-новому позволяет смотреть на свой код  А по велосипедству: сначала очень полезно почитать классику ( Танненбаум)) и полистать чужие реализации (замечательная статья про TNeo).
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|