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.

[参考译文] RTOS/OMAP-L138:C6748 DSP:使用 DEV_createDevice 动态创建 UART 器件失败。

Guru**** 2609895 points
Other Parts Discussed in Thread: OMAP-L138, INA219, TPS65070

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/576361/rtos-omap-l138-c6748-dsp-dynamic-creating-of-a-uart-device-using-dev_createdevice-fails

器件型号:OMAP-L138
主题中讨论的其他器件: OMAPL138INA219TPS65070

工具/软件:TI-RTOS

您好!

我必须扩展 OMAP-L138 SOC 的 C674xDSP 上的现有项目。
我的工作是在某些情况下使用片上 UART2、而不是始终使用。
UART 的激活必须在运行时完成-因此我无法通过配置工具使用 UART 通道的静态创建。
可能在系统启动后很长时间内必须创建和删除片上 UART2。
因此、我尝试从这里修改 UART 示例
 ...\pspdrivers_01_30_01\packages/ti\pspiom\examples\evmOMAPL138\UART\
但使用 UART 器件的动态创建而不是示例的静态创建。
我的问题是、函数 DEV_createDevice()永远不会返回 SYS_OK、但始终返回0x07 (SYS_EMODE)。
因此,用于打开 Rx 和 Tx 通道的 GIO_CREATE ()的下一步函数调用也将失败。
 
SOC 的 GPP 正在运行 QNX、但 GPP 未触摸 UART2。
DSP 项目使用以下软件包:
 DSPBIOS 5.41.03.17
 PSP 驱动程序01.30.01
 OMAP-L138 DSP 封装1.00.00.08
 EDMA3lld 封装01.11.00.03

是否有人审查我的代码擦除并能告诉我参数或创建序列中有什么错误?
感谢大家!


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "ti/pspiom/uart/uart.h"
#include "ti/sdo/EDMA3/drv/EDMA3_drv.h"
#include "ti/pspiom/platforms/evmOMAPL138/uart_evmInit.h"

/*
 *内部参考
 *
static void genericUartTest (void);

/*
 *外部基准
 *
extern log_Obj   跟踪;
extern EDMA3_DRV_Handle hEdma[];/* EDMA 句柄(在 EDMA 模式下需要)*
extern EDMA3_DRV_result edma3init();

typedef 结构 uart2debug_t
 {
 int                dev_createDevice_Result;
 EDMA3_DRV_RESULT   edmaResult;
 gio_handle         gio_create_uart2rx_result;
 gio_handle         gio_create_uart2tx_result;
 }uart2debug_t;
uart2debug_t uart2debug;

/*
 * UART0器件参数。 以在 uart0_DEV_init 函数中填充、该函数
 在创建驱动程序之前调用*
 *
UART_Params  uart2Params =
 {
 True、                     /* cacheEnable                   */
 True、                     /* FIFO 使能                    */
 UART_OpMode_DMAINTERRUPT、 /* opMode                        *
 false,                    /* loopbackEnabled               */
 UART_波特 率_115_2K、     /*波特率                      *
 UART_NumStopBits _1、       /* stopbits                      */
 UART_Charlen_8、           /* charLen                       */
 UART_Parity、         /*奇偶                        校验*
 UART_RxTrigLate_1、         /* rxThreshold                   */
 {                         /* fc                            */
     UART_FcType_NONE、
     UART_FcParam_none
 }、
 0、                        /* edmaRxTC                      */
 0、                        /* edmaTxTC                      */
 9、                        /* hwiNumber                     *
 0xFFFFFFFF、               /* polledModeTimeout             *
 1、                        /* softTxFifoThreshold           *
 false,                    /*禁用 PSC 控制          */
           驱动程序使用的 UART_pllDomain_0 /* PLL 域 *
 };/* uart2Params */

/*
 *正在启动消息打印字符串
 *注意:只有在 DMA 模式下工作时才需要缓冲区信号。
 *
#pragma DATA_ALIGN (uart2TestStringStart、128);
静态 int8 uart2TestStringStart[128];

/* Tx 内存缓冲器*/
#pragma DATA_ALIGN (Uart2_TxBuffer、128);
静态 Int8 Uart2_TxBuffer[1024];

