DMA_LCM/TFT 疑问上报 | 强制4字节对齐
问题描述:DMA_LCM/TFT 疑问上报型号:AI8051U使用DMA_LCM外设, 8位数据,I8080模式。
如何发现的问题: 最先一切工作正常,后来添加了一个全局变量后,显示数据变乱了,代码如下:
代码说明: Hub_Buffer[] 是DMA发送数据池,变量ABCDD是一个无用的变量,只有定义没有使用
当删除当 第42行: u8 xdata ABCDD;程序运行正常
添加42行,屏就乱码。
因为代码正在起步除段,代码量不大,反复查找了代码中可能存在的BUG,或指针乱飞等,都没找到问题。
其中尝试了降低C编译优化等级,无用。
仔细分析了一下,定义一个无用变量就可以改变结果,会不会和数据池定位有关系?
打开编译后的MAP分析, 发现:
Hub_Buffer 定位在: 0001000DH SYMBOL XDATA --- Hub_Buffer
注销42行后:
Hub_Buffer 定位在: 0001000CH SYMBOL XDATA --- Hub_Buffer
然后就想到了DMA会不会要4字节对齐?
于是又改了代码:
static u8 xdata Hub_Buffer _at_ 0x000C; //使用绝对定位
或:
static u8 xdata Hub_Buffer __attribute__((aligned (4))); //强制4字节对齐
最后发现这两种方法都可以正常运行。
那问题来了,DMA_LCM的数据池真有有必要4字节对齐吗。 如果是,那说手册上就要说明一下。
另外我试了UART_DMA的数据池并不需要4字节对齐也能正常运行.
因为代码为用LCM_DMA 驱动的屏为非常用型号,发上来大家也没办法实测,所以就不发代码了
要正确设置发送地址
一般使用DMA时,要用 _at_ 手动指定地址
如:unsigned char xdata ***[***] _at_ 0x****
全局变量不需要加static
DebugLab 发表于 2025-3-17 11:01
要正确设置发送地址
一般使用DMA时,要用 _at_ 手动指定地址
加static 就仅限本文可直接访问,和这个没有关系。
另外 加_at_ 没有作用,
比如:
第54行,55行,运行结果正确,
56行加了_at_ 仍然不行,现在重点不是加不加 _at_ ,
重点是是否需要4字节对齐! 我尝试了多次了, 不如有空时你随变找个屏试一下看看?
tzz1983 发表于 2025-3-17 11:21
加static 就仅限本文可直接访问,和这个没有关系。
另外 加_at_ 没有作用,
比如:
不行就可能需要字节对齐,先试试双字节对齐,再不行就四字节对齐 我很有感觉,这个黑天鹅大概率是和片内硬件设有关系的,只是不巧被我遇到了 DebugLab 发表于 2025-3-17 11:25
不行就可能需要字节对齐,先试试双字节对齐,再不行就四字节对齐
双字节没用,四字节有用,所以我就是提醒这个问题,是不是要验证+公布,其实我自己已解决 tzz1983 发表于 2025-3-17 11:27
双字节没用,四字节有用,所以我就是提醒这个问题,是不是要验证+公布,其实我自己已解决 ...
之前写程序指定的DMA首地址一般都是4字节对齐的,没发现过这个问题,这个稍后向内部反馈一下
感觉这些新功能在数据手册中介绍的不是很详细,我也很想知道这些细节问题
比如I2S相关的细节问题就有很多不太清楚的:
https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=16304&pid=152898
tzz1983 发表于 2025-3-17 11:27
双字节没用,四字节有用,所以我就是提醒这个问题,是不是要验证+公布,其实我自己已解决 ...
内部人员回复:
LCM的DMA好像需要进行对齐,其它DMA缓冲区我记得没有字节对齐问题。 DebugLab 发表于 2025-3-17 12:17
内部人员回复:
LCM的DMA好像需要进行对齐,其它DMA缓冲区我记得没有字节对齐问题。 ...
好的,感谢解答!
对于代码起步阶段,这个很重要,
幸好我一开始的时候是正常的,
要不误以为是哪个基础寄存器没设置对,
那就会花很多无用功去查找问题了,
甚至一开始就不成功,会直接造成挫败感
页:
[1]
2