|
|
  |
FreeRTOS общие вопросы |
|
|
|
Jul 21 2009, 05:18
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jul 23 2009, 12:56
|
Местный
  
Группа: Свой
Сообщений: 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 тоже есть и они работают... а моя задача почему-то не стартует... будем искать где прокололся.
|
|
|
|
|
Jul 25 2009, 13:23
|
Участник

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

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

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

|
Цитата(asd6715 @ Jul 25 2009, 16:23)  плохо искал... Не полохо, а вообще не искали  Раздел 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
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 25 2009, 20:28
|
Участник

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

|
Чесно признаюсь, просто прочитал название функции, подумал что это не то, и даже описание не читал, соррии
|
|
|
|
|
Aug 3 2009, 09:33
|
Группа: Участник
Сообщений: 10
Регистрация: 2-08-09
Пользователь №: 51 706

|
Не обьясните как толком пользоваться функцией vTaskStartTrace? Я прописал Код #define configQUEUE_REGISTRY_SIZE 10 #define configUSE_TRACE_FACILITY 1 Далее вызвал Код vTaskStartTrace(TraceBuffer, 2000); В эту область данных в двоичном формате начались записываться некие данные, как прочитать не понятно. convtrce.exe я так нигде и не нашел. Как получить из этой функции информацию подобную вот это?  Объясните если кто вкурсе, плз.
|
|
|
|
|
Aug 3 2009, 09:48
|

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

|
Цитата(petrovichs @ Aug 3 2009, 12:33)  Как получить из этой функции информацию подобную вот это? Так это к трассировке никакого отношения не имеет, это просто текущее состояние системы - там в буферок сразу текст сбрасывается. Криво  В оригинале что-то типа 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
|
|
|
|
|
Aug 3 2009, 14:13
|
Участник

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

|
Извините что задаю очень глупые вопросы. Но я ещё новичек, как не стараюсь понять некоторые вопросы так и не получаеться. Надеюсь на вашу помощь. Я не могу понять чем отличаються функции с концовкой "fromISR" и без этой концовки? А то я использую у себя в прерывании xSemaphoreGive и все вроде бы прекрасно работает  В чем разница и в чем загвоздка?
|
|
|
|
|
Aug 5 2009, 11:07
|
Частый гость
 
Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638

|
сказать больше чем это сделали разработчик(-и) FreeRTOS сложно, поэтому прочтите сами: API Usage - light weight
--------------------
Завтра пойму, что нужно было сделать вчера...
|
|
|
|
|
Aug 27 2009, 13:14
|
Участник

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

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

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

|
Здравствуйте. Не подскажите как во freeRTOS определить максимальный размер стека который занимал каждый процесс на протяжении своей работы? Спасибо!
|
|
|
|
|
Oct 17 2009, 14:23
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 22 2009, 18:41
|

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

|
Цитата(mariaoi @ Oct 17 2009, 15:17)  Здравствуйте. Не подскажите как во freeRTOS определить максимальный размер стека который занимал каждый процесс на протяжении своей работы? Спасибо! Смотрите описание функции API uxTaskGetStackHighWaterMark()
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|