输入通道的/* UART 句柄*/
gio_handle hUart2_in;

输出通道的/* UART 句柄*/
gio_handle hUart2_out;

/**
 *\brief   初始化函数。
 *          此函数用于初始化 UART 驱动程序以及所需的驱动程序
 用于          创建器件的*参数。
 *
 *\param   无
 *
 *\返回  无
 *
空 USER_uart2_init ()
 {
 uart2debug.edmaResult     = 0;

 if (NULL =hEdma[0])
   {/*此分支从未通过... *
   uart2debug.edmaResult = edma3init();
   if (EDMA3_DRV_Sok!= uart2debug.edmaResult)
     {
     /*报告 EDMA 错误*/
     log_printf (&trace,"\r\nEDMA3:edma3init()失败\r\n");
     }
   其他
     {
     log_printf (&trace,"\r\nEDMA3:edma3init()传递了\r\n");
     }
   }
 其他
   {/*此分支始终通过... *
   log_printf (&trace、"\r\n EDMA3:edma3init()不需要\r\n");
   }

 // uart_init();
 uart2Params = UART_Params;
 uart2Params.hwiNumber = 9;
 uart2Params.opMode = UART_OpMode_DMAINTERRUPT;
 uart2Params.rxThreshold = UART_RxTrigLf_1;
 uart2Params.softTxFifoThreshold = 1;
 UART_INIT();

 /*在 PSC 模块中启用 EDMA */
 PWRM_setDependency (PWRM_rsrc_EDMA3_CC_0);
 PWRM_setDependency (PWRM_rsrc_EDMA3_TC_0);
 PWRM_setDependency (PWRM_rsrc_EDMA3_TC_1);
 PWRM_setDependency (PWRM_rsrc_EDMA3_TC_2);
 }/* USER_uart2_init()*/

DEV_Attrs uart2devattrs =
 {
 2、              /*.devid = UART2 */
 uart2Params、   /*.params       */
 DEV_IOMTYPE、    /*.type         */
 空            /*.devp         */
 };/* uart2devatttrs */

静态空 UART_createdev (空)
 {
 memset (uart2debug、0x00、sizeof (uart2debug));
 uart2debug.dev_createDevice_result =
   DEV_createDevice ("/UART2"、&UART_IOMFXNS、(Fxn) USER_uart2_init、&uart2devatttres);
 if (SYS_OK!= uart2debug.dev_createDevice_result)
   {/* function dev_createDevice()在此处返回0x07 (可能是 SYS_EMODE?):*/
   log_printf (&trace、"DEV_createDevice() failed\n");
   }
 其他
   {/*此分支从未通过... *
   log_printf (&trace、"dev_createDevice()完成了\n");
   }

 // if (SYS_OK = uart2debug.dev_createDevice_result)
   {
   Gio_Attrs      gioAttrs     = GIO_ATTRS;
   int32          echoStatus = Tsk0;
   UART_ChanParams 通道参数   ={NULL};
   
   /*初始化通道属性。                                         *
   gioAttrs.nPackets = 2;
   
   chanParams.hEdma = hEdma[0];
   
   /*初始化 pinmux 和 EVM 相关配置                      */
   configureUart();
   
   /*初始化 UART 当前用于显示字符串             */
   uart2debug.gio_create_uart2tx_result = hUart2_out = GIO_create ("/UART2"、IO_output、NULL、          &chanParams、&gioAttrs);
   uart2debug.gio_create_uart2rx_result = hUart2_in = gio_create ("/UART2"、io_input、 &echoStatus、&TskchanParams、&gioAttrs);
   
   if (NULL == hUart2_IN)
     {/*函数 GIO_CREATE ()始终在此处返回 NULL:*
     log_printf (&trace、"GIO_createDevice (Rx) failed\n");
     }
   其他
     {/*此分支从未通过... *
     log_printf (&trace、"gio_createDevice (Rx) Done (完成)\n");
     }
   if (NULL == hUart2_OUT)
     {/*函数 GIO_CREATE ()始终在此处返回 NULL:*
     log_printf (&trace、"GIO_createDevice (Tx) failed\n");
     }
   其他
     {/*此分支从未通过... *
     log_printf (&trace、"gio_createDevice (Tx) Done (GIO_createDevice (Tx)完成)");
     }
   
   if ((NULL!= hUart_in)&&(NULL!= hUart_out))
     {
     /*运行 UART 示例应用程序*/
     genericUartTest();
   
     /*退出                                                              */
     SYS_EXIT (0);
     }
   ShowmemCmdapd (THDUART2HPIMSGQDEV_ID_、(farp_t)(&uart2debug)、sizeof (uart2debug)、dchar2word ('L'、'D'));
   返回;
   }
 }/* UART_createDEV ()*/

