完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
有一些任务在使用 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个回答
|
|
要解决这个问题,我们可以采取以下步骤:
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 传输被抢占的问题。请确保在进行任何更改后测试系统,以确保问题已得到解决。 |
|
|
|
只有小组成员才能发言,加入小组>>
TLE9879_BLDC电机启动需要用手拨一下才能转动,怎么解决?
5707 浏览 2 评论
4090 浏览 9 评论
请问TLE5012B_E1000 启动后为什么位置不能正确获取
3606 浏览 9 评论
1214 浏览 8 评论
3508 浏览 7 评论
431浏览 2评论
257浏览 2评论
365浏览 2评论
TLE9879_BLDC电机启动需要用手拨一下才能转动,怎么解决?
5725浏览 2评论
如果是打开已有的dave工程,怎么查看这个工程选择的mcu型号?
434浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 02:47 , Processed in 0.574590 second(s), Total 48, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号