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