CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

interrupts <=> function calls

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
newby



Joined: 26 Sep 2004
Posts: 32

View user's profile Send private message

interrupts <=> function calls
PostPosted: Tue Dec 28, 2004 10:25 am     Reply with quote

Hello everybody !

i found in the manual that interrupts (maybe) have to wait till a function, which is active at the time the interrupt occurs, has finished. It is also stated, that "functions" could also be multiplications and so on.
The reason for this behaviour is beacuse of stack overflow which could happen...

Does anybody know which functions (e.g. which "multiplications") blockades interrupts ? Is there a possibilty to turn that behaviour off (without doing the ISR completely on my one) ?
Ttelmah
Guest







PostPosted: Tue Dec 28, 2004 10:59 am     Reply with quote

You have slightly misunderstood what is said.
Generally, an interrupt can interrupt almost any function, _except_ a few that specifically disable interrupts (some for controlling the program memory for example). However routines will be protected from being interrupted, if they are potentially re-entrant.
So (for instance), if you code:
Code:

float aval;
#int_timer2
void timer_int(void){
    float val;
    delay_ms(10);
    val=sin(val);
    aval=val;
}


and in 'main' (or any other non-interrupt routine), use either the delay_ms routine, or the 'sin' routine), then the interrupts will be disabled for the entire duration of each routine.
The 'key' is that the interrupt _must not_ be able to occur inside any routine that is called inside the interrupt. However 'simple' code like:
Code:

int aval;
#int_timer2
void timer_int(void){
    aval=aval+1;
}

causes no problem, because addition is performed as a simple 'inline' function, rather than calling a subroutine.
Similarly, you can call any amount of arithmetic in the main code, without the interrupts being disabled, _provided_ you do not call the same routines at any point in the interrupt code.

This ties very closely with the general advice, to keep interrupt code as short and simple as possible, and avoid using delays inside these routines.

Best Wishes
newby



Joined: 26 Sep 2004
Posts: 32

View user's profile Send private message

PostPosted: Thu Dec 30, 2004 2:19 pm     Reply with quote

thank´s for your explanation !

But what if i use the #inline statement before the function definition - than the stack problem should be solved. The problem that variables could be overwritten would exist anyhow, but in my case i would not mind.
Ttelmah
Guest







PostPosted: Fri Dec 31, 2004 4:13 am     Reply with quote

newby wrote:
thank´s for your explanation !

But what if i use the #inline statement before the function definition - than the stack problem should be solved. The problem that variables could be overwritten would exist anyhow, but in my case i would not mind.

This would depend on what the function did. You can't change the typing of existing 'system' functions in this regard. As you have correctly realised, the local variables for the function would still force the protection to be enabled, if it is used in both locations.
An example of a route 'round', is given below. Here I needed to move a block of memory inside an interrupt routine, but also needed to move a block outside the routine. The solution, was to use the supplied 'memcpy' function in the main code, and then use my own version inside:
Code:

//Replacement for the memcpy routine, for use inside the interrupt
#inline
void mymemcpy(char *dest,char *source, int num)
{
#ASM
   MOVFF dest,FSR0L
   MOVFF &dest+1,FSR0H
   MOVFF SOURCE,FSR1L
   MOVFF &source+1,FSR1H
LOOP1:
   MOVFF POSTINC1,POSTINC0
   DECFSZ   num
   GOTO  LOOP1
#ENDASM
}

This way the two routines are completely 'independant', and interrupts do not have to be disabled (the global handler saves the registers involved in such a movement). Since the variables are 'local' to the interrupt version only, there is no problem with these either.
The same sort of solution can be used for almost any case.

Best Wishes
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group