英飞凌
直播中

敷衍作笑谈

9年用户 977经验值
擅长:制造/封装 连接器 光电显示 接口/总线/驱动 RF/无线
私信 关注

CYT2CL发生Systick中断时,DMA就会被抢占怎么解决?

有一些任务在使用 Systick 的 10ms 调度器上执行。 在这 10ms 执行期间,DMA 传输将被启动。

但是,每当 Systick 中断发生时,DMA 传输也会被抢占,并在下一个 10ms 周期中继续进行。

既然 DMA 必须并行运行,我为什么会遇到这个问题? 共享当前配置及其范围图像,以供参考。 如果需要更新配置,请告诉我。

问题情景:

Systick 调度程序,每 10 毫秒一次,其中 4.3 毫秒用于其他应用程序处理,之后使用 SPI 启动 1D DMA 传输(内存到 PDMA)。

由于缓冲区的传输限制为 128 字节。 因此,要传输 4096 字节的数据,我们需要传输 32 个周期。

在下面的范围图像中,颜色编码如下
绿色 - GPIO,用于识别 4096 字节数据的 DMA 传输的开始和停止
黄色 - 为执行其他应用指令而封锁的区域。
粉红色--Systick 中断
蓝色--DMA 传输中断,每 128 个突发 32 个周期

如下图所示,每当发生 Systick 中断时,DMA 就会被抢占。

注意:我们甚至尝试将 DMA 的优先级设置为高,但调度却因此而延迟。





GPIO 配置
dma_transfer_data_t dma_transfer_data;
UI_8 DMA_Cfg_Init_Buff[1] = {0};
uint8_t Trigger_Recd=0;

const cy_stc_pdma_chnl_config_t chnl7Config = {
/* CURR_PTR */ .PDMA_Descriptor =  stcDescr,
/* CH_CTL PREEMPTABLE */ .preemptable = 0u,
/* CH_CTL PRIO */ .priority = 0u,
/* CH_CTL ENABLED */ .enable = 1u, /* enabled after initialization */
};

static cy_stc_pdma_descr_config_t stcDw1DescrConfig = {
/* DESCR_CTL WAIT_FOR_DEACT */ .deact = 0u,
/* DESCR_CTL INTR_TYPE */ .intrType = CY_PDMA_INTR_1ELEMENT_CMPLT,
/* DESCR_CTL TR_OUT_TYPE */ .trigoutType = CY_PDMA_TRIGOUT_1ELEMENT_CMPLT,
/* DESCR_CTL CH_DISABLE */ .chStateAtCmplt = CY_PDMA_CH_ENABLED,
/* DESCR_CTL TR_IN_TYPE */ .triginType = CY_PDMA_TRIGIN_DESCR,
/* DESCR_CTL DATA_SIZE */ .dataSize = CY_PDMA_BYTE,
/* DESCR_CTL SRC_TRANSFER_SIZE */ .srcTxfrSize = 0u,
/* DESCR_CTL DST_TRANSFER_SIZE */ .destTxfrSize = 1u,
/* DESCR_CTL DESCR_TYPE */ .descrType = CY_PDMA_1D_TRANSFER,
/* DESCR_SRC */ .srcAddr =  DMA_Cfg_Init_Buff[0],
/* DESCR_DST */ .destAddr = (uint32_t *) CY_SPI_SCB_TYPE->unTX_FIFO_WR.u32Register,
/* DESCR_X_CTL SRC_X_INCR */ .srcXincr = 1u,
/* DESCR_X_CTL DST_X_INCR */ .destXincr = 0u,
/* DESCR_X_CTL X_COUNT */ .xCount = HW_FIFO_SIZE,
/* DESCR_Y_CTL SRC_Y_INCR */ .srcYincr = 0u,
/* DESCR_Y_CTL DST_Y_INCR */ .destYincr = 0u,
/* DESCR_Y_CTL Y_COUNT */ .yCount = 0u,
/* DESCR_NEXT_PTR */ .descrNext = 0u
};


回帖(1)

潘飘稚

2024-5-23 17:04:59
要解决这个问题,我们可以采取以下步骤:

1. 分析问题:首先,我们需要了解问题的根源。在这种情况下,问题是 Systick 中断导致 DMA 传输被抢占。我们需要找出为什么 Systick 中断会影响 DMA 传输。

2. 检查配置:检查当前的配置,确保 DMA 和 Systick 调度器之间的优先级设置正确。通常,DMA 传输应该具有较高的优先级,以确保它不会被其他中断抢占。

3. 调整优先级:如果 DMA 传输的优先级较低,可以尝试提高其优先级。这可以通过修改 NVIC(嵌套向量中断控制器)的优先级设置来实现。确保 DMA 中断的优先级高于 Systick 中断的优先级。

4. 优化 Systick 调度器:如果可能,可以尝试优化 Systick 调度器,以减少对 DMA 传输的影响。例如,可以尝试减少 Systick 中断的频率,或者在 Systick 中断处理程序中添加一些延时,以确保 DMA 传输有足够的时间完成。

5. 使用 DMA 完成中断:另一种解决方案是使用 DMA 完成中断而不是依赖 Systick 中断。当 DMA 传输完成时,它将触发一个中断,您可以在中断处理程序中执行所需的任务。这样可以确保 DMA 传输不会被 Systick 中断抢占。

6. 检查硬件限制:最后,检查硬件限制,确保您的系统可以同时处理 Systick 中断和 DMA 传输。如果硬件资源有限,可能需要考虑升级硬件或优化软件以满足需求。

通过采取这些步骤,您应该能够解决 Systick 中断导致 DMA 传输被抢占的问题。请确保在进行任何更改后测试系统,以确保问题已得到解决。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分