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.

TMS570LS0914如何实现代码的临界区保护(或者说中断锁)

比如程序中会对一些关键性代码(函数)做保护,不允许被其他中断函数打断,怎么实现呢?可否有具体的实现代码,因为我们目前通过简单的在进入关键性代码之前关中断,执行完关键代码后开中断,会导致程序跑飞,进入_dabort,实在找不到原因,我个人也觉得这样简单的操作是有问题的,TI的大神们,可否提供相关例子参考参考?

  • 在IRQ处理函数起始处通过如下所示汇编代码进行现场保护,处理完毕后再进行恢复。

    同时在保护好现场后需要将优先级等于或小于本身的IRQ中断禁掉,恢复现场后再将相应中断打开。中断关闭打开操作可以通过VIM进行。这样就可以实现高优先IRQ的嵌套处理。

    #pragma INTERRUPT(rtiCompare0Interrupt, IRQ)

    void rtiCompare0Interrupt(void)

    {

    /* USER CODE BEGIN (39) */

    /* USER CODE END */

    rtiREG1->INTFLAG = 1U;

    asm(" STMFD SP!, {R0-R12, LR}");/*Save R0- R12, LR_irq*/

    asm(" mrs lr, spsr"); /* Copy SPSR_irq to LR */

    asm(" STMFD SP!, {LR}"); /* Save SPSR_irq */

    asm(" MSR CPSR_c, #0x1F"); /* Enable IRQ (Sys Mode) */

    asm(" STMFD SP!, {LR}"); /* Save LR */

    rtiDisableNotification(rtiNOTIFICATION_COMPARE0);/*Disable rtiCompare1 Interrupt iteself */

    rtiNotification(rtiNOTIFICATION_COMPARE0);

    //asm(" LDMFD SP!, {R0-R12}");/*Restore R0-R12*/

    asm(" LDMFD SP!, {LR}"); /* Restore LR */

    asm(" MSR CPSR_c, #0x92"); /* Disable IRQ (IRQ Mode) */

    asm(" LDMFD SP!, {LR}"); /* Restore SPSR_irq to LR */

    asm(" MSR SPSR_cxsf, LR"); /* Copy LR to SPSR_irq */

    asm(" LDMFD SP!, {R0-R12, LR}");/* Restore LR */

    rtiEnableNotification(rtiNOTIFICATION_COMPARE0);/*Enable rtiCompare1 Interrupt */
  • 你好,Susan Yang:

    可能是我没有表达清楚,我并不是想要实现中断嵌套,我是想实现代码的临界区保护功能(critical section)。因为我们程序中用到了MCAL,在MCAL的程序中有很多如下的语句,目前都是空语句(未实现):

    如下图所示在Gpt模块里面的:

    在SPI模块里面的:

    之前我们是用_disable_interrupt_()和_enable_interrupt_()来实现Spi_GlobalSuspend()和Spi_GlobalRestore(),发现程序一运行就会进入_dabort。所以怀疑是不是实现方式有问题。

    另外想问一下,你们能否提供MCAL相关的570例程,供我们参考一下你们是怎么实现的?如果有的话我们可以在你们工程的基础上移植我们的程序,保证底层都是没问题的,因为我们目前碰到的问题貌似是程序运行的时候有一个全局缓冲区的数据会错乱,因为我们程序的整体架构(程序很大)就是以临界区保护机制为基准的,目前被卡在一加中断锁,程序就跑入_dabort,实在找不到原因。

  • 很抱歉,MCAL的相关程序是需要签署NDA才能提供给客户的,参考

    e2e.ti.com/.../708624
  • 你好,Susan Yang:
    MCAL驱动程序我们已经有了,不过只是我们在使用过程中遇到一些问题,所以来这里问一下。还有一点就是我们就算不用MCAL,该怎么实现中断锁的功能呢?因为我们 测试了不用MCAL的程序,用了我上面描述中断锁的方法,发现也会进入_dabort,主要是想问TMS570是怎么实现中断锁的方法,有没有参考例程。
  • 很抱歉,我这边是没有MCAL的相关程序的,所以无法查看并调试其中的代码。建议您去英文E2E上咨询相关的BU。

    e2e.ti.com/.../312