When running my own application that uses UDP transport layer on an LPC3250 board I experienced some issues with corrupted xPendingReadyList. With “corrupted” I mean weird links (more than one cycle) between list items, wrong number of contained items, etc. This problem puzzled me for quite a while until I finally looked on the implementation of xProcessReceivedUDPPacket. It calls
xSemaphoreGiveFromISR( pxSocket->xWaitingPacketSemaphore, &xHigherPriorityTaskWoken );
outside of any critical section. After I replaced it by xSemaphoreGive() all problems were gone.
My understanding is that the FromISR() functions are only to be used where the interrupts are disabled. This assumption is also supported by the fact that using the (from my point of view) correct function without FromISR fixed the problem.
Could anyone tell me please whether this is a bug? And, in the event that this is considered correct, give me a short explanation why it is ok to call FromISR functions with enabled interrupts?