FreeRTOS остается в бесконечном цикле for для семафора в функции vListInsert - PullRequest
2 голосов
/ 20 марта 2012

Я пытаюсь понять, почему мой код застрял в цикле for vListInsert из FreeRTOS. Я реализую FreeRTOS для bfin561 coreb с помощью компилятора gcc toolchain.

вот подсказка, которую я получил:

Я инициализирую семафор следующим образом:

.....
 vSemaphoreCreateBinary( LED0_semaphore );
        vSemaphoreCreateBinary( LED5_semaphore );
    params[0].event = LED0_semaphore;
        params[5].event = LED5_semaphore;
....

затем в функции задачи:

static portTASK_FUNCTION(LED_blink_thread, Param)
{

        coreb_msg("start LED_blink_thread\n");

    task_params_list_t *p = (task_params_list_t *)Param;

        coreb_msg("got parameters\n");

        int lite = p->LED;
        xSemaphoreHandle sem = p->event;
   if (sem != (xSemaphoreHandle)0)                                     // is t\
he semaphore pointer is valid                                                   
        {
            coreb_msg("semaphore pointer is valid\n");

                while(1)
                {
                  // Button task: sem is non-NULL, pend on it for ever        
                    while( xSemaphoreTake( sem, portMAX_DELAY ) != pdTRUE ); 
                    coreb_msg("semaphore is non-NULL SET LED\n");

                    EZKit_Set_LED(lite); // turn on a single LED passed as arg.                                 

                    while( xSemaphoreTake( sem, portMAX_DELAY ) != pdTRUE );
                    coreb_msg("semaphore is non-NULL CLEAR LED\n");

                    EZKit_Clear_LED(lite);   
.....

}

в приведенном выше коде проблема произошла во втором while (xSemaphoreTake (sem, portMAX_DELAY)! = PdTRUE); линия.

Отлаживая код, я застрял в:

void vListInsert( xList *pxList, xListItem *pxNewListItem )

от freeRTOS по адресу:

....
for( pxIterator = ( xListItem * ) &( pxList->xListEnd ); pxIter ator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext )
                {
                    coreb_msg("iterate");
                    coreb_msg("pxIterator = %x",pxIterator);
                    coreb_msg("pxIterator->pxNext->xItemValue = %x",pxIterator->pxNext->xItemValue);
                    coreb_msg("pxIterator->pxNext = %x",pxIterator->pxNext);


            /* There is nothing to do here, we are just iterating to the                                                                           
                        wanted insertion position. */
                }
  ....

вывод отладочных сообщений, которые я получил:

COREB: get owner of next entry:                                                 
COREB: current TCB 3d24000                                                      
COREB: pxReadyTasksLists[ uxTopReadyPriority ] = 1                              
COREB: TCB content:                                                             
COREB: top of stack: 3d25588                                                    
COREB: GenericListItem: 0                                                       
COREB: Event ListItem: 4                                                        
COREB: Priority: 6                                                              
COREB: start of stack: 3d25000                                                  
COREB: Task Name: LED tas                                                       
COREB: TCB number: 7                                                            
COREB: Task Tag: 3c06a88                                                        
COREB: trace switched in:LED tas                                                
COREB: write trace to buffer                                                    
COREB: call task hook                                                           
COREB: Task call app hook called    
COREB: Task call app hook called                                                
COREB: start LED_blink_thread                                                   
COREB: got parameters                                                           
COREB: semaphore pointer is valid                                               
COREB: start xQueueGenericReceive                                               
COREB: addr pxQueue = 3d18000                                                   
COREB: addr pxQueue->msgWait = 3d18038                                          
COREB: pxQueue Is Not Null                                                      
COREB: pxQueue->MsgW Is Not Null                                                
COREB: queue message waiting                                                    
COREB: pxQueue->pcReadFrom = 3d19000                                            
COREB: BUG dst 00000000 src 03d19000                                            
COREB: copy data from queue                                                     
COREB: just peaking is false                                                    
COREB: removing data                                                            
COREB: exit critical                                                            
COREB: semaphore is non-NULL SET LED                                            
COREB: start xQueueGenericReceive                                               
COREB: addr pxQueue = 3d18000                                                   
COREB: addr pxQueue->msgWait = 3d18038                                          
COREB: pxQueue Is Not Null         
COREB: pxQueue->MsgW Is Null                                                    
COREB: there is no data in queue                                                
COREB: The queue was empty and a block time specified                           
COREB: set timout out 0                                                         
COREB: all task suspended                                                       
COREB: prvLockQueue called                                                      
COREB: check timeout = false                                                    
COREB: queue is empty                                                           
COREB: before TaskPlaceOnEventList                                              
COREB: call vListInsert       
COREB: start list insert                                                        
COREB: xValueOfInsertion = 4                                                    
COREB: portMAX_DELAY = ffff                                                     
COREB: xValueOfInsertion != portMAX_DELAY                                       
COREB: pxNewListItem->pxNext = 3d1802c                                          
COREB: pxNewListItem->pxNext->pxPrevious = 3d24018                              
COREB: pxNewListItem->pxPrevious = 3d1802c                                      
COREB: pxIterator->pxNext = pxNewListItem                                       
COREB: pxNewListItem->pvContainer = pxList                                      
COREB: pxList->uxNumberOfItems = 1                                              
COREB: call vListRemove                                                         
COREB: list_rem px prev: 3c0cea0                                                
COREB: list_rem px next: 3d24004                                                
COREB: vTaskSuspend == 1                                                        
COREB: xTicksToWait == portMAX_DELAY             
COREB: call  vListInsertEnd                                                     
COREB: before unlock queue                                                      
COREB: task resume all failed                                                   
COREB: there is no data in queue                                                
COREB: all task suspended                                                       
COREB: prvLockQueue called                                                      
COREB: check timeout = false                                                    
COREB: queue is empty                                                           
COREB: before TaskPlaceOnEventList                                              
COREB: call vListInsert                                                         
COREB: start list insert                                                        
COREB: xValueOfInsertion = 4                                                    
COREB: portMAX_DELAY = ffff                                                     
COREB: xValueOfInsertion != portMAX_DELAY                                       
COREB: iterate                  
COREB: pxIterator = 3d1802c                                                     
COREB: pxIterator->pxNext->xItemValue = 4                                       
COREB: pxIterator->pxNext = 3d24018                                             
COREB: pxNewListItem->pxNext = 3d1802c                                          
COREB: pxNewListItem->pxNext->pxPrevious = 3d24018                              
COREB: pxNewListItem->pxPrevious = 3d24018                                      
COREB: pxIterator->pxNext = pxNewListItem                                       
COREB: pxNewListItem->pvContainer = pxList                                      
COREB: pxList->uxNumberOfItems = 2                                              
COREB: call vListRemove                                                         
COREB: list_rem px prev: 3c0cf48                                                
COREB: list_rem px next: 3d24004                                                
COREB: vTaskSuspend == 1                                                        
COREB: xTicksToWait == portMAX_DELAY                                            
COREB: call  vListInsertEnd                                                     
COREB: before unlock queue                                                      
COREB: task resume all failed                                                   
COREB: there is no data in queue                                                
COREB: all task suspended                                                       
COREB: prvLockQueue called     
COREB: check timeout = false                                                    
COREB: queue is empty                                                           
COREB: before TaskPlaceOnEventList                                              
COREB: call vListInsert                                                         
COREB: start list insert                                                        
COREB: xValueOfInsertion = 4                                                    
COREB: portMAX_DELAY = ffff                                                     
COREB: xValueOfInsertion != portMAX_DELAY                                       
COREB: iterate                                                                  
COREB: pxIterator = 3d1802c                                                     
COREB: pxIterator->pxNext->xItemValue = 4                                       
COREB: pxIterator->pxNext = 3d24018                                             
COREB: pxNewListItem->pxNext = 3d1802c                                          
COREB: pxNewListItem->pxNext->pxPrevious = 3d24018
COREB: pxNewListItem->pxPrevious = 3d24018                                      
COREB: pxIterator->pxNext = pxNewListItem                                       
COREB: pxNewListItem->pvContainer = pxList                                      
COREB: pxList->uxNumberOfItems = 2                                              
COREB: call vListRemove                                                         
COREB: list_rem px prev: 3c0cf48                                                
COREB: list_rem px next: 3d24004                                                
COREB: vTaskSuspend == 1                                                        
COREB: xTicksToWait == portMAX_DELAY                                            
COREB: call  vListInsertEnd                                                     
COREB: before unlock queue                                                      
COREB: task resume all failed                                                   
COREB: there is no data in queue                                                
COREB: all task suspended                                                       
COREB: prvLockQueue called                                                      
COREB: check timeout = false                                                    
COREB: queue is empty                                                           
COREB: before TaskPlaceOnEventList                                              
COREB: call vListInsert                                                         
COREB: start list insert                           
COREB: xValueOfInsertion = 4                                                    
COREB: portMAX_DELAY = ffff                                                     
COREB: xValueOfInsertion != portMAX_DELAY                                       
COREB: iterate                                                                  
COREB: pxIterator = 3d1802c                                                     
COREB: pxIterator->pxNext->xItemValue = 4                                       
COREB: pxIterator->pxNext = 3d24018                                             
COREB: iterate                                                                  
COREB: pxIterator = 3d24018                                                     
COREB: pxIterator->pxNext->xItemValue = 4                                       
COREB: pxIterator->pxNext = 3d24018                                             
COREB: iterate                                                                  
COREB: pxIterator = 3d24018                                                     
COREB: pxIterator->pxNext->xItemValue = 4                                       
COREB: pxIterator->pxNext = 3d24018                                             
COREB: iterate                                                                  
COREB: pxIterator = 3d24018                                                     
COREB: pxIterator->pxNext->xItemValue = 4                                       
COREB: pxIterator->pxNext = 3d24018                                             
COREB: iterate                         
....

и он останется в этом цикле.

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

Спасибо

William

1 Ответ

3 голосов
/ 20 марта 2012

Похоже, вы никуда не отдаете семафор - это может привести к зависанию 2-го xSemaphoreTake

...