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

 
 
5 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> FreeRTOS общие вопросы
zltigo
сообщение Jul 21 2009, 05:18
Сообщение #16


Гуру
******

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



Цитата(qwerty @ Jul 21 2009, 08:11) *

1. Нет.
2. А там ничего нет сверх того, что есть в Online.
3. Если горько надо Offline - сдерите копию сайта. На этом форуме такое несколько раз проделывали - можете и поискать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
AlexMad
сообщение Jul 23 2009, 12:56
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 262
Регистрация: 18-02-05
Из: SPb
Пользователь №: 2 743



Цитата(head_sk @ Jul 19 2009, 12:19) *
Co-routines хороший функционал. Это реализация кооперативной RTOS внутри каждой задачи.
Co-Routine это все задачи равны и передают управление друг другу.
Tasks - одна задача выполняет роль операционной системы которая переключает задачи.


А как Co-Routine относится к ресурсам по сравнению с Tasks? Ноги вопроса растут из примеров на АВР и АРМ. в Примерах с LPC используется Tasks. Я, вроде бы, разобрался, как там и что можно делать. А вот в примерах с АВР используется Co-Routine и при этом простое переключение
Цитата
Set the definition configUSE_PREEMPTION within Demo/AVR_ATMega323_WinAVR/FreeRTOSConfig.h to 1 to use pre-emption or 0 to use co-operative.
и перенос задачи из проекта на АРМ в проект с АВР не прокатывает.

И вот вопрос - пример на АВР сделан Co-Routine просто чтобы показать возможности и мне нужно его покурить, чтобы запустить Tasks, или, все-таки, для АВР стоит использовать Co-Routine?



Хм... поторопился я. Там и Tasks тоже есть и они работают... а моя задача почему-то не стартует... будем искать где прокололся.
Go to the top of the page
 
+Quote Post
asd6715
сообщение Jul 25 2009, 13:23
Сообщение #18


Участник
*

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



Не ругайте строго не могу найти функцию. В uc/os-II есть такая функция как OSSchedLock, которая отключает диспетчеризацию. Есть ли во freeRTOS аналог этой функции?? Я искал - не нашел, так это из-за того что её там нет или плохо искал...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 25 2009, 13:33
Сообщение #19


Гуру
******

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



Цитата(asd6715 @ Jul 25 2009, 16:23) *
плохо искал...

Не полохо, а вообще не искали sad.gif
Раздел Kernel Control
void vTaskSuspendAll( void );
Suspends all real time kernel activity while keeping interrupts (including the kernel tick) enabled.
After calling vTaskSuspendAll () the calling task will continue to execute without risk of being swapped out until a call to xTaskResumeAll () has been made.
API functions that have the potential to cause a context switch (for example, vTaskDelayUntil(), xQueueSend(), etc.) must not be called while the scheduler is suspended.

Название, правда, неудачное, что и сам Автор признал используя в коммерческих версиях систем вместо этого разумные названия:
vTaskSuspendScheduler()/xTaskResumeScheduler();
Я у себя тоже переименовал smile.gif
Код
/*
zlt[    
   The function name is a little misleading, which is why, as part of the code review, the functions
   vTaskSuspendAll() and xTaskResumeAll() were renamed vTaskSuspendScheduler() and xTaskResumeScheduler()
   respectively for the SafeRTOS code
void vTaskSuspendAll( void );
*/
extern volatile unsigned portBASE_TYPE uxSchedulerSuspended;

#define vTaskSuspendScheduler()    { ++uxSchedulerSuspended; }
// ]zlt


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


Участник
*

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



Чесно признаюсь, просто прочитал название функции, подумал что это не то, и даже описание не читал, соррии
Go to the top of the page
 
+Quote Post
petrovichs
сообщение Aug 3 2009, 09:33
Сообщение #21





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



Не обьясните как толком пользоваться функцией vTaskStartTrace?
Я прописал
Код
#define configQUEUE_REGISTRY_SIZE       10
#define configUSE_TRACE_FACILITY    1

Далее вызвал
Код
vTaskStartTrace(TraceBuffer, 2000);

В эту область данных в двоичном формате начались записываться некие данные, как прочитать не понятно.
convtrce.exe я так нигде и не нашел.
Как получить из этой функции информацию подобную вот это?

Объясните если кто вкурсе, плз.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 3 2009, 09:48
Сообщение #22


Гуру
******

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



Цитата(petrovichs @ Aug 3 2009, 12:33) *
Как получить из этой функции информацию подобную вот это?

Так это к трассировке никакого отношения не имеет, это просто текущее состояние системы - там в буферок сразу текст сбрасывается.
Криво sad.gif
В оригинале что-то типа prvListTaskWithinSingleList() смотрите.

При наличии консоли, сразу в нее буфер печати и сбрасывать. У меня там еше сразу занятость стека проверяется и адрес TCB выдается. Выглядит так:
Цитата
ps
R 5 Console tcb=40003FB0:96/480
R 0 Idle tcb=400041D8:380/600
B 3 LAPD2 tcb=40005D80:144/480
B 3 LAPD3 tcb=40006540:144/480
B 3 LAPD1 tcb=400055C0:176/480
B 4 SPItx tcb=40004758:136/200
B 3 LAPD0 tcb=40004E00:208/480
B 2 HDLC0TX tcb=40004C28:152/400
B 2 HDLC1TX tcb=400053E8:152/400
B 2 HDLC2TX tcb=40005BA8:152/400
B 2 HDLC3TX tcb=40006368:152/400
B 1 Checker tcb=40006768:96/120


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
head_sk
сообщение Aug 3 2009, 10:42
Сообщение #23


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

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