/**
 *\brief  常规读写测试
 *
 *         调用此函数以测试通用 UART 测试。在此函数中
 *         测试了基本的读/写功能。
 *
 *\param  无
 *
 *\返回 无
 *
静态空 genericUartTest (空)
 {
 ptr    buf   =空;
 INT    STATUS = 0;
 size_t len   = 0;
 INT8  * str   =空;

 log_printf (&trace、"正在启动 UART 示例应用\n\r");

 STR ="UART 演示启动: 输入大小为1000字节的文件";

 /*复制到起始字符串到缓存对齐缓冲                          区*/
 len = strlen (str);
 memcpy (uartTestStringStart、str、len);

 buf = uartTestStringStart;

 状态= GIO_Submit (hUart2_out、IOM_WRITE、buf、&len、NULL);

 if (!((status =IOM 完成)||(status =IOM 挂起))
 {
     log_printf (&trace、"\r\n UART 测试字符串的 GIO_WRITE 错误\n"\});
 }

 buf = UART_TxBuffer;
 Len = 1000u;
 状态= GIO_Submit (hUart2_IN、IOM_Read、buf、&len、NULL);

 如果(!((status =IOM 已完成)||(status =IOM 挂起)))
 {
     log_printf (&trace、"\r\n 读取1000个字节时、GIO_Read 出错\n"\});
 }

 buf = UART_TxBuffer;
 Len = 1000u;
 状态= GIO_Submit (hUart2_out、IOM 写入、buf、len、NULL);

 如果(!((status =IOM 已完成)||(status =IOM 挂起)))
 {
     log_printf (&trace、"\r\n 写入1000字节时、GIO_WRITE 出错\n"\});
 }

 log_printf (&trace、"UART 示例应用程序已完成\n\r ");
 }/* genericUartTest */

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

    我已通知 RTOS 团队。 他们的反馈将在此处发布。

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

    从 DEV_createDevice()的实现中,我看到它返回 SYS_EMODE 的唯一方法是它从底层 UART 驱动程序的 mdbindDev()函数返回错误。 我认为这对应于 pspdrivers_01_30_01\packages/ti\pspiom\UART\src\UART.c 中的 uartMbindDev () 您是否已经在其他地方初始化/使用了 Uart2 (可能通过静态配置)? 否则、您可能希望尝试在 CCS 中进入此代码、以找出它到底发生了什么错误。

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

    尊敬的 Vincent:
    感谢您的提示!
    静态 DSP 配置不使用任何 UART。
    GPP RTOS QNX 也不知道地址0x01D0D000处有一个 UART。 GPP 仅使用片上 UART0。

    我查看了 pspdrivers_01_30_01\packages/ti\pspiom\UART\src\UART.c 中的函数 uartMdBindDev ()
    以下条件可能会导致返回 IOM_EBADMODE:
     条件(1)(true = Uart_module.inUse[devId])/*此实例已在使用中*/
       下面的代码行已从函数 USER_uart2_init()移动到函数 UART_createdev()
       调用 DEV_createDevice()。 因此这些行现在在 DEV_createDevice()调用发生之前执行。
         uart2Params = UART_Params;
         uart2Params.hwiNumber = 9;
         uart2Params.opMode = UART_OpMode_DMAINTERRUPT;
         uart2Params.rxThreshold = UART_RxTrigLf_1;
         uart2Params.softTxFifoThreshold = 1;
         UART_INIT();
         uart2debug.dev_createDevice_result =
           DEV_createDevice ("/UART2"、&UART_IOMFXNS、(Fxn) USER_uart2_init、&uart2devatttres);
       从 pspiom\UART\src\UART.c 调用函数 UART_init ()将清除数组 Uart_module.inUse[]。
       因为现在调用此初始化后调用 DEV_createDevice()
       条件(1)不应为真。
     条件(2)(UART_DriverState_Deleted!= instHandle->devState)//此实例已在其他位置创建,但未删除*/
       调用函数 UART_init()将用0填充所有实例的结构。
       由于枚举 UART_DriverState_Deleted 为0、因此条件(2)也不应为 true。
     条件(3)(0 = params->hwiNumber)/*无效参数*/
       由于现在在调用 DEV_createDevice()之前调用我的初始化行,因此该寄存器应该
       已设置为9、条件(3)永远不会为 true。
     条件(4)(IOM_Completed!= uartValidateParams (params))/*无效参数*/
       现在调用我的初始化行
         uart2Params = UART_Params;
       在调用 DEV_createDevice()之前,这些寄存器应仅包含有效数据
       因此条件(4)应始终为 false。

    我无法查看 DEV_createDevice()函数,因为我没有查看
    在我的文件夹中的任何位置找到此函数的任何源代码
     BIOS_5_41_03_17\packages/ti\BIOS\
     pspdrivers_01_30_01\packages/ti\pspiom

    参数或参数可能有问题
     我要转至函数 DEV_createDevice()?

    电源管理是否对 UART 器件的创建产生任何影响?
     在 pspdrivers_01_30_01\packages/ti\pspiom\UART\src\UART.c 中、返回了此故障
     与 PWRM 功能相关。


    此致、

    Uwe

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

    根据我在 uartValidateParams()中看到的代码,您的参数看起来不错。

    您是否使用 PWRM 模块来管理电源? '7'可由 PWRM_setDependency 作为 PWRM_ENOTSUPPORTED 返回(请参阅 ti/BIOS/include/pwrm.h)、这可能指向 PWRM 未正确配置。 请阅读 pspdrivers_01_30_01\docs\OMAPL138\OMAPL138_BIOSPSP_Userguide.pdf 中的第1.6节、因为它包含有关电源管理以及如何在 TCF 文件中启用 PWRM 模块的信息。

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

    尊敬的 Vincent:

    很抱歉、我没有回复您的最新帖子。

    我进行了以下修改:

    (1)在我的应用代码的结构 uart2params 中、我更改了

       从 UART_pllDomain_0到 UART_pllDomain_1的 PLL 域(自使用 UART2以来)

    (2)在 PSP 的 UART 设备驱动程序 UART.c 中、我现在忽略调用的结果

       函数 PWRM_setDependency()和 PWRM_releaseDependency()。

       两个函数都始终返回0x07 (顺便说一下、函数的调用)

       应用代码函数中 EDMA 的 PWRM_setDependency()

       USER_uart2_init()也总是返回0x07)。

       但是,现在 PSP 的函数 uartMdbindDev()和 uartMdUnBindDev()

       不要再存储 PWRM_setDependency()和 PWRM_releaseDependency()的返回值

       调用变量 RetVal。 由于我使该 RetVal 保持值 IOM_Completed、

       uartMbindDev()/uartMdUnBindDev()继续定期,

       我的应用能够通过 API GIO_CREATE ()访问 UART、

       在 EDMA 模式和中断模式下,GIO_DELETE ()、GIO_SUBMIT ()。

     

    您是否知道调用时返回值0x07的原因

       函数 PWRM_setDependency()和 PWRM_releaseDependency()?

       我在 DSPBIOS 文件夹中找不到此函数的源代码。

       忽略故障指示0x07对 UART 有任何影响、

       到 SOC 的 PLL、到 SOC 的电源管理...?

     

    此致、

    Uwe

     

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

    您好、Uwe、

    您是否按照 我的建议阅读了 pspdrivers_01_30_01\docs\OMAPL138\OMAPL138_BIOSPSP_Userguide.pdf 中的第1.6节? 它讨论 BIOS_PWRM_ENABLE 标志。 根据是否设置此标志、您必须 修改 tcf 文件以在 TCF 文件中启用 PWRM 模块、或者只需使用 BIOSPSP PSC 驱动程序。 我本来不希望您对 UART 驱动程序代码本身进行更改。

    正如我在前一条消息中提到的、0x7表示 PWRM_ENOTSUPPORTED。  BIOS API 指南(在中 /docs/spru403s.pdf) P. 因此、请确保你是否将 BIOS_PWRM_ENABLE 标志传递给编译器、并且你也会相应地修改应用程序的 tcf 文件以启用 PWRM 和资源跟踪。

    此致、

    文森特

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

    尊敬的 Vincent:

    我同意您的观点、对 UART 驱动程序代码的任何修改都不应成为让我的应用程序运行的方式。 这只是一个临时的修改、作为我尝试了解这里发生了什么并找到利用此问题的要点的一种方法。 我希望应用程序代码中的任何修改都能避免 DEV_createDevice()函数的错误结果。

    但是、您给出了检查 PWRM 模块是否已启用的提示。 很抱歉、我还没有提到我的 tcf 文件会禁用 DSP/BIOS 的电源管理 PWRM。 电源资源管理器设置为

    BIOS.PWRM.enable = 0;

    我尝试使用 UART 示例 tcf 文件中的设置

    BIOS.PWRM.enable = 1;

    BIOS.PWRM.RESOURCETRACKING = 1;

    BIOS.PWRM.scaling = 1;

    但是、通过这种 tcf 设置、我的应用程序不会在当前目标板上再启动。 我想这种行为的原因是电路板上的不同电源。 LogicPD 的 SOM-M1模块使用 IC TPS65070和 INA219进行电源和监控。 我们的 SOM-RP1使用的是 LTC3545 (5.0V -> 1.8V、3.3V)和 LTC3542 (5.0V -> 1.2V)。 由于在没有任何 I2C 接口的情况下使用这两个电源 IC、我猜 DSP-BIOS 的 PWRM API 不会运行。 因此、我必须回到 tcf 设置

    "BIOS.PWRM.enable = 0"。

    我们的目标板已有七年的历史、我现在不能建议对我的管理进行任何硬件修改。 过去几年中应用软件的早期版本、在没有 DSP-BIOS 电源资源管理器 PWRM 的情况下运行。 因此、我必须找到一种在没有 PWRM 模块的情况下运行 UART2的方法。

     

    为了强制 UART 驱动程序使用 PSP 的 PSC API 而不是 DSP-BIOS 的 PWRM、我尝试在没有 BIOS_PWRM_ENABLE 标志的情况下构建 UART 驱动程序。 现在、头文件 UartLocal.h 拒绝了使用 CHIP_C6748或 CHIP_OMAPL138的标志组合构建的 UART 驱动程序、而没有 BIOS_PWRM_ENABLE 标志(UartLocal.h、第25行)。 为了避免这种情况、我从中更改了预处理器命令

    错误"仅将 BIOS PWRM 模块用于 SoC "

    更改为

    #warn "Use BIOS PWRM module only for the SoC"(警告"仅将 BIOS PWRM 模块用于 SoC)

    现在构建完成了,DEV_createDevice()和 GIO_CREATE ()运行时不会返回任何错误,并且我可以通过 UART2发送/接收字符。

     

    但我认为编写头文件 UartLocal.h 的人有理由拒绝构建没有 PWRM 模块的 OMAPL138 SoC。 在第21页的"OMAPL138 BIOS PSP 用户指南"中、"1.6.1模块时钟门控"章节中、还有一条注意事项:仅使用 BIOS 电源管理 PWRM...

    您能不能找出这样做的原因是什么?

    在 UART 驱动程序的头文件中绕过此拒绝是否会在其他任何地方导致任何其他问题?

    我无法单步执行 PWRM 模块的函数、因为此源代码对我不可用。 是否有任何方法可以绕过对电源的 I2C 访问/由 PWRM 模块进行监控? 可能围绕 tcf 设置"BIOS.PWRM.RESOURCETRACKING "和/或"BIOS.PWRM.scaling"?

     

    感谢您的耐心等待、

    Uwe

     

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

    您好、Uwe、

    感谢您澄清使用案例。 此主题涉及相同的问题(它指的是 SPI 驱动程序、但 UART 的情况相同): e2e.ti.com/.../440189

    听起来驱动程序根本没有在该模式下进行验证、但其他驱动程序已在同一路径下运行、FWiw。 这可能是更好的选择、因为您的系统在禁用 PWRM 的情况下工作。

    此致、

    文森特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有一个建议的答案、由于此主题在一周内未激活、建议的答案被标记为验证。 请随意选择"拒绝回答"按钮、并回复更多详细信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Vincent:

    在不使用 BIOS_PWRM_ENABLE 标志的情况下构建的 UART 驱动程序代码现在正在我们的实验中运行、而不会出现任何有关电源管理的问题。  因此、我想我没有对该模式进行正式验证、我们可以关闭此主题。

    在 EDMA 模式下、接收器通道上的字符丢失问题仍然存在。

    如果接收到的字符少于缓冲区的大小允许的字符,并且连续字符的超时发生了,那么我还没有找到一种方法来获取在超时中止 GIO_Submit()/GIO_read()调用之前接收到的字符数信息。 如果 GIO_Submit ()/GIO_Read()调用返回 IOM_Completed、则函数会根据给定的限制接收到字符数。 在这种情况下、length-parameter 设置为给定的最大字符数、一切正常。 但是、如果 GIO_Submit ()/GIO_Read()调用返回 IOM_ETIMEOUT 或 IOM_ETIMEOUTUNDEC、LENGTH 参数始终由 DSP-BIOS 的 GIO_SUBMIT ()函数设置为0 -尽管收到的字符数小于允许的长度参数、但这些字符始终存储在缓冲区中。

    返回值 IOM_ETIMEOUTUNTEC 是由 DSP-BIOS 的 GIO_SUBMIT ()函数引起的。 在 GIO_SUBMIT ()函数对 GIO->SEMPEND()函数的调用超时的情况下,length-parameter 始终设置为0。 如果 GIO_SUBMIT ()函数使用命令 ID IOM _CHAN_timedout 调用迷你驱动程序的 mdControlChan 函数、 由于 UART 的迷你驱动程序不知道此命令 ID、因此迷你驱动程序 的 mdControlChan 函数返回 IOM_ENOTIMPL。 这将导致 DSP/BIOS 的 GIO_SUBMIT ()函数返回 IOM_ETIMEOUTUNCES... 这不是很好、但我可以处理这种行为。 另一件事是 DMA 和 UART 保持活动状态、并且不会执行任何操作来停止 IO。 我的应用层的变通方法是使用命令 ID UART_IOCTL_CANCEL_CURRENT 调用 GIO_CONTINENT()。

    但是、无论如何、我的问题是、我必须处理所有接收到的字符-在超时的情况下也是如此。 由于单个字符接收的波特率为230400、因此 CPU 负载将增加。 因此、我更喜欢 DMA 模式或至少 UART 驱动程序的 FIFO 模式。 但是、如何获取信息、在发生超时之前接收到多少个字节?

    我刚刚尝试修改了 UART 驱动程序的源代码。 我已经将命令 ID IOM_CHAN_timedout 添加到驱动程序的函数 uartMdControlChan()中。 如果解析了此命令 ID、则如果发生缓冲区已满事件、则通过根据该命令运行序列来停止当前 IO。 在这里、我可以访问以前接收的字符数、但从小型驱动程序的角度来看、无法将此信息提供给 DSP_BIOS 的 GIO_SUBMIT ()函数或应用程序层。 当然、更好的方法是使 UART 驱动程序保持"原样"、并通过另一种方式将接收到的字符数获取给应用程序...

     

     此致、

    Uwe

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

    您好、Uwe、

    很高兴听到您收到了用于构建和解决 DEV_createDevice()的原始问题的 UART 代码。

    对于与丢失字符有关的其他问题、能否启动新主题? 这将加快决议的解决,并有助于其他人稍后提及决议。


    谢谢、

    文森特