发表于:2007/7/16 11:43:00
#0楼
非常抱歉的告诉大家,我的2007年度巨献中可能有一个宏BUG,该BUG是非常难以发现的,
但却存在BUG产生的可能:
在中断进入和退出的压栈和出栈的宏定义原来是这样定义的:
;-------Push special register---------
PUSH_REG MACRO
MOVWF WBUF
MOVF STATUS, W
MOVWF STATUSBUF
MOVF PCLATH, W
MOVWF PCLATHBUF
MOVF FSR, W
MOVWF FSRBUF
ENDM
;-------pop special register----------
POP_REG MACRO
MOVF FSRBUF, W
MOVWF FSR
MOVF PCLATHBUF, W
MOVWF PCLATH
MOVF STATUSBUF, W
MOVWF STATUS
MOVF WBUF, W
ENDM
;-------MACRO FOR interrupt push and pop special register end-------
好象在较早的PIC资料上也是这样建议的,但是这样存在一个BUG,
如果主程序刚好做完处理,对标志位Z进行判断前进入中断,那么中断后
的出栈Z位就可能已经被修改了,由语句MOVF WBUF,W影响了,为了不影响
出栈后的Z位,只能采用麻烦一点的方式来传送WBUF了,出栈宏如下定义:
;-------Push special register---------
PUSH_REG MACRO
MOVWF WBUF
MOVF STATUS, W
MOVWF STATUSBUF
MOVF PCLATH, W
MOVWF PCLATHBUF
MOVF FSR, W
MOVWF FSRBUF
ENDM
;-------pop special register----------
POP_REG MACRO
MOVF FSRBUF, W
MOVWF FSR
MOVF PCLATHBUF, W
MOVWF PCLATH
MOVF STATUSBUF, W
MOVWF STATUS
SWAPF WBUF, D
SWAPF WBUF, W
ENDM
这样处理,应该没有问题了的,各位高手可以发表点建议,谢谢!
但却存在BUG产生的可能:
在中断进入和退出的压栈和出栈的宏定义原来是这样定义的:
;-------Push special register---------
PUSH_REG MACRO
MOVWF WBUF
MOVF STATUS, W
MOVWF STATUSBUF
MOVF PCLATH, W
MOVWF PCLATHBUF
MOVF FSR, W
MOVWF FSRBUF
ENDM
;-------pop special register----------
POP_REG MACRO
MOVF FSRBUF, W
MOVWF FSR
MOVF PCLATHBUF, W
MOVWF PCLATH
MOVF STATUSBUF, W
MOVWF STATUS
MOVF WBUF, W
ENDM
;-------MACRO FOR interrupt push and pop special register end-------
好象在较早的PIC资料上也是这样建议的,但是这样存在一个BUG,
如果主程序刚好做完处理,对标志位Z进行判断前进入中断,那么中断后
的出栈Z位就可能已经被修改了,由语句MOVF WBUF,W影响了,为了不影响
出栈后的Z位,只能采用麻烦一点的方式来传送WBUF了,出栈宏如下定义:
;-------Push special register---------
PUSH_REG MACRO
MOVWF WBUF
MOVF STATUS, W
MOVWF STATUSBUF
MOVF PCLATH, W
MOVWF PCLATHBUF
MOVF FSR, W
MOVWF FSRBUF
ENDM
;-------pop special register----------
POP_REG MACRO
MOVF FSRBUF, W
MOVWF FSR
MOVF PCLATHBUF, W
MOVWF PCLATH
MOVF STATUSBUF, W
MOVWF STATUS
SWAPF WBUF, D
SWAPF WBUF, W
ENDM
这样处理,应该没有问题了的,各位高手可以发表点建议,谢谢!
14PIN的单片MCU多核心时代已来临, 想在低容量的MCU系统跑多任务吗,欢迎登陆"http://gongkong.gkbk.com"我的博客 查看详情,谢谢!