Switching ISRs

tgarner wrote on Saturday, August 01, 2009:

I have been using FreeRTOS for quite a while. Works great.
I have a question about serial I/O receive strategy.
I like to have the receive ISR collect incoming characters
until a whole line is received ( Carriage Return detected )
and then unblock whatever task is waiting for a line and
give it to them. I use a counting semaphore to count incoming
lines and the line consumer task blocks on SemaphoreTake. My problem is that if I use a switching ISR, a context
save/restore occurs on every incoming character which seems
like a lot of overhead. I’d like to switch only on receipt of the
CR. I suspect this is not possible because you have to save context before
you know what the incoming char is.

Does anybody have any profound ideas on this ?

I’m currently using a non-switching ISR and the consumer task
only gets the line whenever it’s his turn to run.

BTW mpu is LPC2138 - GNU compiler


edwards3 wrote on Saturday, August 01, 2009:

The Cortex ports only switch within the PendSV interrupt. If a task or an interrupt wants a context switch it pends the PendSV interrupt in software, then when the all other interrupts have completed the PendSV interrupt executes and does the actual context switch.

I don’t know if something similar is possible on the LPC2138 but maybe if you can pend a peripheral interrupt in software (one that is not used for anything else) then you could use a similar scheme.

tgarner wrote on Saturday, August 01, 2009:

That’s a good idea. Thanks.
The 2138 has a 32 bit software interrupt request register
of which 11 bits are unused. I’ll just go ahead and use one :slight_smile:
( actually 2. There are 2 uarts )

I’ll post results if (when :slight_smile: this works.

tgarner wrote on Sunday, August 02, 2009:

Results:  Works fine.
I don’t know if it’s worth doing in my case but it doesn’t
hurt and I can imagine situations where it might help.