portYIELD_FROM_ISR + atmega32

zvonko69 wrote on Wednesday, May 12, 2010:

hi, this is the sample code from freertos website
, how do i use portYIEED_FROM_ISR with atmega32, i cant find this macro in the portable code,
or can i just use taskYIELD() macro inside an ISR ?

/* Timer ISR */
void vTimerISR( void * pvParameters )
static unsigned portCHAR ucLocalTickCount = 0;
static signed portBASE_TYPE xHigherPriorityTaskWoken;

    /* A timer tick has occurred. */
    … Do other time functions.
    /* Is it time for vATask() to run? */
    xHigherPriorityTaskWoken = pdFALSE;
    if( ucLocalTickCount >= TICKS_TO_WAIT )
        /* Unblock the task by releasing the semaphore. */
        xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );
        /* Reset the count so we release the semaphore again in 10 ticks time. */
        ucLocalTickCount = 0;
    /* If xHigherPriorityTaskWoken was set to true you
    we should yield.  The actual macro used here is
    port specific. */
    portYIELD_FROM_ISR( xHigherPriorityTaskWoken );

rtel wrote on Wednesday, May 12, 2010:

portYIELD_FROM_ISR() does not exist for the 8 bit AVR - hence you cannot find it.  You can use taskYIELD() directly, but only as the last instruction in an interrupt handler.

Take a look at the SIGNAL( SIG_UART_RECV ) function in FreeRTOS/Demo/AVR_ATMega323_WinAVR/serial/serial.c for a GCC example.  Alternatively take a look at __interrupt void SIG_UART_RECV( void ) in FreeRTOS/Demo/AVR_ATMega323_IAR/serial/serial.c for an IAR example.