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条回答
cyzc2008
1楼-- · 2019-12-15 14:54
通过align进行字节对齐,使得两种方式下,串口收发的数组的内存地址一样。但是还是只要没有malloc,依旧无法正常收发。
richards
2楼-- · 2019-12-15 20:17
 精彩回答 2  元偷偷看……
cyzc2008
3楼-- · 2019-12-15 23:02
richards 发表于 2019-3-11 15:11
栈空间出了作用域  内存回收了啊

谢谢高手,将栈空间增大,不使用malloc也可以正常收发了。请教一下,栈是从高到低,堆是从低到高,如果有溢出交叉了。那malloc的操作,为什么能影响到运行效果呢?因为malloc后我马上就释放了。如下:
#if 1
uint8_t *testpoit=malloc(7);
if(NULL!=testpoit)
{
  free(testpoit);
  testpoit = NULL;
}
#endif

谢谢。
huangqi412
4楼-- · 2019-12-16 01:34
cyzc2008 发表于 2019-3-9 20:26
parse_date_time的数组是局部的。

大容量局部变量。。。  这习惯用溜了不注意就爆了  用静态吧
dukelec
5楼-- · 2019-12-16 02:41
cyzc2008 发表于 2019-3-11 17:04
谢谢高手,将栈空间增大,不使用malloc也可以正常收发了。请教一下,栈是从高到低,堆是从低到高,如果有 ...

你是怎樣將 栈空间增大 的呢?
cyzc2008
6楼-- · 2019-12-16 06:31
huangqi412 发表于 2019-3-11 20:14
大容量局部变量。。。  这习惯用溜了不注意就爆了  用静态吧

嗯,谢谢提醒,我的问题不是在这个函数里定义了大容量的局部变量。串口DMA使用的是全局数组,可能是调用时会产生临时的,然后越界了?水平有限,待高手释疑~

一周热门 更多>