Добрый день всем.
FreeRTOS (7.1.0)
Что-то не пойму как вообще работает FreeRTOS...
Делаем следующее:
Запускаем таск и делаем в нем vTaskDelay
Получаем цепочку вызовов: vTaskDelay -> prvAddCurrentTaskToDelayedList -> vListInsert
Код
vTaskDelay:
vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );
prvAddCurrentTaskToDelayedList( xTimeToWake );
Код
prvAddCurrentTaskToDelayedList:
vListInsert( ( xList * ) pxDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );
Код
vListInsert:
pxNewListItem->pxNext = pxIterator->pxNext;
pxNewListItem->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem;
pxNewListItem->pxPrevious = pxIterator;
pxIterator->pxNext = ( volatile xListItem * ) pxNewListItem;
pxNewListItem->pvContainer = ( void * ) pxList;
vListInsert не изменяет поле Owner у элемента Далее приходит нужный тик от таймера и срабатывает макро prvCheckDelayedTasks
Код
if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) // Список не пуст
pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); // Поле Owner не заполнено
xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xGenericListItem ) ); // Гуляем где-то...
Получаем:
Поле Owner у нас не заполнено.
Приводим случайные данные к указателю и ходим по случайным адресам.
Я что-то упустил?
Сообщение отредактировал _sv_ - May 3 2012, 12:44