|
|
  |
FreeRTOS общие вопросы |
|
|
|
Apr 24 2009, 13:33
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Начинаю осваивать данную ось, до этого не имел дел с 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. Сильно не пинайте если вопросы уже обсуждались я просто не нашел.
|
|
|
|
|
Apr 25 2009, 22:13
|
Ортодокс
  
Группа: Свой
Сообщений: 219
Регистрация: 26-10-07
Из: Смела, Украина
Пользователь №: 31 775

|
Цитата(MALLOY2 @ Apr 24 2009, 16:33)  1. В каких режимах работает процессор ? Пока ястно одно в майн он попадает в режиме SVC, в тасках он в режиме SYS, переключение задач выполняется по SWI 0, а другие функции кернела в каком режиме работают ? В том же режиме, что и вызывающая их задача. Цитата(MALLOY2 @ Apr 24 2009, 16:33)  2. Режимы FIQ, Abort и UND наверное не интересно так как пока они не используются. CSTACK используется в режимах SYS и USR этот стек где нибудь используется или смело можно ставить 0 ? Да, можно и даже смело  Цитата(MALLOY2 @ Apr 24 2009, 16:33)  3. Какой нужен размер стека для SVC режима ? Такой, чтобы его хватило для работы до запуска шедулера (или, возможно, после его останова) Цитата(MALLOY2 @ Apr 24 2009, 16:33)  4. Судя из обвертки IRQHandler прерывания не могут быть вложенными. От сюда размер стека для IRQ задается по задаче максимально его используемого или не так ? Для тиков используется прерываение от таймера в нем вызывается функция vTaskSwitchContext(); она получается работает в режиме IRQ. Установив брекпоин в этой функции оказалось что в ходе работы она работает в 2 режимах IRQ и SVC както криво получается  В чем кривизна то? Код все равно построен так, что функция vTaskSwitchContext() не будет одновременно выполняться и в том и в другом режиме. По поводу IRQ стека выводы Ваши верные, но только советую все равно задавать его с запасом - при его переполнении уж очень трудно диагностируемые дефекты могут возникать... Цитата(MALLOY2 @ Apr 24 2009, 16:33)  5. Существует минимальный размер стека для задачи ? В файле FreeRTOSConfig.h он задается параметром configMINIMAL_STACK_SIZE Цитата(MALLOY2 @ Apr 24 2009, 16:33)  или в каком стеке хранится контекст задачи в стеке задачи или в стеке режима SVC ? В стеке задачи
|
|
|
|
|
May 17 2009, 16:17
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Цитата Цитата(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) и получил датааборт, что-то еще хранится там.
|
|
|
|
|
May 17 2009, 18:29
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Код 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.
|
|
|
|
|
Jul 14 2009, 07:49
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 10-07-09
Пользователь №: 51 103

|
Не могу понять как реализована вытесняющая многозадачность во freeRTOS. Я работал с uC/OS-II. Так это делалось так, пример для АРМа: настраивался интервальный таймер PIT, который с заданой частотой и вызывал функцию OSTimeTick, которая уже и отдавала управление готовой на выполнения задачи с самым высоким приоритетом. Ну и после завершения обработки прерывания управление готовой на выполнения задачи с самым высоким приоритетом тоже отдаеться...
Как это реализовывает во фриРТОС никак понять не могу, обьясните пожалуйста.
|
|
|
|
|
Jul 15 2009, 10:03
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 10-07-09
Пользователь №: 51 103

|
Ещё не смог разобраться. Как фриРТОС работает с задачами с одинаковым приоритетом... Помогите разобраться.
|
|
|
|
|
Jul 15 2009, 23:06
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 10-07-09
Пользователь №: 51 103

|
Да Вы правы, полное занурение в документацию, это выход. Тогда просто просьба поделитесь пожалуйства примером кода со сборкой freertos для sam7 для простейшего примера. так скажем что бы все по минимуму.
|
|
|
|
|
Jul 19 2009, 08:08
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 10-07-09
Пользователь №: 51 103

|
Цитата(zltigo @ Jul 16 2009, 11:17)  Не юродствуйте - ответы на все ваши "вопросы" лежат в пределах нескольких минут чтения оглавления, причем даже не всего документа, а раздела Getting Started. Дело в том что я начинающий и очень мало опыта, поэтому много понимаю с трудом. Вот прочитав документацию я так и не понял чем отличается Task от Co-Routine обьясните пожалуйста.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|