We are currently using FreeRTOS for our RISC-V development. One particular
case I came across is that FreeRTOS trap_handlder doens’t handle at
Software interrupts. So as far as I can understand, it checks if the source
of the trap is async (i.e external IRQ or timer IRQ) or sync (probably due
to illegal access). However In our code we rely on issuing a software
interrupt to the core to do some stuff. So what happens is that FreeRTOS
check its an async interrupt but yet not an external interrupt and goes and
raise an assert (i.e ebreak instruction!!).
Is that actually the intended behavior? Am i missing something in here? Is
there a workaround for this?
So if I understand correctly, as well as checking for 0x80000007 to see
if the exception was generated by a machine timer, we also need to check
for 0x80000003 to see if the exception was generated by a machine (at
this time, as only machine mode is supported, although that will change)
software interrupt - is that correct? If so, how should the software
interrupt be handled? It could be a separate callback into the
application code which would be clean but require the application writer
to provide more. Or it could use the same callback as the external
interrupts as the cause register can be read in the handler to determine
if it was a software interrupt - that would be much more clunky for the
application writer and make the asm code a bit more complex.
Either way I think this is a small change.
Thoughts? My preference would be the first method - have the user
provide an ‘software interrupt’ handler.
Yes, your understanding is correct. we need to account for SWI (mcause = 0x80000003)
In my local branch I did a small patch that implemented option two. My main reasons were:
1- Have a single entry point (and exit) for my interrupts (and use mcause to figure out the reason).
2- Avoid adding an extra user configuration for our application developers
3- That same function can used as a trap handler without the OS if required (that’s actually what we do intially until starting the FreeRTOS, which replaces mvec with its own).
One last question, Is it necessary ( or a policy) for FreeRTOS to check the exact source of interrupt and trap if unhandled? I would have expected that FreeRTOS would only capture the Timer TICK and pass every thing else up whatever the source of Interrupt is (i.e no need of the cause check in the first palce) (mainly talking about asynchronous interrupts).
To answer your question - not policy - this is a new port and we want to
see how people use the code and make sure we are providing what they
want/need, so this is a good conversation. The port will get developed
over time to add in more functionality.