|
|
View previous topic :: View next topic |
Author |
Message |
robroy_1 Guest
|
Multiple ISR's, is it safe to enable disable interrupts whil |
Posted: Thu Jun 19, 2003 5:08 pm |
|
|
Hello;
Another day of agonizing headbanging (yup!, I have not done this in a while), and many compiler questions/issues. The one most important to me right now is the discussion of whether it is safe to enable or disable interrupts during an interrupt service routine. Specifically I am interested in enabling / disabling the timer1 while in the portb change or ext int service routines. I have noted the comments by CCS about protected sub routines, but it does not make it clear about whether the restore at the end of the interrupt service routine will whack any enabling/disabling PIC-C C commands.
ex:
#org 0x????
void main(void){
//initialize interrupts
....
.....
.....
enable_interrupts(GLOBAL);
do{
...
...
} while (sometest);
}
#org 0x????
#int_rb
{
...
if (sometest)
{
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
set_timer1(3036); //100 milsec @20Mhz
enable_interrupts(int_timer1);
}
else
{
setup_timer_1(T1_DISABLED);
disable_interrupts(int_timer1);
}
}
Advice is really welcome. My thoughts are if this cant be done then I will have to use flags to signal from the ISR's to the main program loop. Any examples of this would also be appreciated....just take out the NOSPAM in my email address.
Thanks...
Rob
___________________________
This message was ported from CCS's old forum
Original Post ID: 144515410 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
Re: Multiple ISR's, is it safe to enable disable interrupts |
Posted: Thu Jun 19, 2003 5:30 pm |
|
|
:=
:= The one most important to me right now is the discussion of whether it is safe to enable or disable interrupts during an interrupt service routine. Specifically I am interested in enabling / disabling the timer1 while in the portb change or ext int service routines.
-----------------------------------------------------------
Yes, you can do it. Look at the CCS example file, EX_STISR.C:
<a href="http://www.cc.puv.fi/~t0101190/projekti/source/Examples/ex_stisr.c" TARGET="_blank">http://www.cc.puv.fi/~t0101190/projekti/source/Examples/ex_stisr.c</a>
They disable INT_TBE interrupts within the ISR.
The only thing you should never do, is to re-enable GLOBAL
interrupts within an isr. CCS does not support nested
interrupts.
___________________________
This message was ported from CCS's old forum
Original Post ID: 144515411 |
|
|
Lance Lascari Guest
|
Re: Multiple ISR's, is it safe to enable disable interrupts |
Posted: Fri Jun 20, 2003 6:39 am |
|
|
I've got some rare cases where routines that normally:
disable interrupts
[do something]
reenable interrupts
as part of their normal procedure.
Realizing this was a pretty key flaw (since these routines might be called when interrupts were already disabled, or during an ISR (very rare)), I did this
enter routine
check if global interrupts are enabled, store flag
disable interrupts (doesn't hurt if they're already off)
[do stuff]
if(interrupts were enabled before)
enable interrupts
Anyone have any comments on this or a better solution?
-Lance
:=:=
:=:= The one most important to me right now is the discussion of whether it is safe to enable or disable interrupts during an interrupt service routine. Specifically I am interested in enabling / disabling the timer1 while in the portb change or ext int service routines.
:=-----------------------------------------------------------
:=
:=Yes, you can do it. Look at the CCS example file, EX_STISR.C:
:= <a href="http://www.cc.puv.fi/~t0101190/projekti/source/Examples/ex_stisr.c" TARGET="_blank"> <a href="http://www.cc.puv.fi/~t0101190/projekti/source/Examples/ex_stisr.c" TARGET="_blank">http://www.cc.puv.fi/~t0101190/projekti/source/Examples/ex_stisr.c</a></a>
:=They disable INT_TBE interrupts within the ISR.
:=
:=The only thing you should never do, is to re-enable GLOBAL
:=interrupts within an isr. CCS does not support nested
:=interrupts.
:=:=
:=:= The one most important to me right now is the discussion of whether it is safe to enable or disable interrupts during an interrupt service routine. Specifically I am interested in enabling / disabling the timer1 while in the portb change or ext int service routines.
:=-----------------------------------------------------------
:=
:=Yes, you can do it. Look at the CCS example file, EX_STISR.C:
:= <a href="http://www.cc.puv.fi/~t0101190/projekti/source/Examples/ex_stisr.c" TARGET="_blank"> <a href="http://www.cc.puv.fi/~t0101190/projekti/source/Examples/ex_stisr.c" TARGET="_blank">http://www.cc.puv.fi/~t0101190/projekti/source/Examples/ex_stisr.c</a></a>
:=They disable INT_TBE interrupts within the ISR.
:=
:=The only thing you should never do, is to re-enable GLOBAL
:=interrupts within an isr. CCS does not support nested
:=interrupts.
___________________________
This message was ported from CCS's old forum
Original Post ID: 144515422 |
|
|
R.J.Hamlett Guest
|
Re: Multiple ISR's, is it safe to enable disable interrupts |
Posted: Fri Jun 20, 2003 7:13 am |
|
|
:=I've got some rare cases where routines that normally:
:=disable interrupts
:=
:=[do something]
:=
:=reenable interrupts
:=
:=as part of their normal procedure.
:=
:=Realizing this was a pretty key flaw (since these routines might be called when interrupts were already disabled, or during an ISR (very rare)), I did this
:=
:=enter routine
:=check if global interrupts are enabled, store flag
:=
:=disable interrupts (doesn't hurt if they're already off)
:=
:=[do stuff]
:=
:=if(interrupts were enabled before)
:= enable interrupts
:=
:=
:=Anyone have any comments on this or a better solution?
:=
:=-Lance
This is exactly what is done internally by some parts of the CCS code. Obviously, if there is any possibility of the routines be called from locations where the interrupts are allready enabled, as well as locations where they might be disabled, this is a better solution. I use this approach, on a block 'memory copy' routine.
Best Wishes
:=:=:= The one most important to me right now is the discussion of whether it is safe to enable or disable interrupts during an interrupt service routine. Specifically I am interested in enabling / disabling the timer1 while in the portb change or ext int service routines.
:=:=-----------------------------------------------------------
:=:=
:=:=Yes, you can do it. Look at the CCS example file, EX_STISR.C:
:=:= <a href="http://www.cc.puv.fi/~t0101190/projekti/source/Examples/ex_stisr.c" TARGET="_blank"> <a href="http://www.cc.puv.fi/~t0101190/projekti/source/Examples/ex_stisr.c" TARGET="_blank"> <a href="http://www.cc.puv.fi/~t0101190/projekti/source/Examples/ex_stisr.c" TARGET="_blank">http://www.cc.puv.fi/~t0101190/projekti/source/Examples/ex_stisr.c</a></a></a>
:=:=They disable INT_TBE interrupts within the ISR.
:=:=
:=:=The only thing you should never do, is to re-enable GLOBAL
:=:=interrupts within an isr. CCS does not support nested
:=:=interrupts.
:=
:=
:=:=:=
:=:=:= The one most important to me right now is the discussion of whether it is safe to enable or disable interrupts during an interrupt service routine. Specifically I am interested in enabling / disabling the timer1 while in the portb change or ext int service routines.
:=:=-----------------------------------------------------------
:=:=
:=:=Yes, you can do it. Look at the CCS example file, EX_STISR.C:
:=:= <a href="http://www.cc.puv.fi/~t0101190/projekti/source/Examples/ex_stisr.c" TARGET="_blank"> <a href="http://www.cc.puv.fi/~t0101190/projekti/source/Examples/ex_stisr.c" TARGET="_blank"> <a href="http://www.cc.puv.fi/~t0101190/projekti/source/Examples/ex_stisr.c" TARGET="_blank">http://www.cc.puv.fi/~t0101190/projekti/source/Examples/ex_stisr.c</a></a></a>
:=:=They disable INT_TBE interrupts within the ISR.
:=:=
:=:=The only thing you should never do, is to re-enable GLOBAL
:=:=interrupts within an isr. CCS does not support nested
:=:=interrupts.
___________________________
This message was ported from CCS's old forum
Original Post ID: 144515423 |
|
|
|
|
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
|