Jump to content

    

FreeRTOS общие вопросы

Начинаю осваивать данную ось, до этого не имел дел с RTOS для встраиваемых систем. Имею опыт работы на винде с много поточными приложениями.

Скачав последнюю версию и взяв оттуда порт под IAR str912.

Для старта использую иарвский менагер памяти. Создал две задачи обе просто мигают светодиодами, сразу напоролся на грабли с стеками, оказалось размер стека задается не в байтах, а в тугриках с размером portSTACK_TYPE, в этом есть свой смысл но вот в описании что то я об этом нигде не встретил.

 

Вопросы будут касательно стеков и режимов работы ядра ARM.

 

1. В каких режимах работает процессор ?

Пока ястно одно в майн он попадает в режиме SVC, в тасках он в режиме SYS, переключение задач выполняется по SWI 0, а другие функции кернела в каком режиме работают ?

 

2. Режимы FIQ, Abort и UND наверное не интересно так как пока они не используются. CSTACK используется в режимах SYS и USR этот стек где нибудь используется или смело можно ставить 0 ?

 

3. Какой нужен размер стека для SVC режима ?

 

4. Судя из обвертки IRQHandler прерывания не могут быть вложенными. От сюда размер стека для IRQ задается по задаче максимально его используемого или не так ? Для тиков используется прерываение от таймера в нем вызывается функция vTaskSwitchContext(); она получается работает в режиме IRQ. Установив брекпоин в этой функции оказалось что в ходе работы она работает в 2 режимах IRQ и SVC както криво получается :(

 

5. Существует минимальный размер стека для задачи ? или в каком стеке хранится контекст задачи в стеке задачи или в стеке режима SVC ?

 

 

 

P.S. Сильно не пинайте если вопросы уже обсуждались я просто не нашел.

Share this post


Link to post
Share on other sites
1. В каких режимах работает процессор ?

Пока ястно одно в майн он попадает в режиме SVC, в тасках он в режиме SYS, переключение задач выполняется по SWI 0, а другие функции кернела в каком режиме работают ?

В том же режиме, что и вызывающая их задача.

 

2. Режимы FIQ, Abort и UND наверное не интересно так как пока они не используются. CSTACK используется в режимах SYS и USR этот стек где нибудь используется или смело можно ставить 0 ?

Да, можно и даже смело :)

 

3. Какой нужен размер стека для SVC режима ?

Такой, чтобы его хватило для работы до запуска шедулера (или, возможно, после его останова)

 

