FreeRTOS, task umre pri cekani na semafor...
Jaroslav Buchta
jaroslav.buchta na hascomp.cz
Středa Říjen 30 13:55:15 CET 2013
je to takto:
#define INCLUDE_vTaskSuspend 1
a ISR komplet:
void ETH_IRQHandler(void)
{
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
/* Frame received */
if ( ETH_GetDMAFlagStatus(ETH_DMA_FLAG_R) == SET)
{
/* Give the semaphore to wakeup LwIP task */
xSemaphoreGiveFromISR( s_xSemaphore, &xHigherPriorityTaskWoken );
}
/* Clear the interrupt flags. */
/* Clear the Eth DMA Rx IT pending bits */
ETH_DMAClearITPendingBit(ETH_DMA_IT_R);
ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS);
/* Switch tasks if necessary. */
if( xHigherPriorityTaskWoken != pdFALSE )
{
portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
}
}
ale kdyby chybelo portEND_SWITCHING_ISR tak se snad nic nestane krome
vetsiho zpozdeni, ne?
to ETH_DMAClearITPendingBit je umistene spatne ale jine preruseni stejne
neni povoleno a mam overeno, ze se skutecne nevyskytuje.
jeste me napada, ze je trosku dopraseny port modulu sys_arch, ktery jsem
syntetizoval z vice zdroju, ale stejne problemy byly i s verzi LWIP
1.3.x kde byl projekt prevzaty cely takze spis ne...
Dne 30.10.2013 13:37, Stano napsal(a):
> Este jedna vec, ako mate nastavenu premennu
> INCLUDE_vTaskSuspend v konfiguracii RTOS
>
> Jaroslav Buchta wrote / napísal(a):
>> Stale bojuju s STM32F4 a LWIP, docela to funguje ale občas umře...
>> Nyni resim zahadu se synchronizaci, cast funkce (task) pro prijem
>> paketu redukovana na podstatne aktualne vypada takto:
>>
>> for( ;; )
>> {
>> STM32F4_Discovery_LEDOn(LEDO);
>> int bSync = xSemaphoreTake( s_xSemaphore, 20);
>> //emacBLOCK_TIME_WAITING_FOR_INPUT);
>> <------------------------------------- tady to umre, ledka zustane
>> svitit
>> STM32F4_Discovery_LEDOff(LEDO);
>> portTickType tckRcv = xTaskGetTickCount();
>> {
>> while (ETH_CheckFrameReceived())
>> {
>> p = low_level_input( s_pxNetIf );
>> LedSetRx();
>> if (ERR_OK != s_pxNetIf->input( p, s_pxNetIf))
>> {
>> pbuf_free(p);
>> p=NULL;
>> }
>> bSmallDelay = pdTRUE;
>> while (bSync && xTaskGetTickCount() - tckRcv < 3)
>> vTaskDelay(3); <---------------------------------- bez tohoto
>> zpozdeni to umre behem par minut, takhle za par hodin az dni
>> }
>> }
>>
>> Semafor je uvolnovan z ISR ale to funguje (pomaleji a se ztratami
>> nekterych paketu) i bez toho diky timeoutu a nemelo by se snad stat,
>> ze by to z cekani po 20ms zas nevypadlo...
>> Problem je, ze tento task ma nejvyssi prioritu jako jediny, ma v
>> chybovem stavu status READY (bezne vetsinou BLOCKED) a vesele si pri
>> tom funguji tasky s nizsi prioritou a i IDLE. Tomuto scheduler proste
>> procesor neprideli, budu dal badat - zatim reseno watchdogem coz
>> samozrejme neni idealni... Divne je, ze to je casove zavisle (to
>> zpozdeni ma i jiny vyznam kvuli stabilite prenosu vetsich objemu dat,
>> dalsi cil badani - mozna to souvisi) a nezda se, ze by selhani melo
>> nejakou vazbu na intenzitu komunikace (je na to vetsinou PINGano po 2s)
>> Zasobniky tasku jsou dostatecne, stav vsech tasku si muzu normalne
>> vypsat pres USB, zas to bude asi nejaka blbost ale slusna zabava na
>> dlouhe vecery je jista ;-)
>>
>> No budu se muset nejak zorientovat v tech systemovych frontach, pokud
>> nekdo neco podobneho neresil.
>>
>>
>> _______________________________________________
>> HW-list mailing list - sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list