FreeRTOS, task umre pri cekani na semafor...
Jaroslav Buchta
jaroslav.buchta na hascomp.cz
Středa Říjen 30 11:57:49 CET 2013
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.
Další informace o konferenci Hw-list