|
楼主 |
发表于 2010-10-16 10:53:58
|
显示全部楼层
回复【4楼】WithSword 倚剑
-----------------------------------------------------------------------
二楼老弟:是我错了,我检查了过去几年使用的程序,当时用了一个宏,对此我并没有吃透,是直接套用别人的,这个宏我列在下面,当时发信号是在IRQ_Exception_Function函数中发的,是不是它已经退出了中断?
当时使用的芯片是LPC系列,对44B0X应当在什么地方追加这段程序?或者您能否告诉我中断应当怎么加法?你就以RTC_TICK中断为例,告诉我具体应当怎么做法?您能否把您的EMAIL告诉我,以便请教,这件事已经困惑我很久了,我今天买了一个UCOS源码,我自己先试试看,所以今天我就下网了,您的帖子我会随时关注的,最好把EMAIL告诉我.
$IRQ_Label HANDLER $IRQ_Exception_Function
EXPORT $IRQ_Label ;// 输出的标号
IMPORT $IRQ_Exception_Function ;// 引用的外部标号
$IRQ_Label
SUB LR, LR, #4 ;// 计算返回地址
STMFD SP!, {R0-R3, R12, LR} ;// 保存任务环境
MRS R3, SPSR ;// 保存状态
STMFD SP, {R3, SP, LR}^ ;// 保存用户状态的R3,SP,LR,注意不能回写
;// 如果回写的是用户的SP,所以后面要调整SP
LDR R2, =OSIntNesting ;// OSIntNesting++
LDRB R1, [R2]
ADD R1, R1, #1
STRB R1, [R2]
SUB SP, SP, #4*3
MSR CPSR_c, #(NoInt | SYS32Mode) ;// 切换到系统模式
CMP R1, #1
LDREQ SP, =StackUsr
BL $IRQ_Exception_Function ;// 调用c语言的中断处理程序
LDR R2, =OsEnterSum ;// OsEnterSum,使OSIntExit退出时中断关闭
MOV R1, #1
STR R1, [R2]
BL OSIntExit
LDR R2, =OsEnterSum ;// 因为中断服务程序要退出,所以OsEnterSum=0
MOV R1, #0
STR R1, [R2]
MSR CPSR_c, #(NoInt | IRQ32Mode) ;// 切换回irq模式
LDMFD SP, {R3, SP, LR}^ ;// 恢复用户状态的R3,SP,LR,注意不能回写
;// 如果回写的是用户的SP,所以后面要调整SP
LDR R0, =OSTCBHighRdy
LDR R0, [R0]
LDR R1, =OSTCBCur
LDR R1, [R1]
CMP R0, R1
ADD SP, SP, #4*3
MSR SPSR_cxsf, R3
LDMEQFD SP!, {R0-R3, R12, PC}^ ;// 不进行任务切换
LDR PC, =OSIntCtxSw ;// 进行任务切换
MEND
;/* 以下添加中断句柄,用户根据实际情况改变 */
;/*IRQ中断*/
IRQ_Handler HANDLER IRQ_Exception
;/*定时器0中断*/
Timer0_Handler HANDLER Timer0_Exception
;/*UART0中断*/
UART0_Handler HANDLER UART0_Exception
;/*RTC中断*/
INT3_Handler HANDLER INT3_Exception
;/*I2C中断*/
I2C_Handler HANDLER I2c_Exception
;/*UART1中断*/
UART1_Handler HANDLER UART1_Exception
;/*SPI中断(使用EINT2)*/
SPI_Handler HANDLER SPI_Exception
对您的指点我十分感激,至少让我知道问题是出走我的程序而不是系统上,谢谢了. |
|