Что-то подобное что есть на этой картинке можно получить с помощью вызова функции vTaskList(). Вообще task.c небольшой файлик, советую с ног до головы его просмотреть smile.gif
Go to the top of the page
 
+Quote Post
asd6715
сообщение Aug 3 2009, 14:13
Сообщение #24


Участник
*

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



Извините что задаю очень глупые вопросы. Но я ещё новичек, как не стараюсь понять некоторые вопросы так и не получаеться. Надеюсь на вашу помощь. Я не могу понять чем отличаються функции с концовкой "fromISR" и без этой концовки? А то я использую у себя в прерывании xSemaphoreGive и все вроде бы прекрасно работает smile.gif В чем разница и в чем загвоздка?
Go to the top of the page
 
+Quote Post
Faradey
сообщение Aug 5 2009, 11:07
Сообщение #25


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

Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638



сказать больше чем это сделали разработчик(-и) FreeRTOS сложно, поэтому прочтите сами:
API Usage - light weight


--------------------
Завтра пойму, что нужно было сделать вчера...
Go to the top of the page
 
+Quote Post
salvian
сообщение Aug 27 2009, 13:14
Сообщение #26


Участник
*

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



когда стартует шэдулер отключаются прерывания, а вот когда они включаются я найти не смог. не подскажет ли кто когда это происходит?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 27 2009, 13:33
Сообщение #27


Гуру
******

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



При восстановлении контекста в vPortISRStartFirstTask.
Go to the top of the page
 
+Quote Post
mariaoi
сообщение Oct 17 2009, 12:17
Сообщение #28


Участник
*

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



Здравствуйте. Не подскажите как во freeRTOS определить максимальный размер стека который занимал каждый процесс на протяжении своей работы?
Спасибо!
Go to the top of the page
 
+Quote Post
head_sk
сообщение Oct 17 2009, 14:23
Сообщение #29


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

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



В свое время для себя писал:

Код
#if ( configUSE_TRACE_FACILITY == 1 )

static void prvGetMaxStackSize( unsigned portLONG *pcWriteBuffer, xList *pxList, signed portCHAR cStatus )
    {
    volatile tskTCB *pxNextTCB, *pxFirstTCB;
    unsigned portSHORT usStackRemaining;

        /* Write the details of all the TCB's in pxList into the buffer. */
        listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList );
        do
        {
            listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList );
            usStackRemaining = usTaskCheckFreeStackSpace( ( unsigned portCHAR * ) pxNextTCB->pxStack );
                        if(usStackRemaining < pcWriteBuffer[pxNextTCB->uxTCBNumber])
                          pcWriteBuffer[pxNextTCB->uxTCBNumber] = usStackRemaining;

        } while( pxNextTCB != pxFirstTCB );
    }
#endif

#if ( configUSE_TRACE_FACILITY == 1 )

    void vStackListWithMaxUsedSize( unsigned portLONG *pcWriteBuffer )
    {
    unsigned portBASE_TYPE uxQueue;

        vTaskSuspendAll();
        {
            pcWriteBuffer[ 0 ] = ( signed portCHAR ) 0x00;
            strcat( ( portCHAR * ) pcWriteBuffer, ( const portCHAR * ) "\r\n" );

            uxQueue = uxTopUsedPriority + 1;

            do
            {
                uxQueue--;

                if( !listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxQueue ] ) ) )
                {
                    prvGetMaxStackSize( pcWriteBuffer, ( xList * ) &( pxReadyTasksLists[ uxQueue ] ), tskREADY_CHAR );
                }
            }while( uxQueue > ( unsigned portSHORT ) tskIDLE_PRIORITY );

            if( !listLIST_IS_EMPTY( pxDelayedTaskList ) )
            {
                prvGetMaxStackSize( pcWriteBuffer, ( xList * ) pxDelayedTaskList, tskBLOCKED_CHAR );
            }

            if( !listLIST_IS_EMPTY( pxOverflowDelayedTaskList ) )
            {
                prvGetMaxStackSize( pcWriteBuffer, ( xList * ) pxOverflowDelayedTaskList, tskBLOCKED_CHAR );
            }

            #if( INCLUDE_vTaskDelete == 1 )
            {
                if( !listLIST_IS_EMPTY( &xTasksWaitingTermination ) )
                {
                    prvGetMaxStackSize( pcWriteBuffer, ( xList * ) &xTasksWaitingTermination, tskDELETED_CHAR );
                }
            }
            #endif

            #if ( INCLUDE_vTaskSuspend == 1 )
            {
                if( !listLIST_IS_EMPTY( &xSuspendedTaskList ) )
                {
                    prvGetMaxStackSize( pcWriteBuffer, ( xList * ) &xSuspendedTaskList, tskSUSPENDED_CHAR );
                }
            }
            #endif
        }
        xTaskResumeAll();
    }

#endif
Go to the top of the page
 
+Quote Post
KolyanV
сообщение Oct 22 2009, 18:41
Сообщение #30


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

Группа: Свой
Сообщений: 91
Регистрация: 1-06-05
Пользователь №: 5 621



Цитата(mariaoi @ Oct 17 2009, 15:17) *
Здравствуйте. Не подскажите как во freeRTOS определить максимальный размер стека который занимал каждый процесс на протяжении своей работы?
Спасибо!

Смотрите описание функции API uxTaskGetStackHighWaterMark()
Go to the top of the page
 
+Quote Post

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

 


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


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