I'm quite new to context switch and embedded software development. I'm developing a standalone application (no OS) with aduc7026 and keil uVision3. My problem is that at the end of an uart messagge, which I must receive by interrupt, depending on the content of the messagge I've to return return in main in the state saved before entering in the ISR or I've have to return in a specified point where a funcion call is executed.
Hoping that I've been clear. Does anyone have suggestions?
Thank ìs in advance,
Matteo
I've have to return in a specified point where a funcion call is executed.
Let me point out that for someone who's still quite new to the whole field of embedded SW, you hold some awfully firm beliefs about how you "have to" do things. That doesn't feel right.
And no, you almost certainly (a) don't have to do that, nor (b) should be be trying to at this point on your learning curve. Stick to simpler designs until you really know what you're doing.
"Does anyone have suggestions?"
my first suggestion would be to structure your code so it doesn't do what you are trying to do - it simply sounds "un-natural" and messy.
my 2nd suggestion would be to branch your code based on where your code may jump to. in the main, disable interrupt, execute one of the branches based on a flag, and then turn on the interrupt (to process any messages), and go back to the top. you will in the isr set the flag based on the messages received.
something like this:
1) isr:
receive the message if message is x, set flag to f_x; if message is y, set flag to f_y; ...
2) main code:
disable interrupt; if flag is f_x, execute branch x; if flag is f_y, execute branch y; ... enable interrupt; loop back
the problem with this approach is that it isn't terribly good with real time response.
my 3rd suggestion would be to receive the message in the main, set a flag and then trigger a software interrupt. in the software interrupt, you process the flag (and jump to wherever you want based on the flag).
this approach requires the processing of the flag to be very fast and consumes lots of mcu cycles.
I should have posted:
"will invoke the correct function"
You can also post a message into a pipe of a queue from the ISR to the main loop for later handling. Resolving the message type will invoke the correct message (the main loop will poll the queue - be careful of synchronization issues). Can you live with a slight delay in execution so that you don't have to call the function from the ISR...?
depending on the content of the messagge I've to return return in main in the state saved before entering in the ISR or I've have to return in a specified point where a funcion call is executed.
Let begin with the first part: this can be solved by maintaining the status of the main loop in a variable and s state machine - no sweat. Why must you return _exactly_ to a specific call? Why not then call the function in question from within the ISR itself (taking care not allowing its execution to take too long)? Remember that interrupts are by definition asynchronous and can occur while any instruction is being executed. If you really want to return exactly to where ypu left of, you probably want to use something like a "co-routine", based on "duff's device". But that if _not_ a standard programming technique and it comes with a price tag, but this cannot be integrated with interrupt handling in the way you want to. Also consider not using interrupt based reception - that way, you poll the data source, implicitly returning to where you left off before polling!
View all questions in Keil forum