Jump to content

    

FreeRTOS общие вопросы

1. Нет.

2. А там ничего нет сверх того, что есть в Online.

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

Share this post


Link to post
Share on other sites
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 тоже есть и они работают... а моя задача почему-то не стартует... будем искать где прокололся.

Share this post


Link to post
Share on other sites

Не ругайте строго не могу найти функцию. В uc/os-II есть такая функция как OSSchedLock, которая отключает диспетчеризацию. Есть ли во freeRTOS аналог этой функции?? Я искал - не нашел, так это из-за того что её там нет или плохо искал...

Share this post


Link to post
Share on other sites
плохо искал...

Не полохо, а вообще не искали :(

Раздел 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();

Я у себя тоже переименовал :)

/* 
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

Share this post


Link to post
Share on other sites

Чесно признаюсь, просто прочитал название функции, подумал что это не то, и даже описание не читал, соррии

Share this post


Link to post
Share on other sites

Не обьясните как толком пользоваться функцией vTaskStartTrace?

Я прописал

#define configQUEUE_REGISTRY_SIZE       10
#define configUSE_TRACE_FACILITY    1

Далее вызвал

vTaskStartTrace(TraceBuffer, 2000);

В эту область данных в двоичном формате начались записываться некие данные, как прочитать не понятно.

convtrce.exe я так нигде и не нашел.

Как получить из этой функции информацию подобную вот это?

log.gif

Объясните если кто вкурсе, плз.

Share this post


Link to post
Share on other sites
Как получить из этой функции информацию подобную вот это?

Так это к трассировке никакого отношения не имеет, это просто текущее состояние системы - там в буферок сразу текст сбрасывается.

Криво :(

В оригинале что-то типа 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

Share this post


Link to post
Share on other sites

log.gif

Что-то подобное что есть на этой картинке можно получить с помощью вызова функции vTaskList(). Вообще task.c небольшой файлик, советую с ног до головы его просмотреть :)

Share this post


Link to post
Share on other sites

Извините что задаю очень глупые вопросы. Но я ещё новичек, как не стараюсь понять некоторые вопросы так и не получаеться. Надеюсь на вашу помощь. Я не могу понять чем отличаються функции с концовкой "fromISR" и без этой концовки? А то я использую у себя в прерывании xSemaphoreGive и все вроде бы прекрасно работает :) В чем разница и в чем загвоздка?

Share this post


Link to post
Share on other sites

когда стартует шэдулер отключаются прерывания, а вот когда они включаются я найти не смог. не подскажет ли кто когда это происходит?

Share this post


Link to post
Share on other sites

Здравствуйте. Не подскажите как во freeRTOS определить максимальный размер стека который занимал каждый процесс на протяжении своей работы?

Спасибо!

Share this post


Link to post
Share on other sites

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

 

#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

Share this post


Link to post
Share on other sites
Здравствуйте. Не подскажите как во freeRTOS определить максимальный размер стека который занимал каждый процесс на протяжении своей работы?

Спасибо!

Смотрите описание функции API uxTaskGetStackHighWaterMark()

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this