Switching ISRs

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 Cheers

Switching ISRs

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.

Switching ISRs

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 :) ( actually 2. There are 2 uarts ) I’ll post results if (when :) this works.

Switching ISRs

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. Cheers