完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在玩FreeRTOS,遇到一个问题,就是不知如何在中断中调用内存分配函数。pvPortMalloc函数中会调用xTaskResumeAll,而这个函数不能再中断调用,所以请问在中断中进行内存分配的情况该如何处理。
|
|
相关推荐
1个回答
|
|
在FreeRTOS中,确实不建议在中断服务例程(ISR)中直接调用内存分配函数,如`pvPortMalloc`,因为这些函数可能会调用任务调度器相关的函数,如`xTaskResumeAll`,这在中断上下文中是不允许的。但是,你可以通过以下方法在中断中进行内存分配:
1. **使用静态分配的缓冲区**:为了避免在中断中进行动态内存分配,你可以预先分配一个足够大的静态缓冲区,然后在中断中使用这个缓冲区。这种方法的缺点是你需要预先知道最大可能的内存需求,这在某些情况下可能不现实。 2. **使用无锁数据结构**:在中断中使用无锁数据结构,如环形缓冲区(ring buffers)或固定大小的队列,可以避免使用动态内存分配。这些数据结构在设计时就考虑了中断上下文的使用,因此可以在不违反FreeRTOS规则的情况下在中断中使用。 3. **使用中断安全的数据结构**:FreeRTOS提供了一些中断安全的数据结构,如`xQueue`。虽然这些数据结构在设计时考虑了中断上下文的使用,但它们仍然不建议在中断中使用,因为它们可能会调用任务调度器相关的函数。然而,你可以通过将中断中的数据存储在临时缓冲区中,然后在任务上下文中将数据从临时缓冲区移动到`xQueue`中来实现。 4. **使用中断任务**:你可以创建一个专门用于处理中断中内存分配的任务。在中断服务例程中,将需要分配内存的任务添加到这个任务的事件标志或队列中。然后,这个任务在任务上下文中执行内存分配,并将结果返回给中断服务例程。这种方法的缺点是它会增加系统的延迟,因为任务调度器需要在中断和任务之间切换。 5. **使用临界区**:虽然不推荐在中断中使用动态内存分配,但你可以在中断中使用临界区(critical sections)来保护对动态内存分配函数的调用。这可以通过使用`portENTER_CRITICAL`和`portEXIT_CRITICAL`宏来实现。然而,这种方法可能会导致任务调度器的延迟,因为其他任务在中断期间可能会被阻塞。 总之,在FreeRTOS中,最好避免在中断中进行动态内存分配。如果确实需要在中断中进行内存分配,可以考虑使用上述方法之一。然而,这些方法可能会增加系统的复杂性和延迟,因此在设计系统时应仔细权衡利弊。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1975 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1760 浏览 1 评论
1232 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
819 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1776 浏览 2 评论
2015浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
892浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
318浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
670浏览 3评论
662浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-24 02:42 , Processed in 0.904703 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191