打印
[PSoC™]

PSoC6中使用FreeRTOS如果应用中有操作Flash的情况,应该注意什么

[复制链接]
521|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
IFX_Ida|  楼主 | 2024-12-28 22:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
添加FreeRTOS后经常会遇到的问题的案例:
很多用户在跑官方例程Emulated EEPROM例程并没有问题,但是往往在加了FreeRTOS后会出现EEPROM读写失败的情况

解决方案:
修改system_psoc6.h中的以下内容即可解决问题。这里修改IPC中断优先级为0,FreeRTOS配置的管理中断优先级是低于1的,这样的话IPC中断就不再受FreeeRTOS的影响
#define CY_SYS_INTR_CYPIPE_PRIOR_EP0    (0UL)   /* Notifier Priority */
#define CY_SYS_INTR_CYPIPE_PRIOR_EP1    (0UL)   /* Notifier Priority */

使用特权

评论回复
沙发
IFX_Ida|  楼主 | 2024-12-30 13:25 | 只看该作者
简单解释一下,方便大家后续遇到类似问题的时候可以快速查看这里:

使用FreeRTOS时,默认FreeRTOSConfig.h中配置了:

#define configMAX_SYSCALL_INTERRUPT_PRIORITY 0x3F

PSoC6使用高3位表示中断优先级,所以这里表示FreeRTOS可管控的系统中断优先级数值>=1。也就是说所有优先级比1小以及等于1的中断都是有可能被FreeRTOS关掉的。

再来看flash操作,这里是在CM4中操作flash。具体是通过IPC向CM0+发送命令,然后经过System API实现flash的擦写等命令。所以IPC中断对flash操作来说至关重要。而默认的IPC interrupt的优先级是1,也就是上面在system_psoc6.h中配置的。我们只要把IPC interrupt中断优先级改为0,它就不会被FreeRTOS关掉,也就不会影响flash的操作了。

使用特权

评论回复
板凳
cashrwood| | 2025-1-3 12:01 | 只看该作者
PSoC6通常使用高3位表示中断优先级。FreeRTOS配置的管理中断优先级默认是低于或等于某个特定值(如1)。这意味着所有优先级比该值小或等于的中断都可能被FreeRTOS关掉。

使用特权

评论回复
地板
kmzuaz| | 2025-1-3 14:58 | 只看该作者
在Flash操作中实现错误处理机制,以便在发生错误时能够安全地恢复或报告错误。

使用特权

评论回复
5
maqianqu| | 2025-1-3 15:29 | 只看该作者
某些Flash操作可能需要特定的访问模式或时序要求。确保遵守这些要求,以避免损坏Flash或降低其性能。

使用特权

评论回复
6
jimmhu| | 2025-1-3 17:33 | 只看该作者
如果IPC中断的优先级被FreeRTOS关掉,那么flash操作可能会受到影响。为了避免这种情况,需要将IPC中断优先级设置为FreeRTOS不会关掉的级别。通常,这可以通过修改system_psoc6.h中的相关宏定义来实现,例如将IPC中断优先级设置为0。

使用特权

评论回复
7
gygp| | 2025-1-5 09:06 | 只看该作者
在FreeRTOS中,可以使用原语(如互斥锁、信号量等)来同步任务和中断服务例程,确保在Flash操作期间不会有其他任务或中断服务例程干扰。

使用特权

评论回复
8
averyleigh| | 2025-1-5 13:20 | 只看该作者
如果在FreeRTOS环境下擦写外部Flash,可能需要禁用指令缓存。这是因为代码通常是XIP(eXecute In Place,即代码存储在Flash中并直接在Flash中执行),向量表也位于Flash中。当发生中断时,内核将读取中断向量表。如果同时Flash被编程写入,则读取操作可能会失败。

使用特权

评论回复
9
pixhw| | 2025-1-5 14:10 | 只看该作者
多核MCU中,多个内核可能同时访问共享资源(如Flash),导致数据一致性和同步问题。

使用特权

