|

楼主 |
发表于 2025-9-6 11:25:06
|
显示全部楼层
貌似初步找到问题点了,如下:
static OS_SEM TxPktSemaphore; /* 用于同步以太网发送数据信号 */
/* 创建多值信号量 TxPktSemaphore */
OSSemCreate((OS_SEM *)&TxPktSemaphore, //指向信号量变量的指针
(CPU_CHAR *)"TxPktSemaphore", //信号量的名字
(OS_SEM_CTR )1, //表示现有资源数目
(OS_ERR *)&err); //错误类型
void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *heth) 这个函数发送完成后都会触发
{
CPU_INT08U os_err;
(void)OSSemPost((OS_SEM *)&TxPktSemaphore,
(OS_OPT )OS_OPT_POST_ALL, //OS_OPT_POST_1,
(OS_ERR *)&os_err);
}
static err_t low_level_output(struct netif *netif, struct pbuf *p)
{
// ETH_INPUT_MODE == ETH_INPUT_TASK 在工作时会出现卡顿, ping, 或 开发板与 上位机链接 都会出现卡顿的情况
(void)netif;
uint32_t i = 0U;
struct pbuf *q = NULL;
err_t errval = ERR_OK;
ETH_BufferTypeDef Txbuffer[ETH_TX_DESC_CNT] = {0};
memset(Txbuffer, 0 , ETH_TX_DESC_CNT*sizeof(ETH_BufferTypeDef));
for(q = p; q != NULL; q = q->next)
{
if(i >= ETH_TX_DESC_CNT)
return ERR_IF;
Txbuffer.buffer = q->payload;
Txbuffer.len = q->len;
if(i>0)
{
Txbuffer[i-1].next = &Txbuffer;
}
if(q->next == NULL)
{
Txbuffer.next = NULL;
}
i++;
}
TxConfig.Length = p->tot_len;
TxConfig.TxBuffer = Txbuffer;
TxConfig.pData = p;
pbuf_ref(p);
do
{
if(HAL_ETH_Transmit_IT(&EthHandle, &TxConfig) == HAL_OK)
{
errval = ERR_OK;
}
else
{
if(HAL_ETH_GetError(&EthHandle) & HAL_ETH_ERROR_BUSY)
{
// /* Wait for descriptors to become available */
// 出现卡顿, 问题就出在 OSSemPend 这个函数上, 如果把 OSSemPend 这个函数屏蔽掉后 发送 响应速度贼快, ping 也贼快, 这个地方 要怎么写才能够正常不卡的呀 ?
// 赶脚是 OSSemPend 这个函数等待的 TxPktSemaphore 信号量超时退出而不是正常等到的情况 ??
CPU_INT08U os_err;
OSSemPend((OS_SEM *)&TxPktSemaphore,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_NON_BLOCKING, // OS_OPT_PEND_NON_BLOCKING OS_OPT_PEND_BLOCKING
(CPU_TS *)0,
(OS_ERR *)&os_err);
HAL_ETH_ReleaseTxPacket(&EthHandle);
errval = ERR_BUF;
}
else
{
/* Other error */
pbuf_free(p);
errval = ERR_IF;
}
}
}while(errval == ERR_BUF);
return errval;
}
|
|