2012-03-20 4 views
2

FreeRTOSのvListInsertのforループにコードが詰まっているのを理解しようとしています。 私は、gcc toolchainコンパイラを使ってbfin561 coreb用にFreeRTOSを実装しています。私はセマフォをこのように初期化FreeRTOSがvListInsert関数のセマフォーforループで無限にとどまる

..... 
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); 
..... 

} 

問題2番目にhapen(xSemaphoreTake(sem、portMAX_DELAY)!= pdTRUE);ライン。

freeRTOSから
void vListInsert(xList *pxList, xListItem *pxNewListItem) 

で:コードをデバッグ

は、私はに捕まってしまった私が持っている

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

し、それをこのforループにとどまります。

よく知っている人は誰ですか.RTOSは何が起こるか教えてくれますか? FreeRTOSコードのループ機能のために、これがクラッシュする理由については、上記のいくつかのコメントがありますが、そうでないか、それが現時点でどのように解決するのか分かりません。あなたが戻ってどこにでもセマフォを与えていない表示されます

おかげで、

ウィリアム

答えて

3

- 第二xSemaphoreTake

+0

感謝をハングアップするだろう。私はそれが事実であるかどうか確信が持てなかったので、それを確認してください。私はこれがデモコードであるので動作するはずですが。私はセマフォーリリースをやり直してから問題を解決するかどうかを知らせます。 –

+0

素晴らしいですね。再度、感謝します –

関連する問題