评论回复
10
dspmana| | 2025-1-5 14:59 | 只看该作者
Flash 存在写入寿命限制,多次在同一位置写入会导致该区域过早损坏。在 FreeRTOS 应用中,要注意对 Flash 进行磨损均衡。可以通过软件算法,如将数据分散写入 Flash 的不同区域,避免频繁写入同一物理位置。例如,采用日志式的写入策略,将新的数据更新记录在新的 Flash 区域,而不是直接覆盖旧数据。

使用特权

评论回复
11
jackcat| | 2025-1-5 17:55 | 只看该作者
进行Flash操作时,关闭总中断或使用特定的中断屏蔽机制,确保Flash操作的原子性。例如,可以使用__disable_irq()禁用全局中断,并在操作完成后使用__enable_irq()重新启用中断。

使用特权

评论回复
12
51xlf| | 2025-1-7 12:34 | 只看该作者
Flash 操作相对较慢,可能会阻塞任务的执行。在 FreeRTOS 中,如果一个高优先级任务被一个正在进行 Flash 操作的低优先级任务阻塞,可能会影响系统的实时性能。因此,在设计应用时,要考虑是否可以将 Flash 操作放在一个单独的任务中,并设置适当的优先级,或者采用异步操作的方式来减少对其他任务的影响。

使用特权

评论回复
13
plsbackup| | 2025-1-7 13:30 | 只看该作者
Flash Driver不能操作相同的Bank,例如,如果Flash Driver存放在PFlash0,那么不应调用Flash Driver对PFlash0的空间进行任何擦/写操作。

使用特权

评论回复
14
gygp| | 2025-1-9 20:07 | 只看该作者
为了提高软件的鲁棒性,建议将Flash Driver加载到RAM区运行,而不是放在PFlash中。

使用特权

评论回复
15
cemaj| | 2025-1-9 21:19 | 只看该作者
在 PSoC6 中使用 FreeRTOS 时,如果多个任务同时尝试操作 Flash,可能会导致数据冲突。因为 Flash 的写入操作通常是有一定限制的,如写入次数有限、写入速度相对较慢,并且写入过程可能涉及到复杂的内部机制,如擦除 - 写入周期。当多个任务并发访问 Flash 时,可能会干扰这些操作,导致写入错误或数据损坏。

使用特权

评论回复
16
zerorobert| | 2025-1-9 22:07 | 只看该作者
Flash 的操作,特别是写入和擦除操作,对时序有严格要求。在 FreeRTOS 环境下,任务调度可能会对 Flash 操作的时序产生影响。如果任务切换过于频繁,可能会导致 Flash 操作无法在规定的时间内完成。例如,Flash 写入操作可能需要在一个连续的时间窗口内完成一系列的操作步骤,包括发送指令、写入数据等,任务切换可能会打断这个过程,使操作失败。

使用特权

评论回复
17
10299823| | 2025-1-11 15:54 | 只看该作者
在进行Flash操作时,可能需要使用临界区来保护关键代码段,防止任务切换导致的数据不一致问题。可以使用taskENTER_CRITICAL()和taskEXIT_CRITICAL()宏来定义临界区。

使用特权

评论回复
18
bestwell| | 2025-1-11 17:17 | 只看该作者
在进行Flash操作时,应避免中断操作,因为中断可能会导致Flash操作被意外终止,从而损坏Flash内容。可以暂时禁用中断,直到Flash操作完成后再重新启用。

使用特权

评论回复
19
geraldbetty| | 2025-1-11 18:15 | 只看该作者
Flash操作可能会影响系统的整体性能,特别是在多任务环境中。确保Flash操作不会成为系统性能的瓶颈。

使用特权

评论回复
20
vivilyly| | 2025-1-11 18:52 | 只看该作者
在FreeRTOS中,任务的优先级决定了任务的调度顺序。如果任务优先级设置不当,可能会导致低优先级任务长时间得不到调度,从而影响系统的性能。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:英飞凌科技股份公司
简介:关于英飞凌——我们致力于打造一个更加便利、安全和环保的世界,在赢得自身成功发展的同时,积极践行企业社会责任。

27

主题

41

帖子

2

粉丝