STM32 UART的DMA模式,为何跟malloc函数相关

2019-12-12 18:20发布

各位好,感谢关注,直入主题:
产品有2个功能:
1,网络模块,接收指令和系统设置;其中有个parse_date_time函数,作用是把系统设置的时间,写入RTC中;
解析时,使用了两种方式将时间的字串保存;
void parse_date_time(char *str)
{
方式1:
        char point[100]={0};
        memcpy(point,str,datasize);
        /**************
        解析日期和时间
        **************/
方式2:
        char *point=NULL;
        point=malloc(100);
        memcpy(point,str,datasize);

        /**************
        解析日期和时间
        **************/
        free(point);
        point = NULL;
}

2,串口模块,使用DMA进行与另一板子的通信;

3,使用1中的方式2(malloc),串口DMA收发正常;
     使用1中的方式1(数组),串口DMA收发失败;

4,觉得可能是parse_date_time函数作妖,暂时将该函数屏蔽掉(整份代码中,没有malloc);串口DMA收发失败;
5,在其他不相干的函数,尝试先malloc,接着就free,不做任何操作,串口DMA收发正常;

表面现象:
        串口的DMA收发,一定要有malloc;

猜测:
        如果没有malloc,是否串口的DMA收发的内存空间,在编译的时候,就没有被分配?编译的时候优化掉了dma的内存空间?(哪怕优化级别为-O0)

很是困惑,希望得到大家的指点,谢谢。
   
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
41条回答
bg6agf
1楼-- · 2019-12-14 06:12
这个我觉得和你发出来的地方毫无关系…而与内存分配有关
cyzc2008
2楼-- · 2019-12-14 10:37
bg6agf 发表于 2019-3-10 00:20
这个我觉得和你发出来的地方毫无关系…而与内存分配有关

嗯,函数收发都是在全局结构体的数组上,静态分配的啊,想不通~
lingdianhao
3楼-- · 2019-12-14 14:25
cyzc2008 发表于 2019-3-10 00:34
嗯,函数收发都是在全局结构体的数组上,静态分配的啊,想不通~

虽然是静态分配的,但是你代码有任何改动,可能编译器分配的静态地址都不一样。在407里面,1开头的内存地址是不支持DMA的,可能你没加内存分配函数时编译器分配的DMA地址在1开头的地方,你看一下两种情况分配的DMA地址吧。
cyzc2008
4楼-- · 2019-12-14 15:34
 精彩回答 2  元偷偷看……
xjmlfm1
5楼-- · 2019-12-14 15:56
lingdianhao 发表于 2019-3-10 00:56
虽然是静态分配的,但是你代码有任何改动,可能编译器分配的静态地址都不一样。在407里面,1开头的内存地 ...

1开头的内存好像是DCM内存吧,那个不用特殊的操作,变量都定义不到那里。
lingdianhao
6楼-- · 2019-12-14 19:29
会的,编译器只会认为是另外一块内存。我之前跑以太网就是,有一句代码加了以太网可以跑,没加就不能跑,但是这一句代码和以太网没有任何关联。开始始终没想通,后面才发现多了那一句编译器给以太网DMA分配的内存地址在2xxxxxx区域,不加就给整到CCM去了,后面就手动指定地址就好了。

一周热门 更多>