ucos中斷問題
我從ucos的網站下載到johnxliu的port,後來在電腦上RUN的時候出現了問題(編譯都過了,只是模擬的螢幕不會出現如example跑出亂數的畫面),後來johnxliu寄給我一份新的版本,我RUN起來以後也都沒問題了,我用johnxliu的port也都可以去跑以些自己寫的TASK,但是後來當我寫到中斷的時候卻發生了問題。
我用timer1去跑時間中斷,但是我是用mode
2自動載入的方式,所以很快的就會再發生中斷,我在中斷函示中依書本的指示在進入和離開的時候加上兩個函示OSIntEnter();OSIntExit();
但是很快的程序就崩潰了,我指細的去研究後發現問題出在OSIntExit();裡面有這幾行,
#pragma ASM
CLR EA
MOV SP, SaveSP
#pragma ENDASM
其中MOV SP,
SaveSP的SaveSP是0所以去跟改的SP上的堆疊結果程序就崩潰了,後來我仿照johnxliuISRTICK的的程式去撰寫加上了
if(OSIntNesting==1)
{
#pragma ASM
PUSH IE
CLR EA
MOV SaveSP, SP
#pragma ENDASM
OSTCBCur-> OSTCBStkPtr=C_XBP;
和
if(OSIntNesting==0)
{
EA=0;
C_XBP=OSTCBCur-> OSTCBStkPtr;
#pragma ASM
MOV SP, SaveSP
MOV SaveSP, #0
POP IE
#pragma ENDASM
}
仍然不能動作,程式依然不能正常工作,所以想請問您是不是我還少加上了什麼東西,或是什麼沒有去修改到呢?
以下是我的中斷程序
void pwm_int(void) interrupt 3
{
OSIntEnter();
TR1=0;
if(SaveSP)
return;
if(OSIntNesting==1)
{
#pragma ASM
PUSH IE
CLR EA
MOV SaveSP, SP
#pragma ENDASM
OSTCBCur-> OSTCBStkPtr=C_XBP; /* OSTCBCur-> OSTCBStkPtr is free now, so it can be used to story the value of SP */
}
if(P1_0)
TH1=50;
else
TH1=255-50;
P1_0=!P1_0;
TR1=1;
OSIntExit();
if(OSIntNesting==0)
{
EA=0;
C_XBP=OSTCBCur-> OSTCBStkPtr;
#pragma ASM
MOV SP, SaveSP
MOV SaveSP, #0
POP IE
#pragma ENDASM
}
}
謝謝大家百忙抽控回答一下,謝謝!
发表时间:2003年9月25日23:36:10