We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi i have written a ISR for external intr 0 and from this routine i am calling other functions. On compiling above routines i am getting following warning Warning:Multiple call to segment Caller1:?PR?ex0_ISR?main Caller2:?C_C51STARTUP (where ex0 is the name of isr given in file) there was same warning for each function which i had called from isr Can anybody give me the reason for this ? and solution ?
If you call the same routine from the main code and an ISR you are treading on VERY THIN ice. The possibility exist that while this routine is ececuting in the main loop an interrupt will happen that executes the same routine. For "normal" routines the compiler does not "protect" intermediate variables and thus if that routine get interrupted in the middle and executed by the ISR all things awful can happen. A mechanism, declaring the routine reentrant, exist to take care of this, I, for one recommend not to use it, instead do not call routines from both non-ISR and ISR code. My recommendation against calling the same routine at two levels is maintainability based. Erik
I responded, the # of replies say 1, Where is my response?? Erik
Oh well, it appeared after 1/2 hour Erik
Erik is right: unlike "normal" 'C', C51 functions are not inherently reentrant. The linker is warning you that there is a possibility that the function might be called again from the interrupt while it is already executing in the non-interrupt code. Only you can tell whether this could actually ever happen in practice and, if it could, whether it would be safe...
Thanks for reply. It does not seems fine to increase the code size when same routines are to be used. what if one of main routine is using timer1 and isr is also using same timer. On interrupt what can be the solution to avoid mess in timer(assume same timer is already in use while interruped) ? Can this be one solution: To store timer count in isr routine before using timer and then restoring count while returning to main, is there any other solution ? what can be the better way to write ISR routines so that resources of main can be preserved in ISR ? Does C51 take any care to avoid resource clashes ?
Naresh, it sounds like you need to learn a bit more about interrupts. It is your responsibility to preserve any hardware settings that are used by both your interrupt service, and your high level code. Remember that the interrupt service could happen at any time, regardless of what your high level code is doing. How are you going to use timer1 inside the service, without disrupting whatever the high level code is using it for? (You can read the timer, but if you write to it or any of its control bits, you could have a problem) Do you really need to have this code inside an interrupt service? Maybe you could just set a flag in the ISR, and poll this flag in high level code. I'm guessnig a bit here, not knowing what your actual objective is. The point that earlier posters are making is that functions are handled a little differently in Keil C, to fit into the restricted RAM & stack available. Functions are NOT re-entrant by default, so you must not call them from both ISR code and high level code. The extra code (& RAM) required to make a function re-entrant will more than offset the inefficiency of having two copies of the function.