This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

系统滴答定时器中断

Other Parts Discussed in Thread: TM4C123GH6PM

编译环境:KEIL MDK5,运行在TM4C123GXL,系统运行大约一至两秒之后,就会跑飞,使用Debug后发现一只停在startup.S的B SysTick_Handler,

程序如下

#include "inc/hw_memmap.h"
#include "inc/hw_gpio.h"
#include "inc/hw_sysctl.h"
//#include "inc/tm4c123gh6pm.h"
#include "inc/hw_ints.h"
#include "inc/hw_nvic.h"
#include "inc/hw_types.h"
#include "inc/hw_ints.h"

#include "driverlib/debug.h"
#include "driverlib/systick.h"

#include "driverlib/interrupt.h"
#include "driverlib/rom_map.h"

#include "driverlib/rom.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"

int main(void)

{

                  SysCtlClockSet(SYSCTL_SYSDIV_1 |SYSCTL_USE_OSC|
                                             SYSCTL_OSC_MAIN |SYSCTL_XTAL_16MHZ);
    
                ROM_FPUEnable();
                ROM_FPULazyStackingEnable();
                ROM_SysTickPeriodSet(ROM_SysCtlClockGet());
                ROM_SysTickEnable();

                IntEnable(0x0f);
                SysTickIntEnable();
                IntMasterEnable();

}

extern void SysTick_Handler(void)
{
    sysTickUptime++;
    scheduler_cnt_1ms++;
    scheduler_cnt_2ms++;
    scheduler_cnt_5ms++;
    scheduler_cnt_10ms++;
    scheduler_cnt_20ms++;

//    UARTprintf("int.................\n");
}   

启动代码使用的是startup_TM4C123.S

SysTick_Handler\
                PROC
                EXPORT  SysTick_Handler           [WEAK]
                B       .                      (程序运行后停留在这里)
                ENDP

  • 启动文件更换为startup_rvmdk.s

    在EXOPRT之前声明了外部函数EXTERN SysTick_Handler

    在向量表中改为        DCD     SysTick_Handler             ; The SysTick handler

    但是却报错为.\Output\Copter_4x.axf: Error: L6218E: Undefined symbol SysTick_Handler (referred from startup_rvmdk.o).

    仍未解决

  • 主要原因在于我的程序使用C++编写,

    所以

    中断函数定义前也要加上 extern "C"。中断函数,名字已经固定了(在你使用MDK给的启动代码的情况下),
      而C++对函数的生成的目标代码的命名方式和C语言不一样(为了支持重载),
      然后我是以这种方式来解决的,
      #define ARMAPI extern "C"
      ARMAPI void EXTI15_10_IRQHandler(void)
      {
      ...
      }
  • 居然用的是c++,好高大上。