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.

[参考译文] TMS570LC4357:基于 FreeRTOS 创建信标和 RTI 中断冲突

Guru**** 2427710 points
Other Parts Discussed in Thread: TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1296260/tms570lc4357-creating-semaphore-and-rti-interrupt-conflict-based-on-freertos

器件型号:TMS570LC4357

您好、我想问一下、在 TMS570LC4357中基于 FreeRTOS 创建信标是否与 RTI 中断冲突

具体的现象如下:

当主函数中未创建信标时、可进入 RTI 的 rtiNotification 中断;

将其它代码保持不变并把 CAN1添加到主函数中_ semaphore=xSemaphoreCreatBinary ();要创建一个信号量,无法进入 RTI 的 rtiNotification 中断

具体配置如下:

RTI 使用 Block1和 compare1进行计数和启用:

rtiREG1->CAPCTRL = 2U |0U;//启用捕获计数器1,由事件源0触发
rtiEnableNotification (rtiREG1、rtiNOTIFICION_COMPARE1);
rtiStartCounter (rtiREG1、rtiCOUNTER_Block1);

按如下方式配置中断矢量表:

静态 const t_isrFuncPTR s_vim_init[128U]=
{
phantomInterrupt (&P)、
esmHighInterrupt (&E)、
phantomInterrupt (&P)、  
&vPortPreemptiveTick;  
资源1高级别中断(&R)、
属性2HighLevelInterrupt (&R)、
......

rticompare1HighLevelInterrupt 函数的配置如下:

#pragma code_State (rticompare1HighLevelInterrupt、32)
#pragma 中断(rticompare1HighLevelInterrupt, IRQ)
void rticompare1HighLevelInterrupt (void)
{
rtiREG1->INTFLAG = 2U;
rtiNotification (rtiREG1、rtiNOTIFICION_COMPARE1);

如果 FreeRTOS 操作系统和 RTI 之间存在冲突、如何使用看门狗

非常期待你的答复,非常感谢。

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

    尊敬的胡江博:

    我能否找到最简单的项目在结束时触发此问题?

    --
    谢谢。此致、
    Jagadish。

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

    e2e.ti.com/.../1125.rar
    你好、jagadish gundavarapu、

    这是我的项目。

    当我注释掉时

    CAN1_Semaphore = xSemaphoreCreateBinary ();//创建CAN1信号量
    CAN2_Semaphore = xSemaphoreCreateBinary ();//创建CAN2信号量

    程序可以进入 rtiNotification 中断。

    相反、这是不可能的。

    非常感谢、我们期待您的回答

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

    尊敬的胡江博:

    我找到了问题的根本原因!

    CPSR 寄存器中的标志"i"将决定 IRQ 中断是处于启用状态还是禁用状态。

    如果此 IRQ_DISABLE 位为1表示、则 IRQ 中断被禁用、否则 IRQ 中断被启用。

    实际上、直到调用函数"taskENTER_critical"之前、IRQ_disable 位值仅为0、这意味着仅启用中断、但一旦我们调用该函数 、IRQ_disable 值就会变为1、因为这是监控模式。

    但该标志不会清除任何位置、中断仅处于禁用状态。

    当我们进入临界区时、最好清除中断以消除条件周围的竞争:

    但是、再说一次、在我们从关键段退出之后、最好重新启用中断:

    因此、您只需在创建二进制信号量后调用"_enable_IRQ_interrupt_"、如下所示:

    这将重新启用中断、因此我们的 RTI 中断将按我们的预期再次工作。

    --
    谢谢。此致、
    Jagadish。

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

    你好、jagadish

    非常感谢您的回复和解决我的问题

    表达我最崇高的敬意

    祝愿您生活幸福、工作顺利

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

    非常感谢你,并希望你也一样!