4. Судя из обвертки IRQHandler прерывания не могут быть вложенными. От сюда размер стека для IRQ задается по задаче максимально его используемого или не так ? Для тиков используется прерываение от таймера в нем вызывается функция vTaskSwitchContext(); она получается работает в режиме IRQ. Установив брекпоин в этой функции оказалось что в ходе работы она работает в 2 режимах IRQ и SVC както криво получается :(

В чем кривизна то? Код все равно построен так, что функция vTaskSwitchContext() не будет одновременно выполняться и в том и в другом режиме. По поводу IRQ стека выводы Ваши верные, но только советую все равно задавать его с запасом - при его переполнении уж очень трудно диагностируемые дефекты могут возникать...

 

5. Существует минимальный размер стека для задачи ?

В файле FreeRTOSConfig.h он задается параметром configMINIMAL_STACK_SIZE

 

или в каком стеке хранится контекст задачи в стеке задачи или в стеке режима SVC ?

В стеке задачи

Share this post


Link to post
Share on other sites
Цитата(MALLOY2 @ Apr 24 2009, 16:33) *

3. Какой нужен размер стека для SVC режима ?

 

Такой, чтобы его хватило для работы до запуска шедулера (или, возможно, после его останова)

 

а причем тут время до запуска шедулера, ведь сам шедулер работает в режиме SVC и что он стеку не хавает ?

 

 

В чем кривизна то? Код все равно построен так, что функция vTaskSwitchContext() не будет одновременно выполняться и в том и в другом режиме. По поводу IRQ стека выводы Ваши верные, но только советую все равно задавать его с запасом - при его переполнении уж очень трудно диагностируемые дефекты могут возникать...

 

для одного и друго стека надо учитывать потребление стека функцией vTaskSwitchContext();

 

 

Цитата(MALLOY2 @ Apr 24 2009, 16:33) *

5. Существует минимальный размер стека для задачи ?

 

В файле FreeRTOSConfig.h он задается параметром configMINIMAL_STACK_SIZE

 

Убил, так какой туда размер поставить ? сколько минимум стека надо, зная что моя задача не требует вообще стека для своих целей?

Я поставил из расчета R0-R15 + CPSR (16) и получил датааборт, что-то еще хранится там.

Share this post


Link to post
Share on other sites
Я поставил из расчета R0-R15 + CPSR (16) и получил датааборт, что-то еще хранится там.

Естественно хранится - смотрим port.c

Share this post


Link to post
Share on other sites

portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters )
{
    portSTACK_TYPE *pxOriginalTOS;
    pxOriginalTOS = pxTopOfStack;
    *pxTopOfStack = ( portSTACK_TYPE ) pxCode + portINSTRUCTION_SIZE;        
    pxTopOfStack--;
    *pxTopOfStack = ( portSTACK_TYPE ) 0xaaaaaaaa;    /* R14 */
    pxTopOfStack--;    
    *pxTopOfStack = ( portSTACK_TYPE ) pxOriginalTOS; /* Stack used when task starts goes in R13. */
    pxTopOfStack--;
    *pxTopOfStack = ( portSTACK_TYPE ) 0x12121212;    /* R12 */
    pxTopOfStack--;    
    *pxTopOfStack = ( portSTACK_TYPE ) 0x11111111;    /* R11 */
    pxTopOfStack--;    
    *pxTopOfStack = ( portSTACK_TYPE ) 0x10101010;    /* R10 */
    pxTopOfStack--;    
    *pxTopOfStack = ( portSTACK_TYPE ) 0x09090909;    /* R9 */
    pxTopOfStack--;    
    *pxTopOfStack = ( portSTACK_TYPE ) 0x08080808;    /* R8 */
    pxTopOfStack--;    
    *pxTopOfStack = ( portSTACK_TYPE ) 0x07070707;    /* R7 */
    pxTopOfStack--;    
    *pxTopOfStack = ( portSTACK_TYPE ) 0x06060606;    /* R6 */
    pxTopOfStack--;    
    *pxTopOfStack = ( portSTACK_TYPE ) 0x05050505;    /* R5 */
    pxTopOfStack--;    
    *pxTopOfStack = ( portSTACK_TYPE ) 0x04040404;    /* R4 */
    pxTopOfStack--;    
    *pxTopOfStack = ( portSTACK_TYPE ) 0x03030303;    /* R3 */
    pxTopOfStack--;    
    *pxTopOfStack = ( portSTACK_TYPE ) 0x02020202;    /* R2 */
    pxTopOfStack--;    
    *pxTopOfStack = ( portSTACK_TYPE ) 0x01010101;    /* R1 */
    pxTopOfStack--;    
    *pxTopOfStack = ( portSTACK_TYPE ) pvParameters; /* R0 */
    pxTopOfStack--;
    *pxTopOfStack = ( portSTACK_TYPE ) portINITIAL_SPSR;
    pxTopOfStack--;
    *pxTopOfStack = portNO_CRITICAL_NESTING;
    return pxTopOfStack;    
}

 

Я так понимаю по этому коду можно сказать что минимальный размер стека должен быть 18.

Share this post


Link to post
Share on other sites

Не могу понять как реализована вытесняющая многозадачность во freeRTOS.

