Перейти к содержанию
    

Гость MALLOY2

Начинаю осваивать данную ось, до этого не имел дел с 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. Сильно не пинайте если вопросы уже обсуждались я просто не нашел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 ?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость MALLOY2
Цитата(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) и получил датааборт, что-то еще хранится там.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость MALLOY2

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

 

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

 

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

Изменено пользователем head_sk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...