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/TM4C1294NCPDT:SPI DMA 中的信号量导致溢出错误

Guru**** 2445440 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/626070/rtos-tm4c1294ncpdt-semaphore-in-spi-dma-causing-overflow-error

器件型号:TM4C1294NCPDT

工具/软件:TI-RTOS

您好!

代码:

空任务()

DmaInit()

while (1){

Semaphore_pend ();

void DmaInit(){

SPIRX();//in 乒乓模式

SPITX();//in 乒乓模式

SPIDMAInterrupt ();//DMA TX 和 Rx 中断;

IniHandler(){

针对 TX 和 Rx 的//ping pong 重新配置

count++;

Semaphore_post ();

int main()

Task_init();

返回0;

以上是配置为从器件的代码和器件的概述。

我遇到的问题是、我无法在 SPI DMA 处理程序中发布信标。

每个 乒乓缓冲器大小为64字节。 如果我发送最小到128字节的数据、信标发布工作正常。

如果我发送的字节超过128字节(添加 ping 和 pong) 、我将收到以下错误。

断言失败:A_overflow:计数已超过65535并已回滚。

xdc.runtime.Error.raise:终止执行

该错误表示信标发布保持在发布状态、但如果我禁用信标发布并检查计数值在每次启动传输时提供2倍的次数、则会显示该消息。

这意味着在没有信标发布的情况下、接收和发送 N 个数据。

问题:

1.为什么在发布信标发布后触发上述错误?

启用信标发布后、计数值也会递增 N 次。 但如果没有信标、它将以2的倍数增加。

这意味着工作正常。

3.您能不能就 如何处理乒乓缓冲器中的 DMA 接收到的数据提供任何建议。

我已附上 reference.e2e.ti.com/.../spi_5F00_dma.c 的代码

下面是使用64字节乒乓缓冲器接收256字节数据、并在 ISR 函数中禁用 Semaphore_post 的快照。 计数在运行时的表达式中捕获。

下面是在 ISR 中以相同代码启用 samephore_post 的快照

此致、

Manohar

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

    是否有理由不想在 TI-RTOS 中使用 SPI 驱动程序? 您可以查看 SPI 环回示例以了解其工作原理。

    您创建了什么类型的信标...计数或二进制?

    您使用的是 TI-RTOS 的哪个版本?

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

    您好、Manohar、

     我看不到您的图像。

     首先,我看不到您通过调用 main()中的 BIOS_start()来启动 RTOS。 它是 Task_init()的一部分吗? Task_init()包含什么?

     我认为错误消息表示您的应用程序多次调用 semaphore_post()而没有调用 semaphore_pend()。  这会导致信标计数增加、直至其溢出。  由于 Semaphore_post 是在 ISR 中完成的、ISR 的优先级高于 RTOS 任务能够挂起的优先级、这可能意味着在任务能够执行之前会发生多个 DMA_TX 或 DMA_RX 中断。

     您能否检查 ui32IntStatus = SSIIntStatus (SSI0_BASE、false)并查看是否真正发生了先前的中断标志位清除? 我阅读数据表中的以下段落。 也就是说、在清除中断标志前先禁用 TXDMAE。

    如果 μ μDMA 使能、并且已经完成了来自 Tx FIFO 的数据传输、DMATXRIS 位为

    在 SSIRIS 寄存器中置位、不能通过将 SSI 中断的 DMATXIC 位置位来清零

    清除(SSIICR)寄存器。 在 DMA 完成中断服务例程中、软件必须禁用

    将 QSSI DMA 控制寄存器的 TXDMAE 位清零、即可使能 μ μDMA 发送给 SSI

    (SSIDMACTL)寄存器、然后将 SSIICR 寄存器中的 DMATXIC 位置位。 这将清除

    DMA 完成中断。 当需要 μ μDMA 传输更多数据时、TXDMAE 位必须

    再次设置(启用)。

     如果可能、我还建议您从更简单的 DMA 配置开始、例如非乒乓模式。 您能使其处理256字节的数据传输吗?

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

    我已经尝试发送和接收256字节及以上的数据、它工作正常。

    我已经看到原始中断状态的状态、
    ui32IntStatus = SSIIntStatus (SSI0_BASE,false);

    这样可在启用 QSSI DMA 控制寄存器中的 TXDMAE 位后、DMATXRIS 位最初被置位。
    该 DMATXRIS 位可以在 ISR 中清零。

    我的问题:
    我正在将器件配置为从模式。 在 ISR 中清零 DMATXRIS 位后、该位在特定的时间间隔内保持启用状态、ISR 再次清零该位。
    这表明 DMA Tx 缓冲器在主器件未初始化传输的情况下完成。 为什么会发生这种情况?
    在主器件未初始化传输的情况下、为什么触发 DMA Tx 完成中断? 为什么 SPI 缓冲器和 DMA 缓冲器之间没有握手?

    2.由于我使用的是乒乓模式、所以在 ISR 中禁用通道不会产生任何问题? 因为数据将连续接收。



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

    添加了信息:
    DMARXRIS 位根本不禁用、该标志会在发出中断时一直保持。 即使我通过设置1清除该位也是如此。


    这就是信标帖子不断发布的原因。


    BIOS_start 函数将在 int main()中调用,在 main 函数中创建任务。 在 while 循环之前的任务函数内、DMA 按照我在开始时附加的文档中进行初始化。



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

    e2e.ti.com/.../361916

    以上是我遇到的问题、无法清除 DMATXRIS 和 DMARXIS 中断位。




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

    我想您已经尝试先禁用 DMA、然后根据数据表清除 DMATX 标志、对吧? 它是否产生了影响?

    遗憾的是、正如您在链接中指出的那样、其他用户似乎发现/报告了此问题。 如果可能、您是否可以取消乒乓模式、因为它似乎只有乒乓模式存在此问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    是的、我在禁用 DMA 使能位后尝试清除 DMATX 标志。 但是、尽管我无法清除中断标志。

    下面是我在 SPI 为主器件的基本模式下处理 DMA 的代码、

    (三
    空 ISRfunction()

    uint32_t ui32Status;

    ui32Status = SSIIntStatus (SSI1_base、1);

    SSIIntClear (SSI1_base、ui32Status);

    SSIIntClear (SSI1_BASE、SSI_DMATX);

    ui32Counter++;




    空 DmaDacInit (空)

    uint16_t ui8Idx = 0;

    //
    //用简单的数据模式填充 TX 缓冲区。
    //
    对于(ui8Idx = 0;ui8Idx < SSI1_TXBUF_SIZE;ui8Idx++)

    DMASSI1TxBuffer[ui8Idx]= ui8Idx + 1;



    SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);
    SysCtlPeripheralSlepEnable (SYSCTL_Periph_UDMA);

    //
    //启用 UDMA 控制器。
    //
    uDMAEnable();

    //
    //指向控制表以用于通道控制结构体。
    //
    uDMAControlBaseSet (pui8ControlTableArr);

    /* SSI 0配置*/
    SysCtlPeripheralEnable (SYSCTL_Periph_SSI1);
    SysCtlPeripheralSlepEnable (SYSCTL_Periph_SSI1);


    SSIConfigSetExpClk (SSI1_base、120000000 // SysCtlClockGet ()*/、SSI_FRF_MOTO_MODE_0、
    SSI_MODE_MASTER、4000000、8);

    //
    //配置 SSI 通信参数。
    //

    SSIClockSourceSet (SSI1_base、SSI_Cock_PIOSC);

    //
    //使能 SSI 的操作,并使能两个 TX 的 uDMA 接口
    //和 RX 通道。
    //
    SSIEnable (SSI1_base);

    SSIDMAEnable (SSI1_BASE、SSI_DMA_TX);


    uDMAChannelAttributeDisable (UDMA_CHANGE_SSI1TX、UDMA_ATTR_USEBURST | UDMA_ATTR_REQMASK);

    uDMAChannelAttributeEnable (UDMA_CHANGE_SSI1TX、UDMA_ATTR_HIGH_PRIORITY);

    uDMAChannelControlSet (UDMA_CHANGE_SSI1TX | UDMA_PRI_SELECT、
    UDMA_SIZE_8 | UDMA_SRC_INC_8 |
    UDMA_DST_INC_NONE |
    UDMA_ARB_4);

    uDMAChannelTransferSet (UDMA_CHANGE_SSI1TX | UDMA_PRI_SELECT、
    UDMA_MODE_BASIC、DMASSI1TxBuffer、
    (void *)(SSI1_base + SSI_O_DR)、
    sizeof (DMASSI1TxBuffer));


    uDMAChannelEnable (UDMA_CHANGE_SSI1TX);

    //
    //启用 SSI DMA TX 中断。
    //
    IntEnable (INT_SSI1);

    SSIIntEnable (SSI1_BASE、SSI_DMATX);



    void task_tx()


    DmaDacInit();
    while (1)





    int main()

    Task_Params_init (&taskParams);
    taskParams.arg0 = 1000;
    taskParams.STACKSIZE = TASKSTACKSIZE;
    taskParams.stack =_task0Stack;
    Task_construct(&task0Struct,(Task_Functr) task_tx,&taskParams,NULL);

    /*启动 BIOS */
    BIOS_start();



    (三

    我仍面临相同的问题、即清除 DMATX 中断清除标志。 您可以处理上述代码吗? 让我再配置我丢失了吗?

    调用以下函数后、中的 ISR 会调用 Next。
    SSIIntEnable (SSI1_BASE、SSI_DMATX);

    即使我在不启用 DMAEnable 位设置的情况下调用上述函数也是如此。 调用 ISR。
    为什么?


    此致、
    Manohar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Manohar、
    您可以上传包含上述代码的文件吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../DMA_5F00_CODE.zip

    您好!

    我使用具有以下引脚配置的 SPI 0、

     /*SSI0 */
       SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);

       GPIOPinConfigure (GPIO_PA2_SSI0CLK);
       GPIOPinConfigure (GPIO_PA3_SSI0FSS);
       GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);
       GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);

       GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 |
                                       GPIO_PIN_3 | GPIO_PIN_2);

    请帮我解决我面临的问题、我随附了代码。

    此致、

    Manohar

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

    如果您使用的是 TI-RTOS、则如果您在 ISR 中进行内核调用、则无法使用 SSIIntRegister。 您应该使用 Hwi_create (或者 Hwi_con构)。 您可以查看 TI-RTOS 中的 SPI 驱动程序(即 tirtos_tivac_2_16_01_14\products\tidrivers_tivac_2_16_01_13\packages/ti\drivers\spi\SPitivadma.c)以了解这是如何完成的。

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

    谢谢您...

    我在 GUI 中创建了 ISR 函数、在实际集成代码中、SSI0的中断矢量编号为23。 上面的代码只是一个演示代码。

    在 ISR 初始化后调用 ISR 不会遇到问题、问题是我无法清除中断标志寄存器 DMATX 位。
    完成后执行该操作。
    (三

    您好、Charles、
    为了供您参考,我使用的是 CCS 版本6,因此您可以对上述演示代码使用相同的版本。



    此致、
    Manohar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Manohar、
    很抱歉、我还没有机会运行代码。 我稍后会尝试。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    我已经完整地浏览了数据表、也访问了 TI 论坛、没有为这个问题提供解决方案。

    请尽快完成。


    此致、
    Manohar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Manohar、
    我将于今天上午不在办公室。 我将在今天下午试一下。 从论坛搜索中可以看到、目前似乎没有明确定义的解决方案。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您对 Charles 的支持。



    此致、
    Manohar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Manohar、
    我运行了您的代码、并可能在调用 SSIIntClear (SSI0_BASE、ui32Status)后 DMATX 位未被清除的地方重现此代码。 但我不知道我是否只是遇到了您提到的其他帖子中报告的已知问题。 我需要进一步调查。 同时、如果您可以更多地使用它来解决问题、这将是很好的。 此外、为了简化调试、我建议您是否可以在没有 RTOS 的情况下重试此示例、以便我们可以确定问题是否与使用信标有关。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    我已经删除了 SSIMI 寄存器中的 DMA TX 位、现在使用的是 TXOT 位。 如果数据从串行器发出、并且我之前连接的代码现在工作正常、则会触发此中断。

    现在、我已经在从模式中为 TX 和 RX 实施了乒乓模式。 我只使用 DMARX 位来重新配置中断。

    TX 缓冲区大小- 1024B

    RX 缓冲区大小- 64B

    我已附上代码供您参考。

    其他信息:

    我使用了信标发布、它提供了我说过的上述错误、因此我使用的是事件。

    问题:

    添加的代码中的事件仅发布2次、即使我发送 N 个数据也是如此。

    实际 Rx 缓冲区大小64B、pingpong Rx 缓冲区大小为128B、如果我发送128B 数据、代码运行正常。

    如果发送的数据超过128B、则 RX 通道将被禁用。 在 DMA 启用设置位中可以看到的。

    因此、我再次在 ISR 中重新启用通道。

    5、还有一个问题、即使我将 N 个字节的数据从主器件发送到从器件(控制器)、事件也只发布2次。 这是通过在任务中使用计数器来确保的。

    e2e.ti.com/.../3034.DMA_5F00_CODE.zip

    是否可以构建上述代码并进行检查? 为什么事件只发布2次?

    此致、

    Manohar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Manohar、
    很高兴您取得了良好的进展。 我家里没有用于运行代码的工作台设置。 此外、我不是 RTOS 上下文方面的专家。 您能否首先确认是否在非 RTOS 环境中配置了乒乓 DMA 设置、它是否起作用?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    我正在使用默认代码处理 UART DMA、TI 在裸机代码中开发了 UART DMA、这需要较旧版本的 CCS。
    目前我使用的是版本6、因此我需要较旧的版本来测试代码。

    在我处理它之后、我会让您来处理。


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

    我已经处理了 TI 提供的 uDMA 演示代码、同一个 DMA TX 位不会在 UART DMA 示例代码中清零。
    相反、它们是从 UART 到控制器的中断。

    代码通过内部回送执行 UART 数据传输、我可以看到在 ROV 中从计数器变量生成的中断计数的数量。

    我已经监视了 DMA TX 中断位、当调用清零函数时、该中断位不会被清零。 仅通过禁用 UART 中断禁用它。

    出于我的目的、我无法禁用中断、因为我将 SSI 配置为从机模式。 传输将由外部主器件启动。 因此、一旦我为另一个传输重新启用 DMA TX 中断、控制器就会将中断视为生成并调用 ISR 函数、即使传输未完成也是如此。



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

    e2e.ti.com/.../5383.DMA_5F00_CODE.zipHiCharles、

    我在代码中发现了问题、但无法找到这种原因在代码中引发问题的原因。

    用于处理接收到的数据的事件或信标、导致清除中断位时出现问题。

    如果我用任务内的任务睡眠替换事件挂起、我可以打印相应等于缓冲区大小的中断触发次数。 这意味着它工作正常。

    我已经附加了参考代码、您能否通过启用任务中的事件挂起并注释掉任务睡眠来尝试代码。

    您能不能建议采用其他方法来处理 DMA RX 缓冲区中接收到的数据? RX 缓冲区大小为64B。

    我在代码中所做的是、在 DMA RX 缓冲区中每接收到64B 数据后、我将在 ISR 中发布一个事件、并且可以在任务中处理数据。

    但这种技术不起作用。 我不确定事件发布和挂起会始终导致问题。 为什么此事件函数不允许清除中断位?

    是否会导致任何问题? 如果我在完成任务中的事件挂起操作之前在 ISR 中持续发布事件?

    此致、

    Manohar

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

    您好、Charles、

    请尝试以下代码、我已禁用任务中的事件挂起、并将任务睡眠用于 ISR 函数中的计数器值。

    我已通过发送1024B 的数据验证了代码。 打印的计数器值为17。

    RX 缓冲区大小- 64B - 16中断

    TX 缓冲区大小- 1024B - 1个中断

    总共打印17个中断计数。

    如果我在任务内启用事件挂起、则中断位不会被清除。

    您能否建议我采用其他方法来处理在 DMA Rx 缓冲器中接收到的数据?

    此致、

    Manohar

    e2e.ti.com/.../5857.DMA_5F00_CODE.zip

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

    奇怪的是、您是否尝试通过发出清除调用两次来双清零中断位、甚至尝试取消挂起卡住的位?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Manohar、
    运行代码的硬件设置是什么? 我尝试按原样运行代码,但它只是每1ms 打印一次“任务中的计数器增量:0”。 原因是我的 case 中甚至没有输入 InitSSI0Transfer。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    是的、我一直尝试通过清除该位来清除该位、尤其是通过清除该位以及读取整个屏蔽中断状态来清除该位。
    没有技术清除中断位。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    因为 SPI DMA 配置为从模式。 您必须使用外部主器件 SPI 来启动传输。
    出于我的目的、我使用 Aardvark 分析仪作为分析仪的主设备、我们可以传输所需的数据量。


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

    请为我提供一些方法来处理从 SPI 缓冲器接收到的数据到 DMA 缓冲器。
    每个乒乓模式的接收数据缓冲区大小为64B。

    以前、我处理数据的方法是:
    对于每个 DMARX 缓冲器中断、都会布置事件或信号量、并执行任务来处理数据。

    上述方法无法正常工作、因为使用事件或信标会导致一些中断清除问题。 我无法接收最大128B 的数据。 如果我尝试接收到更多的128B 数据、则不能清除中断位、并且会触发"保持"ISR 函数。

    问题:
    1.建议在每个 DMA RX 缓冲区被填满后处理数据的方法。



    此致、
    Manohar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Manohar、
    我创建了一个外部 SPI 主器件来发送1024字节的从 MCU 数据。 我可以看到、通过使用 EVENT_POST 和 EVENT_PEND、SSI0IntHandler 将被重复调用。 DMARX 保持置位。 如果没有 EVENT_POST 和 EVENT_PEND,我会看到任务中的计数器增量:17正在输出。 但是、我不知道 EVENT_POST 与 DMARX 位有什么关系的原因和方式。 需要进行更多调查。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Manohar、
    我花了一些时间进行调试并进行了不同的实验。 我发现,通过注释掉您的任务中的 system_printf()和 system_flush(),可以使其正常工作。 请尝试一下。 这与在 ISR 中使用 EVENT_POST()和在任务中使用 EVENT_PEND ()有关。 可能发生的情况是,system_printf()在 EVENT_POST 的下一个信号传入之前可能需要太多时间才能打印到控制台。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    system_printf 数据存储在内部缓冲区中(我假设您使用 SysMin 作为基础系统提供商)。 System_flush 将把这个数据写入 CIO 缓冲器。 当 CIO 缓冲器已满或数据中有'\n'时、目标会暂停、以便 CCS 可以读取数据。 这会使实时信息混乱。 printf 也会发生同样的情况(默认情况下)。 您可以删除 System_flush、然后使用 Tools->ROV->SysMin 查看 System_printf 输出。

    当然、如果您有很多 System_printf 调用、这也会降低速度、因为 ASCII 管理速度众所周知很慢、但与停止目标完全不同。

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

    您好、Manohar、

    [引用 USER="Manohar B"]对于每个 DMARX 缓冲区中断,都会发布事件或信号量,并执行任务来处理数据

    好奇您是否已将内核 GPTM Clock_tick 配置为处理 信标、 假设它使用 ARM M3 IRQ 模块配置。

     [引用用户="Manohar B"]上述方法不能正常工作,因为使用事件或信号量会导致一些中断清除问题[/引用]

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

    现在、我面临不同的问题。 我无法在同一代码中合并 EMAC 和 DMA 调用。 因为它们都使用120MHz 的系统时钟。 DMA 仅在 EMAC 被禁用时工作。 我想知道原因吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Manohar、

    您能否在新问题上启动新主题? 缩短线程有助于搜索。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Manohar、
    很高兴您的问题得到解决。 关于 EMAC/DMA、您的同事今天已经打开了一个新的主题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!


    非常感谢您帮助我解决上一个问题:)



    此致、
    Manohar