276_浮点运算导致FreeRTOS卡在xQueueGiveFromISR

69 篇文章 11 订阅
64 篇文章 165 订阅

完整的S32K144的学习汇总如下:

https://github.com/GreyZhang/g_s32k144

    继续S32K144的学习,这一次整理一个我在学习中遇到的BUG。我的软件中有一个基于串口的printf功能,最初这个功能都是OK了。但是,当我增加了一个浮点运算之后,打印了一下之后不再打印了。使用调试器,查看到软件停在了xQueueGiveFromISR函数中。

    由于的软件中没有队列的实际操作,我暂时是先把问题定位为浮点的使用。尝试了几种不同的使用方法后,还是不成功。感觉,OS这次的提示或许是有问题的。正好,IDE中有一个FreeRTOS的调试插件。查看了stack的使用,调用printf的任务基本上stack满了。第二次开始,连查看都无法成功了。猜测是stack不够,尝试做一个多一点的分配。

    上面是增加stack之后,软件恢复正常的效果。

    看起来,或许这算是FreeRTOS设计上的一个缺陷,问题的提示导向还是有问题的。

完整的S32K144的学习汇总如下:

https://github.com/GreyZhang/g_s32k144

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DW_axi_dmac在FreeRTOS上的驱动程序通常需要由嵌入式软件开发人员编写,以便在FreeRTOS中使用DW_axi_dmac进行数据传输。下面是DW_axi_dmac在FreeRTOS上的驱动程序的一个简单示例: ```c #include "FreeRTOS.h" #include "task.h" #include "queue.h" #include "semphr.h" #include "dw_axi_dmac.h" /* 定义DMA控制器句柄 */ static dw_axi_dmac_t dma_handle; /* 定义DMA传输完成信号量 */ static SemaphoreHandle_t dma_done_sem; /* 定义DMA传输完成中断处理函数 */ void dma_done_isr(void) { BaseType_t xHigherPriorityTaskWoken = pdFALSE; xSemaphoreGiveFromISR(dma_done_sem, &xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } /* 初始化DMA控制器 */ void dma_init(void) { /* 初始化DMA控制器句柄 */ dma_handle.base = DMA_BASE_ADDR; dma_handle.channel = DMA_CHANNEL; /* 初始化DMA传输完成信号量 */ dma_done_sem = xSemaphoreCreateBinary(); /* 注册DMA传输完成中断处理函数 */ dw_axi_dmac_register_irq(&dma_handle, DMA_IRQ_DONE, dma_done_isr, NULL); /* 初始化DMA控制器 */ dw_axi_dmac_init(&dma_handle); } /* 开始DMA传输 */ void dma_start(uint32_t src_addr, uint32_t dst_addr, uint32_t size) { /* 配置DMA传输参数 */ dw_axi_dmac_config_t dma_cfg; dma_cfg.src_addr = src_addr; dma_cfg.dst_addr = dst_addr; dma_cfg.src_inc = 1; dma_cfg.dst_inc = 1; dma_cfg.max_burst_size = 16; dma_cfg.block_size = size; dma_cfg.transfer_type = DW_AXI_DMAC_TRANSFER_P2M; /* 启动DMA传输 */ dw_axi_dmac_transfer_async(&dma_handle, DMA_CHANNEL, &dma_cfg); /* 等待DMA传输完成 */ xSemaphoreTake(dma_done_sem, portMAX_DELAY); } ``` 在上面的示例中,我们定义了DMA控制器句柄`dma_handle`,并初始化了DMA控制器和DMA传输完成信号量`dma_done_sem`。我们还定义了DMA传输完成中断处理函数`dma_done_isr`,在DMA传输完成时会自动调用该函数。在`dma_start`函数中,我们配置了DMA传输参数,并启动了DMA传输。然后,我们使用`xSemaphoreTake`函数等待DMA传输完成,以确保数据传输已经完成。 在使用DW_axi_dmac进行数据传输时,需要确保源地址和目的地址是可访问的,并且DMA传输参数已正确配置。在实际应用中,您可能需要根据具体的需求进行更改,并根据DW_axi_dmac的规格书和FreeRTOS的文档进行调试和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值