c++ - memcpy 命令在复制时交替数据
问题描述
我正在使用 STM32 G474 用它的内部 DAC 创建一个波形。我为直接内存访问 (DMA) 模块提供了一个查找表,它在正确的时间将值提供给相应的 DAC 通道。听起来困难的部分实际上非常简单,并且工作得很好。
#define NS 64 # number of samples
uint32_t Wave_Low[NS] = {2048,[...],2047}; # lookup table
int main(void)
{
HAL_DAC_Start_DMA( &hdac2, DAC_CHANNEL_1, (uint32_t*)Wave_High, NS, DAC_ALIGN_12B_R);
*/ start DMA use DAC2 channel 1 */
}
作为下一步,我想更改代码中的信号形式。因为我希望这种情况不会中断,所以停止 DMA 并重新初始化它不起作用(中间有 500 µs 的延迟而没有信号)。因此我需要覆盖查找表。我试过这样:
#define NS 64 # number of samples
uint32_t Wave_Low[NS] = {2048,[...],2047}; # lookup table 1
uint32_t Wave_High[NS] = {4096,[...],4067}; # lookup table 2
uint32_t Wave_Active[NS]; #used lookup table
int main(void)
{
memcpy(Wave_Active , Wave_High, NS ); #assign high wave as the currently used one
HAL_DAC_Start_DMA( &hdac2, DAC_CHANNEL_1, (uint32_t*)Wave_Active, NS, DAC_ALIGN_12B_R);
*/ start DMA use DAC2 channel 1 */
}
据我了解,这段代码应该显示完全相同的行为,但 DAC 信号通过显示锯齿信号的正部分而不是它应该显示的中心正弦波而显着不同。我对嵌入式 C 有点生疏,但这种行为确实让我很恼火。
解决方案
几个问题:
DMA 缓冲区需要经过
volatile
限定,否则编译器在生成访问它们的代码时可能会出错。你用
memcpy
错了,应该是memcpy(Wave_Active , Wave_High, sizeof Wave_Active);
在与硬件相关的编程中,使用
memcpy
to begin with 通常是不正确的。复制 256 个字节需要很长时间。最坏的情况是,您的 DAC 甚至可能会在您完成复制之前请求新数据。编写此类代码的正确方法是分配多个缓冲区,然后交换“活动”指针以指向所使用的缓冲区。由于我不理解这些数组的目的的免责声明,这样的事情将是一个巨大的速度优化:
volatile uint32_t Wave_Low[NS] = {2048,[...],2047}; # lookup table 1 volatile uint32_t Wave_High[NS] = {4096,[...],4067}; # lookup table 2 volatile uint32_t* Wave_Active = Wave_High; ... if(DMA_flag) { Wave_Active = (Wave_Active==Wave_Low) ? Wave_High : Wave_Low; /* you might have to tell the DMA which array to use next time here */ }
推荐阅读
- android - 我在手机上运行时收到 ERR_CLEARTEXT_NOT_PERMITTED。但它在 webview 和模拟器上运行良好
- android - 使用 MVVM 和 LiveData 时保存 RecyclerView 列表项更改的最佳实践?
- sql-server - 启动 Docker 容器时如何恢复 SQL Server 数据库?
- r - install.packages 中的错误:连接错误
- powerbi - 使用 PowerBI 通过机器确定样式转换
- python - 如何使用 selenium 使 esri 几何和地图函数可用于在 python 中执行?
- python - EST 中的 Django Admin 日期时间
- vb.net - vb.net / excel dna 可选布尔参数
- java - 如何提高elasticsearch中的搜索速度(我的主要查询:术语查询和短语查询)?
- flutter - Flutter - 我能用 Flutter 创建一个模块并在我的 iOS 和 Android 项目中使用它吗?