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.

[参考译文] TM4C1294KCPDT:串行端口驱动程序调试问题

Guru**** 2614265 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/776536/tm4c1294kcpdt-serial-port-driver-debugging-problem

器件型号:TM4C1294KCPDT

没有操作系统、以下串行端口中断功能可以正常打印信息。

空 UARTIntHandler (空)

  uint32_t ui32Status;

                       字符数据;

 

  //获取中断状态。

  ui32Status = ROM_UARTIntStatus (UART0_BASE、TRUE);

 

  //清除已发出的中断。   

  ROM_UARTIntClear (UART0_BASE、ui32Status);

 

  //在接收 FIFO 中有字符时循环。

  while (ROM_UARTCharsAvail (UART0_BASE))

  {

    //从 UART 读取下一个字符。

    数据= ROM_UARTCharGetNonBlocking (UART0_BASE);

    /*检查环形缓冲区是否有可用空间并输入数据*/

                                               

                                               如果(!RingBufFull (&sUartRing)){

                                               RingBufWriteOne (&sUartRing,数据);

                                               }                                   

  }

2.  在 ucos3系统中,1的中断功能异常,部分内容被打印,但 下面的串行端口中断功能可以正常打印信息。

空 UARTStdioIntHandler (空)

  uint32_t ui32Ints;

  int8_t cChar;

  int32_t i32char;

  静态 bool bLastWasCR = false;

 

  //

  //获取并清除当前中断源

  //

  ui32Ints = MAP_UARTIntStatus (g_ui32Base、true);

  MAP_UARTIntClear (g_ui32Base、ui32Ints);

 

  //

  //我们是否因为 TX FIFO 有可用空间而被中断?

  //

  IF (ui32INT 和 UART_INT_TX)

  {

    //

    //将尽可能多的字节移入发送 FIFO。

    //

    UARTPrimeTransmit (g_ui32Base);

 

    //

    //如果输出缓冲区为空,请关闭发送中断。

    //

    if (TX_buffer_empty)

    {

      MAP_UARTIntDisable (g_ui32Base、UART_INT_TX);

    }

  }

 

  //

  //我们是否因为接收到的字符而被中断?

  //

  IF (ui32INT 和(UART_INT_RX | UART_INT_RT)

  {

    //

    //从 UART 获取所有可用字符。

    //

    while (map_UARTCharsAvail (g_ui32Base))

    {

      //

      //读取字符

      //

      i32Char = MAP_UARTCharGetNonBlocking (g_ui32Base);

      cChar =(unsigned char)(i32Char & 0xFF);

 

      //

      //如果禁用了回显,我们将跳过各种文本过滤

      //支持时通常需要的操作

      //命令行。

      //

      if (!g_bDisableEcho)

      {

        //

        //通过擦除中的最后一个字符来处理退格

        //缓冲区。

        //

        if (cChar ='\b')

        {

          //

          //如果缓冲区中已经有任何字符,那么

          //删除最后一个。

          //

          if (!RX_buffer_empty)

          {

            //

            //擦除用户上一个字符

            //终端。

            //

            UARTwrite ("\b\b\b"、3);

 

            //

            //减少缓冲区中的字符数。

            //

            if (g_ui32UARTRxWriteIndex = 0)

            {

              G_ui32UARTRxWriteIndex = UART_RX_buffer_size - 1;

            }

            其他

            {

              g_ui32UARTRxWriteIndex--;

            }

          }

 

          //

          //跳过以读取下一个字符。

          //

          继续;

        }

 

        //

        //如果此字符为 LF,最后一个字符为 CR,则只能起作用

        //因为我们已经回传了之前的 CR 和我们的字符

        //如果没有,则不想在缓冲区中存储2个字符

        //需要。

        //

        if ((cChar ='\n')&& bWasLastCR)

        {

          bLastWasCR = false;

          继续;

        }

 

        //

        //查看是否接收到换行符或转义字符。

        //

        if ((cChar ='\r')||(cChar ='\n')||(cChar == 0x1b)

        {

          //

          //如果字符是 CR,则可以后跟一个

          // LF、应与 CR 配对。  请记住这一点

          //收到一个 CR。

          //

          if (cChar ='\r')

          {

            bLastWasCR = 1;

          }

 

          //

          //无论接收到的线路端接字符是什么,

          //在接收缓冲区中放置一个 CR 作为标记指示

          // UARTges()行结束的位置。  我们还发送

          //增加 LF 以确保本地端子回波

          //接收 CR 和 LF。

          //

          CChar ='\r';

          UARTwrite ("\n"、1);

        }

      }

 

      //

      //如果接收缓冲区中有空格,请输入字符

      //否则将其丢弃。

      //

      if (!RX_buffer_full)

      {

        //

        //将新字符存储在接收缓冲区中

        //

        G_pcUARTRxBuffer[g_ui32UARTRxWriteIndex]=

          (unsigned char)(i32Char & 0xFF);

        Adv_RX_buffer_index (g_ui32UARTRxWriteIndex);

 

        //

        //如果启用了回显,请将字符写入发送

        //缓冲区、以便用户获得一些即时反馈。

        //

        if (!g_bDisableEcho)

        {

          UARTwrite((const char *)&cChar、1);

        }

      }

    }

 

    //

    //如果我们向发送缓冲区写入任何内容,请确保它是实际的

    //进行传输。

    //

    UARTPrimeTransmit (g_ui32Base);

    MAP_UARTIntEnable (g_ui32Base、UART_INT_TX);

  }

在中断函数2中、在代码工程中、添加 printf 函数也会打印一部分信息。
之前的打印信息由 UARTPrint 打印。

总之、调用1描述的中断并调用 printf 时、问题与之类似。
    
这两个中断之间的区别是什么、除了打开 RX、断开 RT 和 TX (这不影响打印信息)
请帮助分析和解释上述情况。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我不确定为什么中断函数1不能用于操作系统。 也许、它可能与操作系统处理/管理中断的方式有关。 我对 ucos3不熟悉、因此无法提供太多见解。 但是、您提到了 printf。 我不建议您使用 printf 作为调试方法。 如果您设法使用 UARTstudio 替换 printf、则不应尽可能使用 printf。 printf 使用 CIO、这是一种与 I/O 交互的复杂方法 请查看此 wiki 链接、其中提到不在不安全的中断处理程序中使用 printf。
    processors.wiki.ti.com/.../Tips_for_using_printf
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我没有听到你的反馈。 我假设您的问题通过 wiki 链接得到了解决、该链接介绍了如何处理 printf 对您有所帮助。 我现在要关闭这个线程。 如果您有新问题、您可以打开新主题、如果问题未得到解决、则重新打开此主题。