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.

[参考译文] TMS320F28388D:无法在 CM 中设置中断优先级、导致 FreeRTOS 中出现断言失败

Guru**** 2515665 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1561777/tms320f28388d-unable-to-set-interrupt-priority-in-cm-causing-assert-fail-in-freertos

器件型号:TMS320F28388D
主题:C2000WARE 中讨论的其他器件

工具/软件:

根据 CM 的 FreeRTOS 端口文档、任何使用 BIOS API 功能的中断都必须具有高于 ucMaxSysCallPriority(优先级较低)的优先级。  

我尝试配置在字符 Rx 上中断时生成的 UART ISR、并让 ISR 读取字符并放入消息队列(非常基本的东西)。 默认的中断优先级必须更改、但函数“Interrupt_setPriority ()“似乎没有效果、断言失败仍然发生。 无论我将 UART ISR 优先级设置为什么、它始终保持为 0。  

我尝试了从 C2000Ware 导入示例 (C2000Ware_kernel/freertos/c2000_F2838x_CM_CCS)、但当我尝试加载示例时、CCS 会显示错误、说未安装编译器 22.6.2.LTS、即使安装了编译器。

这应该非常简单、如何解决?

我在 Ubuntu 24.04 中运行 CCS 12.8.1。 assert failure 发生在 port.c 的第 589 行: configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );

谢谢你。

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

    尊敬的 Kevin:

    让我让 FreeRTOS 专家来看看这个问题。

    此致、

    Delaney

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

    尊敬的 Kevin:  

    编译器错误是由于 projectspec 中的版本不匹配导致的、您可以替换 C2000Ware/kernel/freertos/Demo/C2000_F2838x CM_CCS/CCS 文件夹、下面提供了链接。 (这只是更新 ARM 编译器版本、如果仍然不匹配、您可以在文本编辑器中打开 projectspec 文件、并手动更新到安装的版本。 应在下一个 SDK 版本中解决此问题)

    e2e.ti.com/.../5658.CCS.zip

    回归  Interrupt_setPriority () 的问题、您如何传递 UART 中断的优先级以及如何读回它?  我无法重新创建您的问题。

    此致、  

    Arnav

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

    您好、Arnav

    这是从 main 调用的用于初始化端口的代码。 这主要取自示例代码:

    //! @注意:必须>= configMAX_SYSCALL_INTERRUPT_PRIORITY!!
    静态 uint8_t UART_ISR_PRIORITY =(0xc0);  //优先级 6 (6 << 7)

    void DbgPortInit (uint32_t uartBase)

      //配置 UART
      UART_setConfig (uartBase、UART_CLK_FREQ、波特率、  
        (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);
      //在处理器 (NVIC) 上启用 UART0 中断。
      UART_registerInterrupt (INT_UART0、UART_ISR);
      //设置中断优先级
      INTERRUPT_setPriority (INT_UART0、UART_ISR_PRIORITY);
      // FIFO 使能
      UART_enableFIFO (uartBase);
      UART_setFIFOLevel (UART0_BASE、UART_FIFO_TX1_8、UART_FIFO_RX1_8);

      //接收中断配置
      UART_clearInterruptStatus (UART0_BASE、UART_INT_RX | UART_INT_RT);
      UART_enableInterrupt (UART0_BASE、UART_INT_RX);
    }

    同样、这是 ISR 主要来自示例代码:

    __中断无效 UART_ISR (void)

      uint32_t isrStat = UART_getInterruptStatus (uartBase、UART_raw_INT);
      字符通道;
      basetype_t higherPriorityTaskWoken;
       
      如果 (isrStat &(uint32_t) UART_INT_RX)=(uint32_t) UART_INT_RX){

        while (UART_isDataAvailable (uartBase)){
           
          Ch =(char) UART_readCharNonBlocking (uartBase);
          xQueueSendFromISR (portRxQueue、&ch、&higherPriorityTaskWoken);
        }
      }


      if ((isrStat &(uint32_t) UART_INT_TX)==(uint32_t) UART_INT_TX){
        while (UART_isSpaceAvailable (uartBase)){
          if (xQueueReceiveFromISR (portTxQueue、&ch、&higherPriorityTaskWoken)){
            UART_writeCharNonBlocking (uartBase、(uint8_t) ch);   
          }
          否则{
            //队列为空将禁用进一步的 TX 中断
            uart_disableInterrupt (uartBase、UART_INT_TX);
          }
        }
      }

      uart_clearInterruptStatus (uartBase、isrStat);
      portYIELD_FROM_ISR (HigherPriorityTaskWoken);
    }

    当  调用 xQueueSendFromISR() 或 xQueueReceiveFromISR() 时、处理器在第 589 行或 port.c 上的断言时停止:

          configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );

    在 CCS 中、ucCurrentPriority 为 0、NVIC 寄存器中也是 0。

    您提供的代码不会构建。 我收到这个链接器错误(这是我绕过 CCS 工程导入时工程中发生的情况):

     未定义            首次引用             
     符号               In file                
     -----            ------------------------             
     vPortValidateInterruptPriority ./third_party/freertos/Source/queue.obj

    我将其添加到 FreeRTOSConfig.h 以进行构建:

    #include “assert.h"</s>“
    #define configASSERT (x) ASSERT (x)

    但现在我得到了断言失败。 但是,如果我只是这样做

    #define configASSERT

    然后它会编译、但 CPU 在 ISR 中挂起。

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

    尊敬的 Kevin:

    在 Interrupt_setPriority 中、应该直接传递 数字优先级值、即 6。 该 功能负责内部换档。 完成此更改后、您应该能够正确地看到中断优先级更改。

    此致、

    Arnav

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

    这个问题解决了、谢谢。