реклама на сайте
подробности

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> FreeRTOS общие вопросы
MALLOY2
сообщение Apr 24 2009, 13:33
Сообщение #1


Знающий
****

Группа: 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 както криво получается sad.gif

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



P.S. Сильно не пинайте если вопросы уже обсуждались я просто не нашел.
Go to the top of the page
 
+Quote Post
Aurochs
сообщение Apr 25 2009, 22:13
Сообщение #2


Ортодокс
***

Группа: Свой
Сообщений: 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 ?

Да, можно и даже смело smile.gif

Цитата(MALLOY2 @ Apr 24 2009, 16:33) *
3. Какой нужен размер стека для SVC режима ?

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

Цитата(MALLOY2 @ Apr 24 2009, 16:33) *
4. Судя из обвертки IRQHandler прерывания не могут быть вложенными. От сюда размер стека для IRQ задается по задаче максимально его используемого или не так ? Для тиков используется прерываение от таймера в нем вызывается функция vTaskSwitchContext(); она получается работает в режиме IRQ. Установив брекпоин в этой функции оказалось что в ходе работы она работает в 2 режимах IRQ и SVC както криво получается sad.gif

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

Цитата(MALLOY2 @ Apr 24 2009, 16:33) *
5. Существует минимальный размер стека для задачи ?

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

Цитата(MALLOY2 @ Apr 24 2009, 16:33) *
или в каком стеке хранится контекст задачи в стеке задачи или в стеке режима SVC ?

В стеке задачи
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение May 17 2009, 16:17
Сообщение #3


Знающий
****

Группа: 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) и получил датааборт, что-то еще хранится там.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 17 2009, 18:01
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(MALLOY2 @ May 17 2009, 19:17) *
Я поставил из расчета R0-R15 + CPSR (16) и получил датааборт, что-то еще хранится там.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение May 17 2009, 18:29
Сообщение #5


Знающий
****

Группа: 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.
Go to the top of the page
 
+Quote Post
asd6715
сообщение Jul 14 2009, 07:49
Сообщение #6


Участник
*

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



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

Как это реализовывает во фриРТОС никак понять не могу, обьясните пожалуйста.
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Jul 14 2009, 22:30
Сообщение #7


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(asd6715 @ Jul 14 2009, 10:49) *
Не могу понять как реализована вытесняющая многозадачность во freeRTOS.
Я работал с uC/OS-II. Так это делалось так, пример для АРМа: настраивался интервальный таймер PIT, который с заданой частотой и вызывал функцию OSTimeTick, которая уже и отдавала управление готовой на выполнения задачи с самым высоким приоритетом. Ну и после завершения обработки прерывания управление готовой на выполнения задачи с самым высоким приоритетом тоже отдаеться...

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

Точно так же, в вытесняющем режиме. Функция называется vPortPreemptiveTick.
Есть еще и кооперативный режим.
Go to the top of the page
 
+Quote Post
asd6715
сообщение Jul 15 2009, 10:03
Сообщение #8


Участник
*

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



Ещё не смог разобраться. Как фриРТОС работает с задачами с одинаковым приоритетом... Помогите разобраться.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 15 2009, 11:06
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(asd6715 @ Jul 15 2009, 13:03) *
Ещё не смог разобраться. Как фриРТОС работает с задачами с одинаковым приоритетом... Помогите разобраться.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
asd6715
сообщение Jul 15 2009, 23:06
Сообщение #10


Участник
*

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



Да Вы правы, полное занурение в документацию, это выход.
Тогда просто просьба поделитесь пожалуйства примером кода со сборкой freertos для sam7 для простейшего примера. так скажем что бы все по минимуму.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 15 2009, 23:19
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(asd6715 @ Jul 16 2009, 03:06) *
Тогда просто просьба поделитесь пожалуйства примером кода со сборкой freertos для sam7 для простейшего примера. так скажем что бы все по минимуму.

А чем примеры из \Demo не угодили?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 16 2009, 08:17
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(asd6715 @ Jul 16 2009, 02:06) *
Да Вы правы, полное занурение в документацию, это выход.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
asd6715
сообщение Jul 19 2009, 08:08
Сообщение #13


Участник
*

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



Цитата(zltigo @ Jul 16 2009, 11:17) *
Не юродствуйте - ответы на все ваши "вопросы" лежат в пределах нескольких минут чтения оглавления, причем даже не всего документа, а раздела Getting Started.
Дело в том что я начинающий и очень мало опыта, поэтому много понимаю с трудом. Вот прочитав документацию я так и не понял чем отличается
Task от Co-Routine обьясните пожалуйста.
Go to the top of the page
 
+Quote Post
head_sk
сообщение Jul 19 2009, 08:19
Сообщение #14


Частый гость
**

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



Co-routines хороший функционал. Это реализация кооперативной RTOS внутри каждой задачи.
Co-Routine это все задачи равны и передают управление друг другу.
Tasks - одна задача выполняет роль операционной системы которая переключает задачи.

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

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

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

Сообщение отредактировал head_sk - Jul 19 2009, 08:40
Go to the top of the page
 
+Quote Post
qwerty
сообщение Jul 21 2009, 05:11
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 22-07-07
Из: нск
Пользователь №: 29 291



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

5 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th June 2025 - 12:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01899 секунд с 7
ELECTRONIX ©2004-2016