Перейти к содержанию
    

1. Нет.

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

плохо искал...

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Я прописал

#define configQUEUE_REGISTRY_SIZE       10
#define configUSE_TRACE_FACILITY    1

Далее вызвал

vTaskStartTrace(TraceBuffer, 2000);

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

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

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

log.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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

log.gif

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

API Usage - light weight

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

#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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Спасибо!

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...