<br />hotpower 前辈:<br /><br /> 看了你的分析"非典架构",我也遇到了类似的情况,<br /> 各种条件正常时丢失中断。<br /> 尤其是硬件I2C的中断,稳定性较差。FIQ的外部中断2,丢失较严重。<br /> <br /> 我用的是LPC2138 + ads1.2 + ucos2 + 中断嵌套(几乎所有的外设中断IRQ)<br /> 由于没用过kail,不能直接应用你的文件。<br /> 不知如何使用你的"非典架构",修改我目前的文件,来解决问题。<br /><br />我的<br />Startup.s文件<br /> <br />;define the stack size<br />;定义堆栈的大小<br />FIQ_STACK_LEGTH EQU 0<br />IRQ_STACK_LEGTH EQU 9*10 ;every layer need 9 bytes stack , permit 8 layer .每层嵌套需要9个字堆栈,允许8层嵌套<br />ABT_STACK_LEGTH EQU 0<br />UND_STACK_LEGTH EQU 0<br /><br />NoInt EQU 0x80<br /><br />USR32Mode EQU 0x10<br />SVC32Mode EQU 0x13<br />SYS32Mode EQU 0x1f<br />IRQ32Mode EQU 0x12<br />FIQ32Mode EQU 0x11<br /><br /> IMPORT __use_no_semihosting_swi<br /> <br />;The imported labels <br />;引入的外部标号在这声明<br /> IMPORT FIQ_Exception ;Fast interrupt exceptions handler 快速中断异常处理程序<br /> IMPORT __main ;The entry point to the main function C语言主程序入口 <br /> IMPORT TargetResetInit ;initialize the target board 目标板基本初始化<br /> IMPORT SoftwareInterrupt<br /><br />;The emported labels <br />;给外部使用的标号在这声明<br /> EXPORT bottom_of_heap<br /> EXPORT StackUsr<br /> <br /> EXPORT Reset<br /> EXPORT __user_initial_stackheap<br /><br /> CODE32<br /><br /> AREA vectors,CODE,READONLY<br /> ENTRY<br /><br />;interrupt vectors<br />;中断向量表<br />Reset<br /> LDR PC, ResetAddr<br /> LDR PC, UndefinedAddr<br /> LDR PC, SWI_Addr<br /> LDR PC, PrefetchAddr<br /> LDR PC, DataAbortAddr<br /> DCD 0xb9205f80<br /> LDR PC, [PC, #-0xff0]<br /> LDR PC, FIQ_Addr<br /><br />ResetAddr DCD ResetInit<br />UndefinedAddr DCD Undefined<br />SWI_Addr DCD SoftwareInterrupt<br />PrefetchAddr DCD PrefetchAbort<br />DataAbortAddr DCD DataAbort<br />Nouse DCD 0<br />IRQ_Addr DCD 0<br />FIQ_Addr DCD FIQ_Handler<br /><br />;未定义指令<br />Undefined<br /> B Undefined<br /> <br />;取指令中止<br />PrefetchAbort<br /> B PrefetchAbort<br /><br />;取数据中止<br />DataAbort<br /> B DataAbort<br /><br />;快速中断<br />FIQ_Handler<br /> STMFD SP!, {R0-R3, LR}<br /> BL FIQ_Exception<br /> LDMFD SP!, {R0-R3, LR}<br /> SUBS PC, LR, #4<br /><br /><br />InitStack <br /> MOV R0, LR<br /><br />;Build the SVC stack<br />;设置中断模式堆栈<br /> MSR CPSR_c, #0xd2<br /> LDR SP, StackIrq<br />;Build the FIQ stack <br />;设置快速中断模式堆栈<br /> MSR CPSR_c, #0xd1<br /> LDR SP, StackFiq<br />;Build the DATAABORT stack<br />;设置中止模式堆栈<br /> MSR CPSR_c, #0xd7<br /> LDR SP, StackAbt<br />;Build the UDF stack<br />;设置未定义模式堆栈<br /> MSR CPSR_c, #0xdb<br /> LDR SP, StackUnd<br />;Build the SYS stack<br />;设置系统模式堆栈<br /> MSR CPSR_c, #0xdf<br /> LDR SP, =StackUsr<br /><br /> MOV PC, R0<br /><br /><br />ResetInit<br /><br /> BL InitStack ; Initialize the stack 初始化堆栈<br /> BL TargetResetInit ; Initialize the target board 目标板基本初始化<br /> ; Jump to the entry point of C program 跳转到c语言入口<br /> B __main<br /><br /><br />__user_initial_stackheap <br /> LDR r0,=bottom_of_heap <br />; LDR r1,=StackUsr <br /> MOV pc,lr <br /> <br />StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4<br />StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4<br />StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4<br />StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4<br /><br /><br /><br /> IF :DEF: EN_CRP<br /> IF . >= 0x1fc<br /> INFO 1,"
The data at 0x000001fc must be 0x87654321.
Please delete some source before this line."<br /> ENDIF<br />CrpData<br /> WHILE . < 0x1fc<br /> NOP<br /> WEND<br />CrpData1<br /> DCD 0x87654321 ;/*When the Data is 为0x87654321,user code be protected. 当此数为0x87654321时,用户程序被保护 */<br /> ENDIF<br /><br />;/* 分配堆栈空间 */<br /> AREA MyStacks, DATA, NOINIT, ALIGN=2<br /><br />IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;Stack spaces for Interrupt ReQuest Mode 中断模式堆栈空间<br />FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;Stack spaces for Fast Interrupt reQuest Mode 快速中断模式堆栈空间<br />AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;Stack spaces for Suspend Mode 中止义模式堆栈空间<br />UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;Stack spaces for Undefined Mode 未定义模式堆栈<br /><br /><br /> AREA Heap, DATA, NOINIT<br />bottom_of_heap SPACE 1<br /><br /> AREA Stacks, DATA, NOINIT<br />StackUsr<br /><br /> END<br /><br />我的<br />初始化函数<br /><br />void TargetResetInit(void)<br />{<br />#ifdef __DEBUG_RAM <br /> MEMMAP = 0x2; //remap<br />#endif<br /><br />#ifdef __DEBUG_FLASH <br /> MEMMAP = 0x1; //remap<br />#endif<br /><br />#ifdef __IN_CHIP <br /> MEMMAP = 0x1; //remap<br />#endif<br /><br /> PINSEL0 = (PINSEL0 & 0xFFFF0000) | 0x05 | 0x50;<br /><br />/* 设置系统各部分时钟 */<br />/* Set system timers for each component */<br /> PLLCON = 1;<br />#if (Fpclk / (Fcclk / 4)) == 1<br /> VPBDIV = 0;<br />#endif<br />#if (Fpclk / (Fcclk / 4)) == 2<br /> VPBDIV = 2;<br />#endif<br />#if (Fpclk / (Fcclk / 4)) == 4<br /> VPBDIV = 1;<br />#endif<br /><br />#if (Fcco / Fcclk) == 2<br /> PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);<br />#endif<br />#if (Fcco / Fcclk) == 4<br /> PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);<br />#endif<br />#if (Fcco / Fcclk) == 8<br /> PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);<br />#endif<br />#if (Fcco / Fcclk) == 16<br /> PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);<br />#endif<br /> PLLFEED = 0xaa;<br /> PLLFEED = 0x55;<br /> while((PLLSTAT & (1 << 10)) == 0);<br /> PLLCON = 3;<br /> PLLFEED = 0xaa;<br /> PLLFEED = 0x55;<br /><br />/* 设置存储器加速模块 */<br />/* Set memory accelerater module*/<br /> MAMCR = 0;<br />#if Fcclk < 20000000<br /> MAMTIM = 1;<br />#else<br />#if Fcclk < 40000000<br /> MAMTIM = 2;<br />#else<br /> MAMTIM = 3;<br />#endif<br />#endif<br /> MAMCR = 2;<br /><br />/* 设置串行口 */<br />/* initialize UART*/<br /> //InitialiseUART0(115200);<br /><br />/* 设置实时时钟 */<br />/* initialize RTC*/<br /> CCR = 0x00;<br /> <br /> ILR = 0x03;<br /> //PREINT = Fpclk / 32768 - 1;<br /> //PREFRAC = Fpclk - (Fpclk / 32768) * 32768;<br /> YEAR=YEAR%100+2000;<br /> <br /> CCR = 0x12;<br /> //CIIR = 0x01; // 设置秒值的增量产生1次中断<br /> ILR = 0x03;<br /> CCR = 0x11; // 启动RTC<br /> <br />/* initialize VIC*/<br /> VICIntEnClr = 0xffffffff;<br /> VICVectAddr = 0;<br /> VICIntSelect = 0;<br /> //T0IR = 0xffffffff;<br /> //T0TCR = 0X02;<br /> //T1IR = 0xffffffff;<br /> //T1TCR = 0X02;<br />} |
|