光
在 Cortex-M 上做实时数据采集,中断与 DMA 的合理配合决定了系统能否稳定无丢点。
一、基本架构
1. 外设(ADC、SPI、UART)触发 DMA,数据直接搬运到 RAM,CPU 不参与逐字节搬运;
2. 采用双缓冲(乒乓)或循环模式加半传输中断:前一半填满时处理前一半,后一半填满时处理后一半;
3. 处理时间必须小于半个缓冲区的填充时间。例如 100kSPS、缓冲区 1024 点,半缓冲时间为 5.12ms,处理需在此之内完成并留余量。
二、中断优先级
1. Cortex-M 的 NVIC 优先级数值越小优先级越高;
2. DMA 完成中断优先级应高于通信与界面任务;
3. 使用 RTOS 时,调用 RTOS API 的中断优先级不能高于 configMAX_SYSCALL_INTERRUPT_PRIORITY;
4. ISR 内只做置标志、发通知,复杂处理放到任务中。
三、Cache 一致性(Cortex-M7 等带 D-Cache 的内核)
1. DMA 写入内存后,CPU 读取前需执行 SCB_InvalidateDCache_by_Addr;
2. CPU 写入后交给 DMA 发送前需执行 SCB_CleanDCache_by_Addr;
3. 缓冲区按 32 字节缓存行对齐,大小为 32 的整数倍;
4. 也可通过 MPU 把 DMA 缓冲区配置为非缓存区域。
忘记处理 cache 时,CPU 读到的是旧数据,这是 M7 平台上最常见的问题之一。
四、常见坑
1. 缓冲区放在 DTCM,而某些 DMA 无法访问 DTCM;
2. 半传输中断未使能,只处理了全传输中断;
3. 处理时间偶尔超时,数据被覆盖而不自知,建议加溢出检测计数。
讨论:
1. 你们在 Cortex-M7 上更常用 cache 维护函数还是 MPU 非缓存区?
2. 采集任务的实时性你们如何量化测试?
一、基本架构
1. 外设(ADC、SPI、UART)触发 DMA,数据直接搬运到 RAM,CPU 不参与逐字节搬运;
2. 采用双缓冲(乒乓)或循环模式加半传输中断:前一半填满时处理前一半,后一半填满时处理后一半;
3. 处理时间必须小于半个缓冲区的填充时间。例如 100kSPS、缓冲区 1024 点,半缓冲时间为 5.12ms,处理需在此之内完成并留余量。
二、中断优先级
1. Cortex-M 的 NVIC 优先级数值越小优先级越高;
2. DMA 完成中断优先级应高于通信与界面任务;
3. 使用 RTOS 时,调用 RTOS API 的中断优先级不能高于 configMAX_SYSCALL_INTERRUPT_PRIORITY;
4. ISR 内只做置标志、发通知,复杂处理放到任务中。
三、Cache 一致性(Cortex-M7 等带 D-Cache 的内核)
1. DMA 写入内存后,CPU 读取前需执行 SCB_InvalidateDCache_by_Addr;
2. CPU 写入后交给 DMA 发送前需执行 SCB_CleanDCache_by_Addr;
3. 缓冲区按 32 字节缓存行对齐,大小为 32 的整数倍;
4. 也可通过 MPU 把 DMA 缓冲区配置为非缓存区域。
忘记处理 cache 时,CPU 读到的是旧数据,这是 M7 平台上最常见的问题之一。
四、常见坑
1. 缓冲区放在 DTCM,而某些 DMA 无法访问 DTCM;
2. 半传输中断未使能,只处理了全传输中断;
3. 处理时间偶尔超时,数据被覆盖而不自知,建议加溢出检测计数。
讨论:
1. 你们在 Cortex-M7 上更常用 cache 维护函数还是 MPU 非缓存区?
2. 采集任务的实时性你们如何量化测试?

