I want to change the return address in the stack when running an ISR so that it returns to the specified address. But i found the compiler also pushes some variables to the stack. How can I configure the complier so that it only pushes all registers to the stack when it complies an ISR?
thank you for your kindly help!!
i want to do context switch within the timer ISR.
Ok. This is actually one of the few cases where manually changing the return address might be necessary.
However, think about what the term context implies. A context switch is not done by just setting the program counter to the new address. Each context also has its own registers and (usually) stack (pointer). If you are working with C, then the context can include even more variables (for example any variable used inside one of the libraries you use).
You probably won't be able to avoid using assembly in your OS. You can write the task switcher in a mix of assembly and C (start and end with assembly, call a function in C) if it is too complex to be written in pure assembly. On the plus side, using assembly will give you complete control over which registers are pushed to the stack.
This is actually one of the few cases where manually changing the return address might be necessary.
Agreed.
You really should consider writing this portion in assembler. You will then be in total control, the execution order and size of the code will them be more predictable, and you should (therefore) have a more reliable solution.
Have you considered freeRTOS?
Thanks, Christoph.
I did write the timer ISR in a mix of C and assembly. Can you confirm that when the Keil complier complies an ISR, it only pushes all registers into the system stack at the beginning please?
"Can you confirm that when the Keil complier..."
If it's not explicitly documented, then you must not rely upon it!
Just don't take the risk - this really does need to be done in pure assembler!.
the scheduling policy in my RTOS is not priority based. therefore i can not use FreeRTOS.
thank all of your replys.
On a first glance, FreeRTOS also seems to support round-robin scheduling and cooperative multitasking, too.
i will look at it in more details. thanks.
On a first glance, FreeRTOS also seems to support round-robin scheduling
if so, why on earth even involve a RTOS?
Erik