Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
tianxiny816
Level 3
Level 3
25 replies posted 5 questions asked 10 sign-ins

tianxiny816_0-1705652896749.png

 

调试以太网接口时加FreeRTOS时,出现若是在HighTEC点击运行程序能够周期性的发出以太网报文,但下电再上电全速运行后以太网报文一直发不出来,停留在IfxGeth_Eth_waitTransmitBuffer函数中, 是什么原因导致出现这个情况?(建立任何操作系统的任务,只是单纯的移植到TC387的工程中)

0 Likes
12 Replies
Kunqiao_L
Moderator
Moderator
Moderator
First comment on blog First like given 25 likes received

你好,

请提供下你的示例程序,帮助我们分析,谢谢

0 Likes
Di_W
Moderator
Moderator
Moderator
1000 replies posted 250 solutions authored 100 likes received

这个函数的意思是发送缓冲为空,函数 IfxGeth_Eth_getTransmitBuffer 用于获取与特定 DMA 通道 (channelId) 关联的传输缓冲区。它检查传输描述符中的所有权位 (OWN),以确定缓冲区是否可用。 如果 OWN 位已设置(即 descr->TDES3.R.OWN == 1),则表示 DMA 引擎当前拥有描述符和缓冲区。在这种情况下,缓冲区对 CPU 不可用,直到 DMA 引擎释放拥有权。因为不了解你的系统,你可以尝试精简你的代码,先不使用FreeRTOS,仅使用Eth,然后逐步增加你需要的代码,确认是哪部分代码影响到了OWN位。

 

IFX_INLINE void *IfxGeth_Eth_waitTransmitBuffer(IfxGeth_Eth *geth, IfxGeth_TxDmaChannel channelId)
{
    void *tx;

    do
    {
        tx = IfxGeth_Eth_getTransmitBuffer(geth, channelId);
    } while (tx == NULL_PTR);

    return tx;
}

 

不使用FreeRTOS,TC387掉电重启是能够发出以太网报文的,我根据github上下载的TC397例程中的FreeRTOS移植到TC387的,同时我也有尝试将ADS中TC375的例程里的FreeRTOS移植到TC387中,效果都是一样的,即单步调试时能够发出以太网报文,一旦不是单步运行就不能发出以太网报文了。PHY芯片使用的是DP83TC811。 代码因公司电脑加密无法外发。

tianxiny816_0-1705911149411.png

tianxiny816_1-1705911494394.png

 

 

0 Likes
Di_W
Moderator
Moderator
Moderator
1000 replies posted 250 solutions authored 100 likes received

请问您有TC397的TRIBOARD吗?可以在这个上面测试一下,看是否是移植的问题。

0 Likes

我没有TC397的板子。目前监测是一直卡在这个OWN的地方。 如果是移植的问题,为什么用HighTEC的Start Pragram就能够发出报文,只要下电再上电就检测到OWN不为0。

tianxiny816_1-1705911816186.png

 

0 Likes
Di_W
Moderator
Moderator
Moderator
1000 replies posted 250 solutions authored 100 likes received

如果不使用ETH, FREERTOS冷复位可以正常工作吗?可以用LED的任务来验证。

0 Likes

这个可以呢, 只有使用ETH的时候才有问题

0 Likes
Di_W
Moderator
Moderator
Moderator
1000 replies posted 250 solutions authored 100 likes received

如果一个任务获取了传输缓冲区并且 OWN 位被设置,这可能意味着缓冲区当前由 DMA 引擎拥有,对于 CPU 不可用。可以试着把“初始化ETH,发送FRAME”都在一个TASK中,避免多个TASK互相干扰。

0 Likes

tianxiny816_0-1705997378265.png

我尝试将ETH的初始化当地任务当中后,程序直接报内存异常。我的程序还发现一个问题,裸机的情况下不使能看门狗的话也是不能发出报文

 

0 Likes
Di_W
Moderator
Moderator
Moderator
1000 replies posted 250 solutions authored 100 likes received

看门狗的问题可以看下这个DEMO:https://github.com/Infineon/AURIX_code_examples/blob/master/code_examples/Ethernet_1_KIT_TC397_TFT/C...

    IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());
    IfxScuWdt_disableSafetyWatchdog(IfxScuWdt_getSafetyWatchdogPassword());
0 Likes
lock attach
Attachments are accessible only for community members.

您好,

       我又做了以下测试,在程序中创建了FreeRTOS的任务,但是我不启动RTOS的任务调度功能,在主循环中专门跑发送ETH报文,调试时是能够发出ETH报文,掉电重启也是发不出去的,这个RTOS的是影响到了DMA的功能了么?我是通过附件的FreeRTOS移植到TC387的,在不使用ETH的情况下其他功能能够使用。ETH接口的配置是根据例程Ethernet_1_KIT_TC375_LK。

tianxiny816_0-1706006211369.png

tianxiny816_1-1706006361017.png

 

 

0 Likes
Di_W
Moderator
Moderator
Moderator
1000 replies posted 250 solutions authored 100 likes received

一般来说RTOS的调度、内存管理、中断优先级等方面与硬件的外设操作关系不大。你提到“不使用RTOS,ETH冷启动是正常的”,需要查一下RTOS影响到了哪一部分。最好能捕捉一下ETH冷启动之后的所有操作,输出为log查看。

0 Likes