硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1100|回复: 4
收起左侧

[以太网] 请教:H743+freertos+lwip,netconn_write函数连续发送偶尔出现乱码

[复制链接]

3

主题

14

回帖

23

积分

新手上路

积分
23
发表于 2022-3-12 22:40:05 | 显示全部楼层 |阅读模式
环境:
H743+freertos+lwip,单片机作为客户端,使用netconn编程接口

现象:
连续调用netconn_write函数,上位机偶尔收到乱码

已做的排查:
1、netconn_write函数的apiflags使用的是NETCONN_COPY
2、netconn_write只在主线程调用,并且也上了锁
3、调用netconn_write之后立即串口打印数据,上位机收到乱码的同时,串口打印的数据是正确的
4、在调用netconn_write之后加50ms延时,就再也不输出乱码了,改为1ms延时,依旧乱码
5、传给netconn_write的数据是动态申请的,在netconn_write函数之后立即释放,按理说这样不会有问题,因为使用的是NETCONN_COPY
        write_tcp_msg((UINT8*)str, strlen(str)); //传入的是动态分配的内存
        DEBUG_OUT("data = %s\r\n", str); //串口打印,这里始终正确
        osDelay(50);
        external_free(str); //释放动态内存str


这可能是什么导致的,有没有什么分析思路?谢谢!
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2022-3-12 23:35:10 | 显示全部楼层
单独做网络收发数据测试,有如下规律
1、如果单片机只是发上报消息,上位机不需要响应,连续发,不会出错
2、如果单片机发的是请求消息,上位机收到后立即响应,单片机连续发,上位机收到的数据就会乱码
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2022-3-13 00:17:54 | 显示全部楼层
kevin_yf 发表于 2022-3-12 23:35
单独做网络收发数据测试,有如下规律
1、如果单片机只是发上报消息,上位机不需要响应,连续发,不会出错
...

又做了如下测试,怀疑是rtx_memory.c在多线程环境下加锁也会有内存冲突问题,这个文件是从硬汉兄的V7开发资料拷过来的。请硬汉兄能否帮忙分析一下,是不是我使用上有什么问题。谢谢

测试方法:
创建两个线程,每个线程都向上位机上报数据,上位机不响应。对内存操作都有加锁。发现还是上报有乱码。


//json内存池:tcp_json_buf
//从内存池获取内存
void* external_malloc(size_t size)
{
        void *mem = NULL;
        json_lock();
        mem = osRtxMemoryAlloc(external_buf, size, 0);
        json_unlock();
       
        return mem;
}

//释放内存归还给内存池
void external_free(void *ptr)
{
        json_lock();
        osRtxMemoryFree(external_buf, ptr);
        json_unlock();
}

void json_lock(void)
{
        xSemaphoreTake(rtos_res.json_mutex, portMAX_DELAY);
}

void json_unlock(void)
{
        xSemaphoreGive(rtos_res.json_mutex);
}

void create_rtos_res(void)
{
        memset(&rtos_res, 0, sizeof(RTOS_RES));
        rtos_res.json_mutex = xSemaphoreCreateMutex();
        rtos_res.socket_mutex = xSemaphoreCreateMutex();
        DEBUG_OUT("rtos_res.json_mutex = %p\r\n", rtos_res.json_mutex);
        DEBUG_OUT("rtos_res.socket_mutex = %p\r\n", rtos_res.socket_mutex);
}

使用方法
UINT8 *data1 = external_malloc(200);
external_free(data1);

回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2022-3-13 11:43:27 | 显示全部楼层
kevin_yf 发表于 2022-3-13 00:17
又做了如下测试,怀疑是rtx_memory.c在多线程环境下加锁也会有内存冲突问题,这个文件是从硬汉兄的V7开发 ...

应该是找到问题了,还是SDRAM的MPU配置问题

现在是这么配置了。normal模式,写直通,支持非字节对齐
        MPU_InitStruct.Enable = MPU_REGION_ENABLE;
        MPU_InitStruct.Number = MPU_REGION_NUMBER5;
        MPU_InitStruct.BaseAddress = 0xD0000000;
        MPU_InitStruct.Size = MPU_REGION_SIZE_32MB;
        MPU_InitStruct.SubRegionDisable = 0x00;
        MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
        MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
        MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
        MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
        MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
        MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
        HAL_MPU_ConfigRegion(&MPU_InitStruct);

仔细研读了硬汉兄的H7非字节对齐访问总结贴
https://www.armbbs.cn/forum.php? ... 9400&fromuid=58

神贴,感谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107127
QQ
发表于 2022-3-13 12:41:46 | 显示全部楼层
kevin_yf 发表于 2022-3-13 11:43
应该是找到问题了,还是SDRAM的MPU配置问题

现在是这么配置了。normal模式,写直通,支持非字节对齐

这个问题很重要,也很容易忽视。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-19 11:10 , Processed in 0.185610 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表