当前位置:首页 > 公众号精选 > 嵌入式大杂烩
[导读]之前有个同事因为用串口查询方式发送数据,被我说了一顿,明明有DMA资源,竟然放着不用,对于鱼鹰这种性能强迫症来说,肯定无法忍受,所以当时就和他说,有时间你把它改一下。谁知道过了好几个月他才有时间弄这个,然后还是出了问题,没法子,只能找我解决了。现象是这样的,使用查询方式,一点问题...

之前有个同事因为用串口查询方式发送数据,被我说了一顿,明明有 DMA 资源,竟然放着不用,对于鱼鹰这种性能强迫症来说,肯定无法忍受,所以当时就和他说,有时间你把它改一下。


谁知道过了好几个月他才有时间弄这个,然后还是出了问题,没法子,只能找我解决了。



现象是这样的,使用查询方式,一点问题没有,从机可以正常接收数据,一旦换成 DMA,从机就无法正常解析数据了,从机缓存的数据也不正确。



因为当时我也一脸懵逼,也不知道他做了什么操作导致的,毕竟他调用的 DMA 发送函数都是鱼鹰很久以前写的,也是久经考验的代码,不可能出现问题才对。



所以在没有头绪的情况下,直接同时调试两颗单片机了。



对,你没有看错,就是使用两个调试器同时调试两个单片机。



很简单,就在下面的图中选择即可,估计有很多老司机都不知道这个吧。(不同工程)





这样一台电脑就可以同时调试主机和从机了。



当时首先查看了 DMA 外设和 UART 寄存器情况,发现并没有问题(毕竟如果这个错了,再怎么查应用代码也是没用的,排查问题要讲究先后顺序)。



又在线查了一会发现,如果我在 DMA 发送函数后打上断点,从机是可以正常解析的,这一点又让我疑惑了,所以为了防止从机代码可能有问题,直接让同事用一个串口模块接收数据。



串口助手显示,发送的字节数是正确的,但是只有帧头几个字节对的,其它字节全是错的。



一看到这里,鱼鹰大概就知道了,大概率是 DMA 发送缓冲区被篡改了,一查函数调用,瞬间就明白了是怎么回事,函数调用大概如下(细节没有展示):


void dma_send(DMA_Channel_TypeDef *DMAx, void *buff, uint8_t size)

{

DMAx->CNDTR = size;

DMAx->CMAR = buff;

}


void send_data()

{

uint8_t buff[8];

buff[0] = 1;

buff[1] = 2;

……

dma_send(dma1, buff, 8);

}竟然用局部数组变量作为 DMA 发送的缓冲区,鱼鹰也是醉了。


那么为什么查询方式下,这样的代码不会出错,DMA 方式就错了?



要解答这样的问题,基础必须扎实:


1、DMA 传输原理


2、局部变量存放位置与特性。



只要知道这两点,这个问题就很容易避免。


但事实上,很多人只会大概用,根本没有真正理解。



DMA  串口传输凭什么说效率高?是因为它让串口速率传输更快了吗?一个字节传输本来要 1 ms,用 DMA 只要 0.5 ms?估计很多人都是这么理解的吧。



事实上,DMA 并没有加快传输速率,只不过是把传输的任务转交给专业的而言《数据传输还用 CPU?不如交给 DMA 吧!》,而 CPU 就可以专心干剩下的事情。



注意这里的转交一词,CPU 把必要的传输信息(比如传输地址、大小等)告诉 DMA 后,一般会启动 DMA,之后立刻运行后面的代码,但此时 DMA 缓存地址里面的数据并没全部发送出去,如果这个缓存用的是局部变量,离开这个函数后,局部变量被回收,并会继续给其他函数使用,此时这个缓存的数据就被篡改了,这样 DMA 发送出去的数据当然不正确。



所以,从这个角度来说,DMA 并没有加快串口本身的传输速度,只是解放了 CPU 资源而已。但是 CPU 被解放了, DMA 所使用的 缓存 资源可不能也随之解放呀,只能等发送完毕后才能释放。所以最简单的方法是在 缓存 前面加一个 static 。



那么为什么查询不会出问题呢?查询是把所有缓存中的数据发送出去后,才会离开当前函数,这样局部变量始终存在,也就不会有问题了,不像 DMA 一样扔到缓存里面就溜之大吉,局部变量也随之溜了。



但是,还有一种特殊的局部变量,也能达到全局的效果。这就是操作系统中的主函数的局部变量。


void task()

{

uint32_t buff[32]; // 局部变量,但效果和全局变量差不多。

while(1)

{

}

}因为任务一般会被死循环包含,永不退出(前提条件),所以这里的局部变量也就不会被释放掉,所以有些情况下,为了更好的使用资源,会采用这种方式。


好了,今天的分享到此结束,有收获的话,记得三连支持一波呦!



往期推荐:


解析内核的Makefile、Kconfig和.config之间的关联!


极客感十足的电子胸牌 ART-Badge V2.0开发记录!




本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