Я работал с uC/OS-II. Так это делалось так, пример для АРМа: настраивался интервальный таймер PIT, который с заданой частотой и вызывал функцию OSTimeTick, которая уже и отдавала управление готовой на выполнения задачи с самым высоким приоритетом. Ну и после завершения обработки прерывания управление готовой на выполнения задачи с самым высоким приоритетом тоже отдаеться...

 

Как это реализовывает во фриРТОС никак понять не могу, обьясните пожалуйста.

Share this post


Link to post
Share on other sites
Не могу понять как реализована вытесняющая многозадачность во freeRTOS.

Я работал с uC/OS-II. Так это делалось так, пример для АРМа: настраивался интервальный таймер PIT, который с заданой частотой и вызывал функцию OSTimeTick, которая уже и отдавала управление готовой на выполнения задачи с самым высоким приоритетом. Ну и после завершения обработки прерывания управление готовой на выполнения задачи с самым высоким приоритетом тоже отдаеться...

 

Как это реализовывает во фриРТОС никак понять не могу, обьясните пожалуйста.

Точно так же, в вытесняющем режиме. Функция называется vPortPreemptiveTick.

Есть еще и кооперативный режим.

Share this post


Link to post
Share on other sites

Ещё не смог разобраться. Как фриРТОС работает с задачами с одинаковым приоритетом... Помогите разобраться.

Share this post


Link to post
Share on other sites
Ещё не смог разобраться. Как фриРТОС работает с задачами с одинаковым приоритетом... Помогите разобраться.

Значит так - читаем документацию и задаем КОНКРЕТНЫЕ вопросы.

Share this post


Link to post
Share on other sites

Да Вы правы, полное занурение в документацию, это выход.

Тогда просто просьба поделитесь пожалуйства примером кода со сборкой freertos для sam7 для простейшего примера. так скажем что бы все по минимуму.

Share this post


Link to post
Share on other sites
Тогда просто просьба поделитесь пожалуйства примером кода со сборкой freertos для sam7 для простейшего примера. так скажем что бы все по минимуму.

А чем примеры из \Demo не угодили?

Share this post


Link to post
Share on other sites
Да Вы правы, полное занурение в документацию, это выход.

Не юродствуйте - ответы на все ваши "вопросы" лежат в пределах нескольких минут чтения оглавления, причем даже не всего документа, а раздела Getting Started.

Share this post


Link to post
Share on other sites
Не юродствуйте - ответы на все ваши "вопросы" лежат в пределах нескольких минут чтения оглавления, причем даже не всего документа, а раздела Getting Started.
Дело в том что я начинающий и очень мало опыта, поэтому много понимаю с трудом. Вот прочитав документацию я так и не понял чем отличается

Task от Co-Routine обьясните пожалуйста.

Share this post


Link to post
Share on other sites

Co-routines хороший функционал. Это реализация кооперативной RTOS внутри каждой задачи.

Co-Routine это все задачи равны и передают управление друг другу.

Tasks - одна задача выполняет роль операционной системы которая переключает задачи.

 

Для Co-Routine есть куча ограничений: все переменные делать статическими, стек не сохраняется, не вызывать сервисы RTOS из вызываемых процедур и даже из switch конструкций и т.д. короче очень сильные ограничения.

 

Co-Routine планируються (schedule) вызовом функции vCoRoutineSchedule (). Лучшее всего разместить вызов vCoRoutineSchedule () внутри idle hook. Это позволит tsak'ам и Co-Routine быть легко смешанными в пределах того же самого приложения.

 

Сейчас гуру меня поправят если я не прав,

Edited by head_sk

Share this post


Link to post
Share on other sites

:1111493779: Господа, а не у кого нет документов "Using the FreeRTOS Real Time Kernel - A Practical Guide" and the reference manual "FreeRTOS Reference Manual - API functions and Configuration Options" ? А то у меня проект на этой операционке, а начальство боится покупать (палить кредитки) в инете :laughing: . Скинте плиз на мыло.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this