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.

[参考译文] CC2652R:如何获得不能被 BIOS 取代的定时器中断(SysTick)?

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1441899/cc2652r-how-to-get-a-timer-interrupt-that-cannot-be-preempted-by-the-bios-systick

器件型号:CC2652R
主题中讨论的其他器件:SysConfig

工具与软件:

我必须通过6个数字输出和1个 DAC 生成波形。 我已经设置了一个计时器中断来处理7个信号、并为下一个周期重新编程计时器。 在 DO 和 DAC 上、我得到的脉冲为25us、每4ms 发生一次。 这是我需要的东西。 但是、有时我收到一个干扰信号、使25us 脉冲持续300毫秒。 我怀疑 TI-RTOS 系统定时器为了使定时器的比较值被传递并且定时器在再次触发中断前运行一个完整的周期而在我的中断发生之前优先于我的中断太长时间。 那么、快速的问题是:是否有可能获得不受任何东西(包括 TI-RTOS)抢先的计时器中断?  我从"Simple GATT 配置文件"示例开始、使用的是 SysConfig 工具。

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

    Remi、您好!

    我希望您可以做得更好、您使用的是哪个 CCS 版本和 SDK 版本?

    谢谢!
    Alex F

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

    您好、Alex、

    CCS 版本:Linux 上为12.8.1.00005

    simplelink_cc13xx_cc26xx_sdk_7_41_00_17

    谢谢你

    雷米

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

    Remi、您好!

    很抱歉耽误你的时间、  

    [quote userid="305147" url="~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1441899/cc2652r-how-to-get-a-timer-interrupt-that-cannot-be-preempted-by-the-bios-systick 是否可以获得一个不受任何事物(包括 TI-RTOS)抢先的计时器中断?

    -我们可以在这里访问 HWI 模块,参考下面的线程, https://e2e.ti.com/f/1/t/741555/。  

    谢谢!
    Alex F

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

    您好、Alex、

    感谢您的回答。 我尝试了主题中建议的内容。 为了使其能够编译、我必须包含 . 但当它运行时、它会旋转到 Error.c 中的以下位置:

       if (Error_policy_D == Error_spin){
           for (;;){
           }
       }

    我将发布代码片段:

    在 main.c 中:

     SimplePeripheral_createTask ();
     MyCommApp_createTask();
     start_waveform_timer();

     /*启用中断并启动 SYS/BIOS *
     BIOS_start();

     返回0;
    }

    在 Waveform.c 中:

    void TimerCallbackFunction(){
       waveCallback();
    }

    void Start_Waveform_timer(){
       /*
       Timer_Params_(&tParams);
       tParams.periodUnits = Timer_period_US;
       tParams.period = 1000;
       tParams.timerMode = Timer_Continuous_callback;
       tParams.timerCallback = TimerCallbackFunction;

       tHandle = Timer_open (CONFIG_TIMER_0、&tParams);
       Timer_start (tHandle);
       */
       SysTickDisable();
       SysTickPeriodSet (48000);// 1ms 中断时序
       SysTickIntRegister (TimerCallbackFunction);
       SysTickIntEnable();
       SysTickEnable();
       IntMasterEnable();

       dac_init();
       DAC_Params dacParams = DAC_defaultParams;
       dacHandle = DAC_open (CONFIG_DAC_0、&dacParams);
       DAC_ENABLE (dacHandle);
    }

    您可以在 Start_waveform_timer()中看到、来自线程的代码处于活动状态。 您还可以看到我创建的代码的注释、它运行良好、除了干扰代码。

    该线程是否可能已过时(关于 TI-RTOS7)? 我怀疑 RTOS 利用 SysTick 来优先于任务、这会解释为什么 SysTick 混乱会导致错误。

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

    您好 Remi Demers:

    对 TI-RTOS7的更新可能更改了一些影响 SysTick 的内容。 这只是一个问题、但你是否曾尝试在想要保护的代码部分包装一个信标?

    谢谢!
    Alex F

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

    您好、Alex、

    我没有使用信标。 我阅读了关于信标的部分、我认为这部分并不适用、因为我在任务之间并不交换任何信息。 生成波形的代码会在任何任务之外执行、仅在中断服务例程中执行。

    在读取信号量时、我发现 RTOS 有时会暂停中断。 这可能是问题的主要原因。 我更改了我的代码、不再在 ISR 内对计时器进行重新编程、并将最短脉冲更改为50us。 我仍然有干扰、但现在50us 有时延长到1ms、而不是300ms。

    我想知道是否有可能依靠 RTOS 每50us 调用一次我的波形函数?

    这是中断调用的函数:

    void TimerCallbackFunction(){
       //waveCallback ();
       静态 uint8_t cycle = 0;
       静态 uint16_t dacBase = 0xFF00;
       静态 int8_t RATE = 1;
       静态 int16_t dacRate =-10;
       if (cycle<1)
           Rate = 1;
       if (cycle>19)
           RATE =-1;
       周期+=速率;

       if (dacBase<1)
           dacRate = 10;
       if (dacBase>0xFF00)
           dacRate =-10;
       dacBase += dacRate;

       if (cycle==0){
           // DAC 上的脉冲
           ((uint32_t*)(0x400C9044))[0]= 255;

           //设置数字脉冲
           ((uint32_t*)(0x400220A0))[0]= 0b0000000000000000000000000000;
           ((uint32_t*)(0x40022090))[0]= 0b00000000000000000000000010000000;
       }
       设计
       {
           // DAC 基线
           ((uint32_t*)(0x400C9044))[0]= dacBase>>8;

           //清除数字脉冲
           ((uint32_t*)(0x400220A0))[0]= 0b00000000000000000000000010000000;
           ((uint32_t*)(0x40022090))[0]= 0b00000000000000000000000000000000;
       }
    }

    谢谢

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

    Remi、您好!

    我想知道是否可以依靠 RTOS 每50 μ s 调用一次波形函数?

    在这里应该可以设置一个任务或中断、将其配置为每50us 关闭一次、你是否已经围绕任务/中断的优先级进行了更改?  

    谢谢!
    Alex F

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

    您好、Alex、

    是的、使用 SysConfig、我已将计时器中断优先级设置为1。 我会选择0、但它在 SysConfig 中不可用、只有1至7。 当优先级较高时、干扰仍然发生、但频率较低。 在我的终端应用中、任何干扰都是可以接受的。

    谢谢

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

    您好、Alex、

    我在 TI-RTOS 基础知识文档中发现这一点:

    • 硬件中断(Hwi) : Hwi 运行到完成。 他们不会因为任何原因而阻塞。 它们可能会被优先级更高的 Hwi 占先。 所有 Hwi 共享同一个堆栈(系统堆栈)。

      可以用‘C’编写 Hwi。 它们由 TI-RTOS7调度程序进行管理、但零延迟中断除外。 应用程序可以将任何中断指定为"零延迟"中断。 这意味着 TI-RTOS7调度程序不会与该中断进行交互。 我们将其称为零延迟中断、因为 TI-RTOS7内核会向这些中断的执行添加零延迟。 零延迟中断的缺点是它们无法调用内核调度程序 API (例如Semphore_post()等)。

    零延迟中断正是我所需要的。 我还不知道该怎么做。 请参见指向文档的链接: https://dev.ti.com/tirex/explore/node?node=A__ATkPgRhVpDZIvTj00Xr4hQ__com.ti.SIMPLELINK_ACADEMY_CC13XX_CC26XX_SDK__AfkT0vQ__LATEST&placeholder=true

    雷米