Гость MALLOY2 24 апреля, 2009 Опубликовано 24 апреля, 2009 · Жалоба Начинаю осваивать данную ось, до этого не имел дел с 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. Сильно не пинайте если вопросы уже обсуждались я просто не нашел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aurochs 0 25 апреля, 2009 Опубликовано 25 апреля, 2009 · Жалоба 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 17 мая, 2009 Опубликовано 17 мая, 2009 · Жалоба Цитата(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) и получил датааборт, что-то еще хранится там. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 17 мая, 2009 Опубликовано 17 мая, 2009 · Жалоба Я поставил из расчета R0-R15 + CPSR (16) и получил датааборт, что-то еще хранится там. Естественно хранится - смотрим port.c Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость MALLOY2 17 мая, 2009 Опубликовано 17 мая, 2009 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asd6715 0 14 июля, 2009 Опубликовано 14 июля, 2009 · Жалоба Не могу понять как реализована вытесняющая многозадачность во freeRTOS. Я работал с uC/OS-II. Так это делалось так, пример для АРМа: настраивался интервальный таймер PIT, который с заданой частотой и вызывал функцию OSTimeTick, которая уже и отдавала управление готовой на выполнения задачи с самым высоким приоритетом. Ну и после завершения обработки прерывания управление готовой на выполнения задачи с самым высоким приоритетом тоже отдаеться... Как это реализовывает во фриРТОС никак понять не могу, обьясните пожалуйста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HARMHARM 0 14 июля, 2009 Опубликовано 14 июля, 2009 · Жалоба Не могу понять как реализована вытесняющая многозадачность во freeRTOS. Я работал с uC/OS-II. Так это делалось так, пример для АРМа: настраивался интервальный таймер PIT, который с заданой частотой и вызывал функцию OSTimeTick, которая уже и отдавала управление готовой на выполнения задачи с самым высоким приоритетом. Ну и после завершения обработки прерывания управление готовой на выполнения задачи с самым высоким приоритетом тоже отдаеться... Как это реализовывает во фриРТОС никак понять не могу, обьясните пожалуйста. Точно так же, в вытесняющем режиме. Функция называется vPortPreemptiveTick. Есть еще и кооперативный режим. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asd6715 0 15 июля, 2009 Опубликовано 15 июля, 2009 · Жалоба Ещё не смог разобраться. Как фриРТОС работает с задачами с одинаковым приоритетом... Помогите разобраться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 15 июля, 2009 Опубликовано 15 июля, 2009 · Жалоба Ещё не смог разобраться. Как фриРТОС работает с задачами с одинаковым приоритетом... Помогите разобраться. Значит так - читаем документацию и задаем КОНКРЕТНЫЕ вопросы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asd6715 0 15 июля, 2009 Опубликовано 15 июля, 2009 · Жалоба Да Вы правы, полное занурение в документацию, это выход. Тогда просто просьба поделитесь пожалуйства примером кода со сборкой freertos для sam7 для простейшего примера. так скажем что бы все по минимуму. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 62 15 июля, 2009 Опубликовано 15 июля, 2009 · Жалоба Тогда просто просьба поделитесь пожалуйства примером кода со сборкой freertos для sam7 для простейшего примера. так скажем что бы все по минимуму. А чем примеры из \Demo не угодили? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 16 июля, 2009 Опубликовано 16 июля, 2009 · Жалоба Да Вы правы, полное занурение в документацию, это выход. Не юродствуйте - ответы на все ваши "вопросы" лежат в пределах нескольких минут чтения оглавления, причем даже не всего документа, а раздела Getting Started. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asd6715 0 19 июля, 2009 Опубликовано 19 июля, 2009 · Жалоба Не юродствуйте - ответы на все ваши "вопросы" лежат в пределах нескольких минут чтения оглавления, причем даже не всего документа, а раздела Getting Started.Дело в том что я начинающий и очень мало опыта, поэтому много понимаю с трудом. Вот прочитав документацию я так и не понял чем отличается Task от Co-Routine обьясните пожалуйста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
head_sk 0 19 июля, 2009 Опубликовано 19 июля, 2009 (изменено) · Жалоба Co-routines хороший функционал. Это реализация кооперативной RTOS внутри каждой задачи. Co-Routine это все задачи равны и передают управление друг другу. Tasks - одна задача выполняет роль операционной системы которая переключает задачи. Для Co-Routine есть куча ограничений: все переменные делать статическими, стек не сохраняется, не вызывать сервисы RTOS из вызываемых процедур и даже из switch конструкций и т.д. короче очень сильные ограничения. Co-Routine планируються (schedule) вызовом функции vCoRoutineSchedule (). Лучшее всего разместить вызов vCoRoutineSchedule () внутри idle hook. Это позволит tsak'ам и Co-Routine быть легко смешанными в пределах того же самого приложения. Сейчас гуру меня поправят если я не прав, Изменено 19 июля, 2009 пользователем head_sk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
qwerty 0 21 июля, 2009 Опубликовано 21 июля, 2009 · Жалоба :1111493779: Господа, а не у кого нет документов "Using the FreeRTOS Real Time Kernel - A Practical Guide" and the reference manual "FreeRTOS Reference Manual - API functions and Configuration Options" ? А то у меня проект на этой операционке, а начальство боится покупать (палить кредитки) в инете :laughing: . Скинте плиз на мыло. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться