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.

[参考译文] RTOS/TM4C1233H6PM:间歇性默认 ISR 处理程序调用

Guru**** 1810550 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/590213/rtos-tm4c1233h6pm-intermittent-default-isr-handler-call

器件型号:TM4C1233H6PM

工具/软件:TI-RTOS

每次我编译和调试时、它都非常一致、我会遇到 调用 IntDefaultHandler 函数的问题。

首次运行:定时器按预期触发中断

第二次运行:调用 IntDefaulHandler

第三次运行:定时器按预期触发中断

第四次运行:调用 IntDefaultHandler

我不确定是什么会导致这种行为、但直到我有第四个和第五个计时器中断时才开始发生这种行为。 以下是我看到上述问题的代码:

//*********
//*设置计时器
// /

//启用处理器中断。
IntMasterEnable();

//启用外设 TIMER0
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
SysCtlPeripheralEnable (SYSCTL_Periph_Timer1);
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER2);
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER3);
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER4);
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER5);

//将计时器配置为拆分两个16位周期计时器
TimerConfigure (TIMER0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIOD | TIMER_CFG_B_PERIODICRACASE);
TimerConfigure (Timer1_base、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIOD | TIMER_CFG_B_PERIODICRACASE);
TimerConfigure (TIMER2_base、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIOD | TIMER_CFG_B_PERIODICRACASE);
TimerConfigure (TIMER3_base、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIOD | TIMER_CFG_B_PERIODICRACASE);
TimerConfigure (TIMER4_base、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIOD | TIMER_CFG_B_PERIODICRACASE);
TimerConfigure (TIMER5_base、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIOD | TIMER_CFG_B_PERIODICRACASE);

//启用等待触发
//TimerControlWaitOnTrigger (TIMER0_BASE、TIMER_B、TRUE);

//设置周期性计时器的时间延迟
TimerLoadSet (TIMER0_BASE、TIMER_A、13000);
TimerLoadSet (TIMER0_BASE、TIMER_B、10000);// 0.5 SEC

//设置周期性计时器的时间延迟
TimerLoadSet (Timer1_base、timer_A、7000);
TimerLoadSet (Timer1_base、timer_B、4000);// 0.5 SEC

//设置周期性计时器的时间延迟
TimerLoadSet (TIMER2_base、timer_A、8000);
TimerLoadSet (TIMER2_base、TIMER_B、5000);// 0.5 SEC

//设置周期性计时器的时间延迟
TimerLoadSet (TIMER3_base、TIMER_A、13000);
TimerLoadSet (TIMER3_base、TIMER_B、10000);// 0.5 SEC

//设置周期性计时器的时间延迟
TimerLoadSet (TIMER4_base、TIMER_A、7000);
TimerLoadSet (TIMER4_base、TIMER_B、4000);// 0.5 SEC

//设置周期性计时器的时间延迟
TimerLoadSet (TIMER5_base、TIMER_A、8000);
TimerLoadSet (TIMER5_base、TIMER_B、5000);// 0.5 SEC


//在处理器(NVIC)上启用 TIMER0A 和 TIMER0B 中断。
IntEnable (INT_TIMER0A);
IntEnable (INT_TIMER0B);

IntEnable (INT_TIMER1A);
IntEnable (INT_TIMER1B);

IntEnable (INT_TIMER2A);
IntEnable (INT_TIMER2B);

IntEnable (INT_TIMER3A);
IntEnable (INT_TIMER3B);

IntEnable (INT_TIMER4A);
IntEnable (INT_TIMER4B);

IntEnable (INT_TIMER5A);
IntEnable (INT_TIMER5B);

//寄存器计时器中断
TimerIntRegister (TIMER0_BASE、TIMER_A、Timer0AIntHandler);
TimerIntRegister (TIMER0_BASE、TIMER_B、Timer0BIntHandler);

TimerIntRegister (Timer1_base、timer_A、Timer1AIntHandler);
TimerIntRegister (Timer1_base、timer_B、Timer1BIntHandler);

TimerIntRegister (TIMER2_base、TIMER_A、Timer2AIntHandler);
TimerIntRegister (TIMER2_base、TIMER_B、Timer2BIntHandler);

TimerIntRegister (TIMER3_base、TIMER_A、Timer3AIntHandler);
TimerIntRegister (TIMER3_base、TIMER_B、Timer3BIntHandler);

TimerIntRegister (TIMER4_base、TIMER_A、Timer4AIntHandler);
TimerIntRegister (TIMER4_base、TIMER_B、Timer4BIntHandler);

TimerIntRegister (TIMER5_base、TIMER_A、Timer5AIntHandler);
TimerIntRegister (TIMER5_base、TIMER_B、Timer5BIntHandler);

//启用计时器中断
TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT);
TimerIntEnable (TIMER0_BASE、TIMER_TIMB_TIMEOUT);

TimerIntEnable (Timer1_base、timer_TINA_TIMEOUT);
TimerIntEnable (Timer1_base、timer_TIMB_TIMEOUT);

TimerIntEnable (TIMER2_base、TIMER_TINA_TIMEOUT);
TimerIntEnable (TIMER2_base、TIMER_TIMB_TIMEOUT);

TimerIntEnable (TIMER3_base、TIMER_TINA_TIMEOUT);
TimerIntEnable (TIMER3_base、TIMER_TIMB_TIMEOUT);

TimerIntEnable (TIMER4_base、TIMER_TINA_TIMEOUT);
TimerIntEnable (TIMER4_base、TIMER_TIMB_TIMEOUT);

TimerIntEnable (TIMER5_base、TIMER_TINA_TIMEOUT);
TimerIntEnable (TIMER5_base、TIMER_TIMB_TIMEOUT);

//启用计时器
TimerEnable (TIMER0_BASE、TIMER_A); 

如果有任何关于导致这种行为的建议、我们将不胜感激、谢谢!

Peyton  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您使用的是 TI-RTOS (或 SYS/BIOS...、这是 TI-RTOS 内核)还是仅使用 TivaWare 中的 driverlib?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很好的收获,很抱歉。 我只是使用 TivaWare driverlib
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没问题。 我将把该主题移至 TM4C 论坛。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="Peyton Davari">我不确定会导致这种行为的原因、但直到我遇到第四次和第五次计时器中断时才开始发生这种行为。 下面是我看到上述问题的代码、假设您使用 CCS 执行调试、我认为默认情况 下 CCS 在启动调试会话时不会执行 Tiva 器件的系统复位。 这意味着调试会话启动后、计时器外设仍会启用、以便从上一个运行中生成中断。 由于 代码中使用 TimerIntRegister()来注册中断处理程序,因此存在一个竞争条件,在该条件下,仍配置为从上一调试会话生成中断的计时器外设可以在 调用 TimerIntRegister()之前生成中断,从而调用默认的中断处理程序。

      StellarisRegistered微控制器软件故障诊断中的默认中断处理程序部分 可用于确认其中一个定时器中断是否导致调用默认中断处理程序。

    在 CCS 工程属性下、有一些选项可以设置为在下载期间执行复位、这应该会复位所有属性、在以下两个条件下:

    -调试->程序/存储器加载选项->连接选项->在连接时重置目标

    -调试->闪存设置->闪存设置->在程序加载到闪存存储器期间重置目标

    尝试设置这些选项以重置目标。

    请注意、CCS 7.0和 CCS 7.1中存在一个错误、尝试设置"Reset the target on a connect"和"Reset target during program load to Flash memory"选项不起作用(e2e.ti.com/.../589281)。 解决方法是将以下内容添加到器件的 GEL 脚本中:

    OnPreFileLoaded()
    {
    GEL_AdvancedReset ("系统重置");
    }