Multi Source Translation Content

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Multi Source Translation Content

Discussions

Sort by:
FreeRTOS integration with AUTOSAR FlexCAN driver — RTD 3.0.0 / S32DS We have developed a FlexCAN (CAN driver) using NXP RTD 3.0.0 on S32DS as a bare-metal AUTOSAR MCAL implementation. We now need to integrate FreeRTOS as the RTOS for this project. Our specific questions are: 1. Is it officially supported to run AUTOSAR MCAL drivers (RTD 3.0.0) under FreeRTOS instead of AUTOSAR OS? 2. If it is supported how to port FREERTOS any example SDK? 3. Are there any known limitations or additional configuration steps required in S32DS when using FreeRTOS with the Can driver (FlexCAN)? 4. What is the recommended interrupt priority setup for FlexCAN ISRs when using FreeRTOS (with respect to configMAX_SYSCALL_INTERRUPT_PRIORITY)? Environment: - MCU: [FRDM s32k344 ] - RTD version: 3.0.0 - IDE: S32DS - RTOS: FreeRTOS - Driver: FlexCAN / Can driver (AUTOSAR MCAL) Re: FreeRTOS integration with AUTOSAR FlexCAN driver — RTD 3.0.0 / S32DS HI , Julián_AragónM Thanks for your early reply and fast response. Yes, it was a very helpful Re: FreeRTOS integration with AUTOSAR FlexCAN driver — RTD 3.0.0 / S32DS Hi , 1. Is it officially supported to run AUTOSAR MCAL drivers (RTD 3.0.0) under FreeRTOS instead of AUTOSAR OS? Yes. NXP provides a FreeRTOS release for S32K3 based on RTD 3.0.0 for FreeRTOS kernel v10.5.1: However, all of the routines are based on the low-level layer (LLD or IP), not the high-level layer (HLD or MCAL). Mainly because FreeRTOS is not ISO26262 certified. 2. If it is supported how to port FREERTOS any example SDK? This is up to the customer. FreeRTOS implementation will depend on your project's complexity. As I've mentioned, we provide some example routines in the FreeRTOS package which you can use as reference:   There is also a lot of useful information in the FreeRTOS' user manual. It notes linker script, interrupt vector table, timers, interrupts along with RTD integration.  (FreeRTOS User Manual is available from version 6.0.0 and up.) 3. Are there any known limitations or additional configuration steps required in S32DS when using FreeRTOS with the Can driver (FlexCAN)? Other than usual RTOS configurations (heap size, handlers, OS rate with timers, priorities, etc.), there are no specific FlexCAN + FreeRTOS limitations. 4. What is the recommended interrupt priority setup for FlexCAN ISRs when using FreeRTOS (with respect to configMAX_SYSCALL_INTERRUPT_PRIORITY)? You can refer to this other community post: Solved: How to configure interrupt priorities when using freertos for s32k142 - NXP Community. It mentions S32K1, but the principles are the same. S32K3 also has 4 priority bits. In case you are not too far in application development, I would suggest updating your current RTD version, as there have been several releases containing bug fixes, known issues and optimizations. Added to this, there is also a compatible FreeRTOS package with latest RTD release (7.0.1). Hope this helps!  Best regards, Julián
View full article
S32K312 RTD [SW32K3_S32M27x_RTD_R21-11_5.0.0] 拝啓 当社では、アプリケーション開発にS32k312ミニ評価ボードを使用しています。 SW32K3_S32M27x_RTD_R21-11_5.0.0 または SW32K3_S32M27x_RTD_R23-11_7.0.0 を使用する予定です。このRTDを使用するには、秘密保持契約(NDA)に署名する必要がありますか? S32Kデザインスタジオ [S32DS.3.6.6]設定ファイル生成に使用される設定ツール。設定ファイルの生成にはオープンソースが使用されていますが、コンパイルとデバッグにはIARが使用されています。設定利用にはNDAが必要ですか? ぜひサポートください。 よろしくお願いいたします。 タラプシュパム Re: S32K312 RTD [SW32K3_S32M27x_RTD_R21-11_5.0.0] こんにちは、 @Thalapushpam1さん RTDへのアクセスや使用にNDAは必要なく、S32DSについても同様です。しかし、ご利用規約を理解するためには、ライセンス契約書を確認することが重要です。 IARに関しては、S32DSはIARコンパイラを使用できるIARプラグインを通じてサポートを提供しています。ただし、使用するにはIARから有効なライセンスを取得する必要があります。ライセンスや使用方法に関する詳細については、IARに直接お問い合わせいただくことをお勧めします。 BR、VaneB
View full article
VDD_SOC電圧 こんにちは、 IMX943ボードのVDD_SOCに印加するのに最適な電圧はどれくらいでしょうか?あなたのEVKには0.92Vが入っています。電源ファイルでは、0.85Vまたは0.9Vになることがあります。 Re: VDD_SOC voltage 入手可能なNXPのドキュメントによると、VDD_SOCはさまざまなSoC駆動モードに関連付けられています。典型的な値は次のとおりです。 0.9V(オーバードライブモード) 0.85V(定格モード) 0.8V(低電力モード) https://docs.nxp.com/bundle/AN14935/page/topics/soc_driving_mode.html EVKプラットフォームでは、測定結果によると、特定の動作条件下ではVDD_SOCは約0.92Vになることがわかっています。 i.MX943はまだ試作段階にあるため、最終的な推奨値はNDA(秘密保持契約)に基づきデータシートに記載されています。 基板設計に関しては、NXPのマーケティングチームに連絡して詳しいサポートを受ける必要があります。
View full article
FreeRTOS 与 AUTOSAR FlexCAN 驱动程序的集成 - RTD 3.0.0/ S32DS 我们在 S32DS 上使用恩智浦 RTD 3.0.0 开发了一个 FlexCAN(CAN 驱动程序),作为裸机 AUTOSAR MCAL 实现。我们现在需要将 FreeRTOS 集成为这个项目的实时操作系统。 我们的具体问题是 1.官方是否支持运行 AUTOSAR MCAL 驱动程序 (RTD 3.0.0)在 FreeRTOS 而不是 AUTOSAR 操作系统下运行? 2.如果支持,如何移植 FREERTOS 的任何示例 SDK? 3.在 S32DS 中使用带有 Can 驱动程序 (FlexCAN) 的 FreeRTOS 时,是否有任何已知的限制或需要额外的配置步骤? 4.使用 FreeRTOS 时,建议对 FlexCAN ISR 进行怎样的中断优先级设置(与 configMAX_SYSCALL_INTERRUPT_PRIORITY 有关)? 环境: - MCU:[FRDM s32k344 ] - RTD 版本:3.0.0 - IDE:S32DS - 实时操作系统:FreeRTOS - 驱动程序:FlexCAN / Can 驱动程序(AUTOSAR MCAL) Re: FreeRTOS integration with AUTOSAR FlexCAN driver — RTD 3.0.0 / S32DS HI , Julián_AragónM 感谢您的及早回复和快速反应。是的,这非常有帮助 Re: FreeRTOS integration with AUTOSAR FlexCAN driver — RTD 3.0.0 / S32DS 嗨 、 1.官方是否支持运行 AUTOSAR MCAL 驱动程序 (RTD 3.0.0)在 FreeRTOS 而不是 AUTOSAR 操作系统下运行? 是的。恩智浦为 S32K3 提供基于 RTD 3.0.0 的 FreeRTOS 版本用于 FreeRTOS 内核 v10.5.1: 但是,所有例程都基于低级层(LLD 或 IP),而不是高级层(HLD 或 MCAL)。主要是因为 FreeRTOS 没有通过 ISO26262 认证。 2.如果支持,如何移植 FREERTOS 的任何示例 SDK? 这取决于客户。FreeRTOS 的实施取决于项目的复杂程度。正如我已经提到的,我们在 FreeRTOS 包中提供了一些示例例程,您可以将其用作参考: FreeRTOS 用户手册 中还有很多有用的信息 。它说明了链接器脚本、中断向量表、定时器、中断以及 RTD 集成。 (FreeRTOS 用户手册从 6.0.0 及以上版本开始提供)。 3.在 S32DS 中使用带有 Can 驱动程序 (FlexCAN) 的 FreeRTOS 时,是否有任何已知的限制或需要额外的配置步骤? 除了通常的 RTOS 配置(堆大小、处理程序、带定时器的操作系统速率、优先级等)外,FlexCAN + FreeRTOS 没有特定的限制。 4.使用 FreeRTOS 时,建议对 FlexCAN ISR 进行怎样的中断优先级设置(与 configMAX_SYSCALL_INTERRUPT_PRIORITY 有关)? 您可以参考社区的其他帖子:已解决:在为 s32k142 使用 freertos 时如何配置中断优先级 - NXP 社区。它提到了 S32K1,但原理是一样的。S32K3 也有 4 个优先级位。 如果你在应用程序开发方面还不算太远,我建议你更新你当前的RTD版本,因为已经有几个版本包含错误修复、已知问题和优化。除此之外,还有一个兼容的FreeRTOS软件包,其中包含最新的RTD版本(7.0.1)。 希望对您有所帮助! 致以最诚挚的问候, Julián
View full article
S32K312 热电阻 [SW32K3_S32M27x_RTD_R21-11_5.0.0] 亲爱的先生/女士 我们正在使用S32k312迷你评估板进行应用程序开发。 计划使用 SW32K3_S32M27x_RTD_R21-11_5.0.0 或 SW32K3_S32M27x_RTD_R23-11_7.0.0 。使用该 RTD 是否需要签署任何 NDA 协议? S32K 设计工作室 [S32DS.3.6.6]用于生成配置文件的配置工具。由于它是开源的,用于生成配置文件,但 IAR 用于编译& 调试。配置使用是否需要保密协议? 请给予支持。 谢谢& 、 塔拉普什帕姆 Re: S32K312 RTD [SW32K3_S32M27x_RTD_R21-11_5.0.0] 你好@Thalapushpam1 访问或使用 RTD 不需要 NDA,S32DS 也是如此。不过,查看许可协议以了解使用条款非常重要。 关于 IAR,S32DS 通过 IAR 插件提供支持,允许您使用 IAR 编译器。 不过,您仍然需要 IAR 颁发的有效许可证才能使用。有关许可或使用的详细信息,建议直接联系 IAR。 BR、VaneB
View full article
SAE J1939 Stack I am using the FRDM-A-S32K344 board with S32K3 SDK 3.0.0. Could you please confirm whether the FlexCAN driver supports the SAE J1939 protocol stack? Additionally, is there an official or recommended SAE J1939 stack available from NXP that is compatible with this SDK version 3.0.0 and CAN configuration Re: SAE J1939 Stack Hi @ganavi1, S32K3 devices provide the FlexCAN IP. Quoting the S32K3XX's reference manual: "FlexCAN is a communication controller implementing the CAN protocol according to the ISO 11898-1:2015 standard and CAN 2.0 Part B protocol specifications." Since J1939 also uses CAN 2.0B protocol, it is fully compatible with FlexCAN IP block. However, NXP does not provide any J1939 stack for S32K3. You will need to contact a third-party provider, such as Vector or Simma for instance. Best regards, Julián
View full article
ISO/IEC 18000-3 モード2 こんにちは、 NXP社は現在、 ISO/IEC 18000-3 モード2をサポートするリーダーICを提供しているかどうかをお伺いしたいと思います。 タグの具体的な例: https://www.satoeurope.com/products/tags.php NXPのリーダーIC(PN7462やCLRC663など)のほとんどがモード3をサポートしていることは承知していますが、NXPの製品ポートフォリオの中でモード2を明示的にサポートするチップは見当たりません。そのような製品は存在するのでしょうか、それともNXPのエコシステムではモード2はサポートされていないのでしょうか? ありがとう。 ミラノ Re: ISO/IEC 18000-3 Mode 2 こんにちは、 @m_sedlakさん あなたの調子が良いといいのですが。 現在、当社の製品ポートフォリオに含まれるNFC リーダICはISO/IEC 18000-3モード3をサポートしており、さらにPN7642はISO/IEC 18000-3モード1もサポートしています。 ご迷惑をおかけして申し訳ございません。 よろしくお願いいたします。 エドゥアルド。
View full article
唤醒后 S32K328 RTC 故障 您好,NXP团队, 我之前在 S32K314 上开发了 RTC 功能,睡眠唤醒后它可以继续正常计时。 现在,我正在将该项目移植到 S32K328 上。不过,在移植 RTC 功能时,我遇到了一个问题: 唤醒后,日期(年/月/日)将重置为默认值 1970/1/1。此外,时间(小时/分钟/秒)不保留最初配置的值,而只反映从 RTC 起始点开始计算的经过时间。 例如,我将 RTC 初始化为 2026/05/08 05:06:07。运行 1 分钟后,当 MCU 唤醒并读取 RTC 时间时,日期恢复为 1970/01/01,时间显示为 00:01:00,而不是预期的 05:07:07。 S32K314 没有出现这个问题。造成这一问题的可能原因是什么? 谢谢! Re: S32K328 RTC FAIL AFTER WAKEUP 你好,胡利安、 感谢您的回复。 关于时钟源,我选择了 SXOSC,这与我们在 S32K314 中的项目相同。请参考下图。 关于启动,我只在 WAKEUP_REASON !=MCU_WAKEUP_REASON 时才执行 rtc_app_init(),这与我们的 S32K314 项目相同。 请参考下图。   我相信计数器在睡眠模式下会继续计数,但是日期和时间已 RESET。 下面是我的测试结果。 首次开机时,rtc_app_init() 完成后,系统开始从 2026/05/08 5 小时 6 分 7 秒开始计数。 该信息通过 CAN 报文 0x521 发送。 字节 0:年份 字节 1:月 字节 2:天 字节 3:小时 字节 4:分钟 字节 5:第二 字节 7: RESET 原因   从睡眠中醒来五分钟后,计数器(CNT)继续计数。但是,年、月、日、时、分、秒都从 1970/01/01 00:00:00 开始计数,而不是从初始化时设置的时间开始计数。 对于 0x263,字节 2 到字节 5 表示使用 rtc_ip_convertTimeDateToSeconds () 提取的时间。 请查看 S32K328 和 S32K314 之间的区别。 为什么 S32K328 上的 RTC 不能保留先前配置的日期和时间,即使相同的设置在 S32K314 上也能正常工作? Re: S32K328 RTC FAIL AFTER WAKEUP 你好,@Wade0905、 您检查过 RTC 时钟源吗?确认是否选择了 SIRC 和"Enabled in Standby" 选项: 另外,请记住,RTC 计数器值在唤醒后不会被重置,但会通过调用 main.c 中的 RTC 初始化代码来重置。我可以看到你只有在唤醒事件之后才初始化 RTC。你可以尝试阅读重置原因,看看是否有任何其他类型的重置正在发出,从而错误地清除 RTC 值。 有一篇社区帖子你可以参考:S32K312:RTC-保留 RTC 计数器的值,防止每次醒来后 RESET 一次。 请与您的配置进行比较。 致以最诚挚的问候, Julián
View full article
S32K328 RTC FAIL AFTER WAKEUP Hello NXP Team, I have previously developed RTC functionality on the S32K314, and after sleep wake-up it can continue counting time normally. Now I am porting the project to the S32K328. However, while porting the RTC function, I encountered an issue: After wake-up, the date (year/month/day) is reset to the default value 1970/1/1. In addition, the time (hours/minutes/seconds) does not preserve the originally configured value, but instead reflects only the elapsed time counted from the RTC start point. For example, I initialize the RTC to 2026/05/08 05:06:07. After 1 minute of operation, when the MCU wakes up and I read back the RTC time, the date has reverted to 1970/01/01, and the time shows 00:01:00 instead of the expected 05:07:07. This issue did not occur on the S32K314. What could be the possible causes of this problem? Thank you. Re: S32K328 RTC FAIL AFTER WAKEUP Hi Julián, Thanks for your reponse. Regarding clock source, I select SXOSC which same as our project in S32K314. Please see below picture for you ref. Regarding init, I only do rtc_app_init() when WAKEUP_REASON != MCU_WAKEUP_REASON which same as our project in S32K314. Please see below picture for you ref.   I believe the counter continues counting during sleep mode, but the date and time are reset. You can refer to my test results below. At the first power-on, after rtc_app_init() is completed, the system starts counting from 2026/05/08, 5 hours, 6 minutes, and 7 seconds. This is transmitted via CAN message 0x521. BYTE 0: Year BYTE 1: Month BYTE 2: Day BYTE 3: Hour BYTE 4: Minute BYTE 5: Second BYTE 7: RESET REASON   After waking up from sleep for five minutes, the counter (CNT) continues counting. However, the year, month, day, hour, minute, and second all start counting from 1970/01/01 00:00:00, instead of continuing from the time set during initialization. For 0x263, BYTE 2 to BYTE 5 represent the time extracted using Rtc_Ip_ConvertTimeDateToSeconds(). Please check the differences between the S32K328 and S32K314. Why does the RTC on the S32K328 not retain the previously configured date and time, even though the same settings work correctly on the S32K314? Re: S32K328 RTC FAIL AFTER WAKEUP Hello @Wade0905, Have you checked RTC clock source? Confirm if SIRC and "Enabled in Standby" options are selected: Also, keep in mind that RTC counter value will not be reset after wake-up, but it will reset by calling RTC initialization code in main.c. I can see you initialize RTC only after wake-up event. You can try reading reset reason to see if any other type of reset is being issued, and thus, clearing RTC value by mistake. There is a community post you can refer to: S32K312: RTC- Preserving RTC counter value from getting resets once after every wakeup. Please compare it to your configuration. Best regards, Julián
View full article
ISO/IEC 18000-3 Mode 2 Hi, I would like to ask whether NXP currently offers any reader IC that supports ISO/IEC 18000-3 Mode 2. A concrete example of the tags: https://www.satoeurope.com/products/tags.php  I am aware that most NXP reader ICs (such as the PN7462 or CLRC663) support Mode 3, but I have not been able to find any chip in the NXP portfolio that explicitly supports Mode 2. Is there any such product available, or is Mode 2 simply not supported within the NXP ecosystem? Thank you. Milan Re: ISO/IEC 18000-3 Mode 2 Hello @m_sedlak Hope you are doing well. Currently, NFC Readers ICs in our portfolio support ISO/IEC 18000-3 Mode 3, and in addition, PN7642 also supports ISO/IEC 18000-3 Mode 1. I apologize for the inconvenience. Regards, Eduardo.
View full article
如何使用 S32DS 命令行在 TCPIP 栈中导入、更新代码和清理构建示例 亲爱的先生, 我想使用 S32DS 命令行来导入、更新代码和清理构建。 我可以在 RTD 中成功执行示例(Dio_Example_S32K388),但在堆栈中执行示例(如 lwip_FreeRTOS_s32k388)时却失败了。 您能帮忙检查一下吗?或者您能提供方法吗? 我测试了 S32K388 和 S32K344 的一些示例,如下所示。 现在只需 lwip_FreeRTOS_s32k388失败。 lwip_FreeRTOS_s32k344 正常。 FreeRTOS_Toggle_Led_Example_S32K388 和 FreeRTOS_Toggle_Led_Example_S32K344 均正常。 Dio_Example_S32K388 和 Uart_Example_S32K388 正常。   而我的客户现在使用的是 lwip_FreeRTOS_s32k388,所以我需要解决这个问题。   测试环境: S32DS3.6.3 RTD:s32k3_s32m27x 实时驱动程序 ASR R21-11 版本 6.0.0 QLP04 FREERTOS: SW32K3 FreeRTOS 11.1.0版本 6.0.0 代码删除 TCPIP 协议栈:SW32K3_S32M27X_TCPIP_STACK_3.0.0_D2507 谢谢。 BR、 肖恩-吴 Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks 你好@PavelL、 我阅读了之前的主题,并尝试了主题中提到的命令。但还是失败了。 必须使用 -HeadlessTool 工具,否则会弹出 S32DS 图形用户界面窗口,这不是客户想要的。 lwip_FreeRTOS_s32k344 已使用我的命令运行。 请使用您建议的命令尝试 lwip_FreeRTOS_s32k388。 我的客户使用的是 lwip_FreeRTOS_s32k388,所以必须解决这个问题。   谢谢。 BR、 肖恩-吴 Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks 你好@seanwu、 根据这个相关的主题: 加载配置和在 CLI 中构建失败 您需要(可能需要进行一些更新,以满足您的项目需要): load mex by -Load%PROJECT_PATH%\%PROJECT_NAME%.mex 此行不等同于"更新代码", 删除 -HeadlessTool Peripherals 通过-MCU S32K388明确设置 MCU 使用 -SDKVersion PlatformSDK_S32K3 "单击更新代码" by -ExportAll%PROJECT_PATH% 或者,通过 -consoleLog 添加调试内容,查看发生了什么。 因此,"更新代码" 可以是这样的: .\s32dsc.exe -noSplash ^ -应用程序 com.nxp.swtools.framework.application ^ --launcher.ini%DS_INSTALL%\eclipse\s32ds.ini ^ 数据%WORKSPACE% ^ -sdkPath%RTD_PATH% ^ -MCU S32K388 ^ -SDK版本 PlatformSDK_S32K3 ^ -Load%PROJECT_PATH%\%PROJECT_NAME%.mex^ -全部导出%PROJECT_PATH% 由于某些默认设置,lwip_FreeRTOS_s32k344 示例只能意外运行。 顺祝商祺! 帕维尔 Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks 你好@PavelL、 我可以看到" tcpip_stack_1" ,并在 tcpip_itm_manifest.xml 中添加"S32K388" 。 "更新代码" 后,S32DS 可以生成文件夹,但命令行仍无法生成。 谢谢。 BR、 肖恩-吴 Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks 你好@seanwu、 双击 mex 文件。点击外设图标。 你能看到这个吗? 如果你看不到 tcpip_stack,甚至在 Mange SDK 组件窗口中看不到堆栈,请尝试修复 tcpip_itm_manifest.xml,正如本话题中所讨论的那样 S32K388 tcpip stack 4.0.0 在编译时缺少 lwip 文件夹 顺祝商祺! 帕维尔 Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks 你好@PavelL、 我使用命令行(见附件)"更新代码" lwip_FreeRTOS_s32k388。但它不会生成"FreeRTOS","RTD", 和"堆栈"文件夹,以及如下文件夹中的文件(图片是"更新代码" 使用 S32DS)。 Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks 你好@seanwu、 您的安装设置似乎是正确的。 "失败的" 是什么意思?编译错误或 tcpip 功能问题? 请查看我的示例示例 S32K388 GMAC0 lwIP FreeRTOS S32DS 3.6.1 RTD600- 提供了我的更改列表。 顺祝商祺! 帕维尔
View full article
SAE J1939スタック 私はFRDM-A-S32K344ボードとS32K3 SDK 3.0.0を使用しています。FlexCANドライバがSAE J1939プロトコルスタックをサポートしているかどうか確認していただけますか?さらに、NXPからこのSDKバージョン3.0.0と互換性のある公式または推奨のSAE J1939スタックは入手可能でしょうか?CAN構成 Re: SAE J1939 Stack こんにちは、 @ganavi1 さん。 S32K3デバイスはFlexCAN IPを提供します。S32K3XXのリファレンスマニュアルには、「FlexCANは、ISO 11898-1:2015規格およびCAN 2.0 Part Bプロトコル仕様に従ってCANプロトコルを実装した通信コントローラです。」と記載されています。 J1939もCAN 2.0Bプロトコルを使用しているため、FlexCAN IPブロックと完全に互換性があります。 しかし、NXPはS32K3用のJ1939スタックを提供していません。VectorやSimmaなどの第三者プロバイダーに連絡する必要があります。 よろしくお願いします、 ジュリアン
View full article
SAE J1939 堆栈 我正在使用带有 S32K3 SDK 3.0.0 的 FRDM-A-S32K344 主板。请确认 FlexCAN 驱动程序是否支持 SAE J1939 协议栈?此外,恩智浦官方或推荐的 SAE J1939 协议栈是否与 SDK 3.0.0 版兼容?和 CAN 配置 Re: SAE J1939 Stack 嗨,@ganavi1、 S32K3 设备提供 FlexCAN IP。引用 S32K3XX 的参考手册:" FlexCAN 是一款根据 ISO 11898-1:2015 标准和 CAN 2.0 B 部分协议规范实现 CAN 协议的通信控制器。" 由于 J1939 也使用 CAN 2.0B 协议,因此与 FlexCAN IP 模块完全兼容。 不过,恩智浦没有为 S32K3 提供任何 J1939 栈。您需要联系第三方供应商,例如Vector或Simma。 致以最诚挚的问候, Julián
View full article
mc33774 醒来 你好。 目前,我使用 S32K310、MC33665A 和 MC33774 芯片进行电压采集。目前,我的 MC33665A 运行正常,MC33774 的电源和电路也正常。但是,当我通过 MC33665A 发送唤醒帧来唤醒 MC33774 时,总线链中的两个 AFE 都无法唤醒(这是通过测量 VDDC 电压是否可以达到 5V 来确定的)。我目前的唤醒方法是先发送一帧唤醒帧,然后延迟至少 10 毫秒再发送另一帧唤醒帧。无法正常醒来的可能原因是什么? 另一个问题是发送唤醒命令后,MC33774 没有唤醒。然而,当我发送单个电压采集指令时,第一个 MC33774 被唤醒,并在 DADD=0 状态下响应正确的电压值。这合理吗? wakeup frame唤醒帧 AFE_1 responds with data in the DADD=0 stateAFE_1在 DADD=0 状态下响应数据 MC33774 initialization processMC33774 初始化过程 Re: MC33774 WAKE UP HI. 我尝试了这种方式,但是这种枚举方式下我的AFE1被枚举为了DADD=2,相当于我发送的枚举AFE1为DADD=1的报文被忽略或者被当成了唤醒帧。唤醒帧和枚举帧的时间间隔设置了10ms,应该满足手册中的2.4ms。请问是不是我的唤醒帧发送格式错误? Re: MC33774 WAKE UP Hi  可以尝试: 唤醒第一个 33774 → 给第一个 33774 写入 DADD → 唤醒第二个 33774 → 给第二个 33774 写入 DADD→唤醒第 n 个33774 →给第 n 个 33774 写入 DADD。流程图如下所示:
View full article
MC33774 WAKE UP HI. Currently, I am using the S32K310, MC33665A, and MC33774 chips to perform voltage acquisition. At present, my MC33665A is operating normally, and the power supply and circuit of MC33774 are also normal. However, when I send a wakeup frame through MC33665A to wake up MC33774, neither of the two AFEs in the bus chain cannot be awakened (this is determined by measuring whether the VDDC voltage can reach 5V). My current wakeup method is to send one frame of the wakeup frame and then delay for at least 10ms before sending another frame of the wakeup frame. What could be the possible reasons for the inability to wake up normally? Another issue is that after sending the wakeup command, MC33774 did not wake up. However, when I sent a single voltage acquisition instruction, the first MC33774 was awakened, and it responded with the correct voltage value in the DADD=0 state. Is this reasonable? wakeup framewakeup frame AFE_1 responds with data in the DADD=0 stateAFE_1 responds with data in the DADD=0 state MC33774 initialization processMC33774 initialization process Re: MC33774 WAKE UP HI. I tried this method, but with this enumeration method my AFE1 is enumerated as DADD=2, which means that the messages I send with enumerated AFE1 as DADD=1 are ignored or treated as wakeup frames. The time interval between wakeup frame and enumeration frame is set to 10ms, which should meet the 2.4ms in the manual, is it possible that my wakeup frame is sent in the wrong format? Re: MC33774 WAKE UP Hi. You can try: Wake up the first 33774 → write DADD to the first 33774 → wake up the second 33774 → write DADD to the second 33774 → wake up the nth 33774 → write DADD to the nth 33774. the flowchart is shown below:
View full article
S32DSコマンドラインを使用してTCPIPスタックのサンプルをインポート、コードを更新、クリーンビルドする方法 拝啓、 S32DSコマンドラインを使用して、コードのインポート、更新、およびクリーンビルドを実行したい。 RTD のサンプル (Dio_Example_S32K388) は正常に実行できますが、lwip_FreeRTOS_s32k388 のようなスタック内のサンプルは失敗します。 確認を手伝っていただけますか?あるいは、その方法を教えていただけますか? 以下に示すように、S32K388とS32K344のいくつかの例をテストしました。 現在はlwip_FreeRTOS_s32k388のみが失敗しています。 lwip_FreeRTOS_s32k344 は問題ありません。 FreeRTOS_Toggle_Led_Example_S32K388 と FreeRTOS_Toggle_Led_Example_S32K344 は問題ありません。 Dio_Example_S32K388とUart_Example_S32K388は問題ありません。   そして、私の顧客は現在lwip_FreeRTOS_s32k388を使用しているので、この問題を解決する必要があります。   テスト環境: S32DS3.6.3 RTD : S32K3_S32M27x リアルタイム・ドライバ ASR R21-11 バージョン 6.0.0 QLP04 FREERTOS: SW32K3 FreeRTOS 11.1.0バージョン6.0.0 コードドロップ TCPIP スタック: SW32K3_S32M27X_TCPIP_STACK_3.0.0_D2507 ありがとうございます。 BR、 ショーン・ウー Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks こんにちは、 @PavelL さん。 以前そのThreadを読んで、そこに書かれていたコマンドを試してみました。しかし、それでも失敗した。 -HeadlessToolが必要です。そうでない場合、S32DS GUIウィンドウがポップアップ表示されてしまいますが、これはお客様のご要望とは異なります。 lwip_FreeRTOS_s32k344 は私のコマンドで動作しました。 ご提案いただいたコマンドを使用して、lwip_FreeRTOS_s32k388 を試していただけますでしょうか? 私の顧客はlwip_FreeRTOS_s32k388を使用しているため、この問題を解決する必要があります。   ありがとうございます。 BR、 ショーン・ウー Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks こんにちは、 @seanwu さん。 この関連Threadに基づくと: CLIでの設定の読み込みとビルドに失敗しました プロジェクトに合わせて、以下の手順を実行する必要があります(プロジェクトによっては、アップデートが必要になる場合があります)。 -Load %PROJECT_PATH% \ %PROJECT_NAME% .mexで mex をロードします この行は「コードの更新」とは同等ではありません。-HeadlessTool ペリフェラル を削除してください。 -MCU S32K388で MCU を明示的に設定します -SDKVersion PlatformSDK_S32K3 を使用してください。 「コードの更新をクリック」 -ExportAll %PROJECT_PATH% あるいは、デバッグ情報を追加して、-consoleLog オプションで何が起こっているかを確認してください。 つまり、「更新コード」は次のようになります。 .\s32dsc.exe -noSplash ^ -アプリケーション com.nxp.swtools.framework.application ^ --launcher.ini %DS_INSTALL% \eclipse\s32ds.ini ^ -データ%WORKSPACE% ^ -sdkPath %RTD_PATH% ^ -MCU S32K388 ^ -SDKVersion PlatformSDK_S32K3 ^ -Load %PROJECT_PATH% \ %PROJECT_NAME% .mex^ -ExportAll %PROJECT_PATH% サンプルコードlwip_FreeRTOS_s32k344は、デフォルト設定が原因で偶然にしか動作しない場合があります。 よろしくお願いいたします。 パベル Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks こんにちは、 @PavelL さん。 「 tcpip_stack_1」を確認し、tcpip_itm_manifest.xmlに「S32K388」を追加します。 S32DSは「コードの更新」後にフォルダを生成できますが、コマンドラインでは生成できません。 ありがとうございます。 BR、 ショーン・ウー Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks こんにちは、 @seanwu さん。 mexファイルをダブルクリックしてください。「ペリフェラル」アイコンをクリックしてください。これが見えますか? tcpip_stack が表示されず、SDK コンポーネント管理ウィンドウでもスタックが表示されない場合は、このThreadS32K388 tcpip stack 4.0.0 missing lwip folder while compiling で議論されているように、tcpip_itm_manifest.xml を修正してみてください。 よろしくお願いいたします。 パベル Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks こんにちは、 @PavelL さん。 コマンドライン(添付ファイル参照)を使用してlwip_FreeRTOS_s32k388の「コードを更新」しましたが、以下のように「FreeRTOS」 、 「RTD」 、 「stacks」フォルダとフォルダ内のファイルが生成されません(画像はS32DSを使用した「コードの更新」です)。 Re: How to use S32DS command line to import, update code, and cleanbuild the example in TCPIP stacks こんにちは、 @seanwu さん。 インストール設定は正しいようです。 「失敗した」とはどういう意味ですか?ビルドエラーか、TCP/IP機能の問題でしょうか? 私の例であるExample S32K388 GMAC0 lwIP FreeRTOS S32DS 3.6.1 RTD600をご確認ください。変更点の一覧も記載しています。 よろしくお願いいたします。 パベル
View full article
RT1170 EVKB M4 メモリ速度 RT1170 EVKB上でM4コアのメモリアクセスに関するベンチマークテストを実施しています。これらの数値は、M4がボード上のSDRAMとOCRAMにアクセスする際に想定される値ですか?非常に動作が遅いようです。 M4のアクセス時間がAxiファブリックなどの関係で長くなるという情報をいくつか読みましたが、これは非常に遅いように思えます。設定のどこかに何か見落としがあって、必要以上に動作が遅くなっているのでしょうか? このベンチマークにはいくつかの異なるメモリソース/デスティネーションが含まれていますが、私が最も改善したいのはSDRAMとOCRAM間のEDMAです。私は、SDRAM非キャッシュからOCRAM非キャッシュへのM4セットのEDMA転送を行うマルチトラックオーディオストリーミングエンジンを実装しています。M7コアは、共有ocramからバッファを消費します。 しかし、このテストは独立して実施されるため、仲裁は発生しないか、ごくわずかしか発生しないはずです。 SDRAMとOCRAM領域は両方ともキャッシュ不可に設定されており、OCRAM領域はMPUConfigで共有可能にも設定されている、という理解で合っていますか? オーディオストリーマーのコピーベンチマーク、Cortex-M4 @ 400 MHz 操作: 再生 16 x 4096 B SDRAM_NC->OCRAM、記録 8 x 4096 B OCRAM->SDRAM_NC バイト数: 再生=65536 記録=32768 合計=98304   CPU memcpy: 再生コピー              1532202 cyc 3830.505 us レコードコピー                  530291 cyc 1325.727 us 散布図合計                2062493 cyc 5156.232 us シングル96Kバルク              2301811 cyc 5754.527 us チェックサム=239   メモリ領域コピーマトリックス(1行あたり32768バイト): リージョン src: SDRAM_C=80008000 SDRAM_NC=80818000 SHARED=202B8EC0 NCACHE=20248AA0 OCRAM_CACHE=2026E3C0 MPU/キャッシュ: CTRL=0x00000007 TYPE=0x00000800 PSCCR=0x00000003 R4=0x80000004/0x03100033 R5=0x80000005/0x0303002d EDMAは、両方のエンドポイントがキャッシュ不可/DMAセーフの場合にのみ実行されます。 SDRAM_C->OCRAM_CACHE        バイト数=32768、CPU=1201410、サイクル数=3003.525、US=10.90 MB/秒 | edma=スキップ、キャッシュ可能、チェックサム=338 SDRAM_NC->OCRAM_CACHE        バイト数=32768、CPU=1037590、サイクル数2593.975、US値12.63 MB/秒 | edma=スキップ、キャッシュ可能、チェックサム=602 SDRAM_NC->SHARED_OCRAM      バイト=32768 CPU=  781109 cyc 1952.772 us 16.78 MB/s | edma=ok  779805 cyc 1949.512 us 16.80 MB/s checksum=602/602 | edma+cache=ok  858144 cyc 2145.360 us 15.27 MB/s チェックサム=602 SDRAM_NC->NCACHE_OCRAM      バイト=32768 CPU=  777897 cyc 1944.742 us 16.84 MB/s | edma=ok  751101 cyc 1877.752 us 17.45 MB/s checksum=602/602 | edma+cache=ok  853273 cyc 2133.182 us 15.36 MB/s チェックサム=602 OCRAM_CACHE->SDRAM_NC        バイト=32768 CPU=  750396 cyc 1875.990 us 17.46 MB/s | edma=キャッシュ可能チェックサムをスキップ=1204 SHARED_OCRAM->SDRAM_NC      バイト=32768 CPU=  531143 cyc 1327.857 us 24.67 MB/s | edma=ok  570792 cyc 1426.980 us 22.96 MB/s checksum=610/610 | edma+cache=ok  670564 サイクル 1676.410 us 19.54 MB/秒 チェックサム=610 NCACHE_OCRAM->SDRAM_NC      バイト=32768 CPU=  541568 cyc 1353.920 us 24.20 MB/s | edma=ok  549911 cyc 1374.777 us 23.83 MB/s checksum=940/940 | edma+cache=ok  649852 サイクル 1624.630 us 20.16 MB/秒 チェックサム=940 SDRAM_NC->SDRAM_NC          バイト=32768 CPU=  896656 cyc 2241.640 us 14.61 MB/s | edma=ok  997686 cyc 2494.215 us 13.13 MB/s checksum=602/602 | edma+cache=ok  1130798 サイクル 2826.995 us 11.59 MB/秒 チェックサム=602 OCRAM_CACHE->OCRAM_CACHE    バイト=32768 CPU=  768904 cyc 1922.260 us 17.04 MB/s | edma=スキップ キャッシュ可能 チェックサム=1204 SHARED_OCRAM->SHARED_OCRAM  バイト=32768 CPU=  425929 cyc 1064.822 us 30.77 MB/s | edma=ok  433498 cyc 1083.745 us 30.23 MB/s checksum=610/610 | edma+cache=ok  542913 cyc 1357.282 us 24.14 MB/s チェックサム=610   EDMAスキャッター/ギャザー 24 x 4K、Nバイト=4096: ops=24 nbytes=4096 ok=1 ディスクリプタの設定+開始          58942 サイクル 147.355 米ドル 完了するまで待機/エラー        2031292 cyc 5078.230 us 合計                        2090234 cyc 5225.585 us チェックサム=239 チャネルフラグ=0x1 エラーフラグ=0x0 残りの値=0 csr=0x0088 引用元=1 ビット元=1   EDMAスキャッター/ギャザー 24 x 4K、Nバイト=32: ops=24 nbytes=32 ok=1 ディスクリプタの設定+開始          47526サイクル 118.815米ドル 完了するまで待機/エラー        2055017 cyc 5137.542 us 合計                        2102543 cyc 5256.357 us チェックサム=239 チャネルフラグ=0x1 エラーフラグ=0x0 残り=0 csr=0x0088 引用=128 ビット=128   EDMAシングル4K、NBYTES=4096: ops=1 nbytes=4096 ok=1 ディスクリプタの設定+開始          5713サイクル 14.282米国 完了するまで待機/エラー          93592 cyc 233.980 us 合計                          99305 cyc 248.262 us チェックサム=239 チャネルフラグ=0x1 エラーフラグ=0x0 残りの値=0 csr=0x0088 引用元=1 ビット元=1   EDMAシングル4K、NBYTES=32: ops=1 nbytes=32 ok=1 ディスクリプタの設定+開始          5344サイクル 13.360米ドル 完了するまで待機/エラー          94609 cyc 236.522 us 合計                          99953 cyc 249.882 us チェックサム=239 チャネルフラグ=0x1 エラーフラグ=0x0 残り=0 csr=0x0088 引用=128 ビット=128   EDMAシングル96K、NBYTES=4096: ops=1 nbytes=4096 ok=1 ディスクリプタの設定+開始          5867サイクル 14.667米ドル 完了するまで待機/エラー        2230360 cyc 5575.900 us 合計                        2236227 cyc 5590.567 us チェックサム=239 チャネルフラグ=0x1 エラーフラグ=0x0 残りの値=0 csr=0x0088 引用元=24 ビット数=24   EDMAシングル96K、NBYTES=32: ops=1 nbytes=32 ok=1 ディスクリプタの設定+開始          5713サイクル 14.282米国 完了するまで待機/エラー        2256234 cyc 5640.585 us 合計                        2261947 cyc 5654.867 us チェックサム=239 チャネルフラグ=0x1 エラーフラグ=0x0 残りの値=0 csr=0x0088 引用元=3072 ビット元=3072 DMAMUX1_CHCFG[2]=0xa0000000 DMA1_ERQ=0x80 DMA1_ES=0x0 ============================================================ 私のリンカー: /* M4/armgcc/MIMXRT1176xxxxx_cm4_flexspi_nor.ld * ITCM/DTCMホットセクションとSDRAMを備えたM4 XIP-from-FlexSPI * OCRAMパーティション(1MB @ 0x2024_0000): * - 128KB DMAセーフ / デバイス/非キャッシュ : 0x20240000..0x2025FFFF * - 128KB M4 キャッシュ可能なローカルスクラッチ: 0x20260000..0x2027FFFF * - 768KB 共有 (M4<->M7) 非キャッシュ : 0x20280000..0x2033FFFF * - SHARED の最後の 8KB は M7 専用に予約されています: 0x2033E000..0x2033FFFF (M4 リンカー領域には含まれません) * * 追加の固定カーブアウト(両方で共有される領域内、M7 DMA スライスの前): * - M4 用の 36KB 固定共有 SysView/RTT ウィンドウ : 0x20335000..0x2033DFFF * - 共有メイン(IPCなど用):0x20280000..0x20334FFF */ エントリ(リセットハンドラー) HEAP_SIZE = DEFINED(__heap_size __) ? __ heap_size__ : 0x0400; STACK_SIZE = DEFINED(__stack_size __) ? __ stack_size__ : 0x0400; SDRAM_BASE = 0x80000000; SDRAM_SIZE = 0x04000000; /* 64 MB */ SDRAM_C_SIZE = 0x00800000; /* 8 MB キャッシュ可能 */ SDRAM_NC_BASE = SDRAM_BASE + SDRAM_C_SIZE; /* 0x80800000 */ SDRAM_NC_SIZE = SDRAM_SIZE - SDRAM_C_SIZE; /* 56 MB */ M4_FLASH_BASE = 0x33600000; M4_FLASH_SIZE = 0x00A00000; /* OCRAM: 1MB */ OCRAM_BASE = 0x20240000; OCRAM_SIZE = 0x00100000; /* ローカルOCRAM合計 = DMA 128KB + キャッシュ可能なスクラッチ 128KB = 256KB */ OCRAM_LOCAL_TOTAL_SIZE = 0x00040000; /* 256KB */ /* DMAセーフな非キャッシュローカルウィンドウ(最初の128KB) */ OCRAM_DMA_NC_BASE = 0x20240000; OCRAM_DMA_NC_SIZE = 0x00020000; /* 128KB */ /* M4 キャッシュ可能なスクラッチウィンドウ (次の 128KB) */ OCRAM_LOCAL_C_BASE = 0x20260000; OCRAM_LOCAL_C_SIZE = 0x00020000; /* 128KB */ /* 共有OCRAMは0x20280000から開始します(残り768KB)*/ OCRAM_SHARED_BASE = OCRAM_BASE + OCRAM_LOCAL_TOTAL_SIZE; /* 0x20280000 */ OCRAM_SHARED_SIZE_FULL = OCRAM_SIZE - OCRAM_LOCAL_TOTAL_SIZE; /* 0x000C0000 */ /* 共有OCRAMの最後の8KBをM7専用のDMAバッファ用に予約します(M4領域は除外します) */ M7_DMA_OCRAM_BYTES = 0x00002000; /* 8KB */ OCRAM_SHARED_FOR_BOTH_SIZE = OCRAM_SHARED_SIZE_FULL - M7_DMA_OCRAM_BYTES; /* 0x000BE000 */ /* 共有領域(36KB)の末尾にあるM4用のSysView/RTTの切り出しを修正しました*/ SYSVIEW_M4_BYTES = 0x00009000; /* 36KB */ /* 共有メインサイズ(固定36KBウィンドウを除くすべて) */ OCRAM_SHARED_MAIN_SIZE = OCRAM_SHARED_FOR_BOTH_SIZE - SYSVIEW_M4_BYTES; /* 0x000B5000 */ /* SysView M4 ベース (修正済み) */ OCRAM_SYSVIEW_M4_BASE = OCRAM_SHARED_BASE + OCRAM_SHARED_MAIN_SIZE; /* 0x20335000 */ OCRAM_SYSVIEW_M4_SIZE = SYSVIEW_M4_BYTES; /* 0x00009000 */ メモリ { m_interrupts (RX) : ORIGIN = M4_FLASH_BASE、LENGTH = 0x00000400 m_text (RX) : ORIGIN = M4_FLASH_BASE + 0x400、LENGTH = M4_FLASH_SIZE - 0x00000400 m_itcm (RX) : ORIGIN = 0x1FFE0000、LENGTH = 0x00020000 m_dtcm (RW) : ORIGIN = 0x20000000、LENGTH = 0x00020000 /* OCRAMパーティション */ m_ncache_local (RW) : ORIGIN = OCRAM_DMA_NC_BASE、LENGTH = OCRAM_DMA_NC_SIZE m_ocram_cache (RW) : ORIGIN = OCRAM_LOCAL_C_BASE、LENGTH = OCRAM_LOCAL_C_SIZE m_shared_ocram_main (RW) : ORIGIN = OCRAM_SHARED_BASE、LENGTH = OCRAM_SHARED_MAIN_SIZE m_shared_sysview_m4 (RW) : ORIGIN = OCRAM_SYSVIEW_M4_BASE、LENGTH = OCRAM_SYSVIEW_M4_SIZE m_sdram_c (RW) : ORIGIN = SDRAM_BASE、LENGTH = SDRAM_C_SIZE m_sdram_nc (RW) : ORIGIN = SDRAM_NC_BASE、LENGTH = SDRAM_NC_SIZE } セクション { __NCACHE_REGION_START = OCRAM_BASE; __NCACHE_REGION_SIZE = OCRAM_SIZE; __SHARED_OCRAM_START = ORIGIN(m_shared_ocram_main); __SHARED_OCRAM_SIZE = LENGTH(m_shared_ocram_main); __SYSVIEW_M4_BASE = ORIGIN(m_shared_sysview_m4); __SYSVIEW_M4_SIZE = LENGTH(m_shared_sysview_m4); __OCRAM_CACHE_START = ORIGIN(m_ocram_cache); __OCRAM_CACHE_SIZE = LENGTH(m_ocram_cache); .shared_ocram (NOLOAD) : { . = ALIGN(32); __SHARED_OCRAM_START__ = .; *(.shared_ocram*) *(SharedOcram*) . = ALIGN(32); __SHARED_OCRAM_END__ = .; ASSERT((__SHARED_OCRAM_END __ - __ SHARED_OCRAM_START__) <= LENGTH(m_shared_ocram_main), 「shared_ocramセクションが大きすぎます」 } > m_shared_ocram_main .shared_sysview_m4 (NOLOAD) : { . = ALIGN(32); __SYSVIEW_M4_START__ = .; KEEP(*(.shared_sysview_m4)) KEEP(*(.shared_sysview_m4.*)) . = ALIGN(32); __SYSVIEW_M4_END__ = .; ASSERT((__SYSVIEW_M4_END __ - __ SYSVIEW_M4_START__) <= LENGTH(m_shared_sysview_m4), 「shared_sysview_m4 セクションが大きすぎます (最大 36KB)」 } > m_shared_sysview_m4 .ocram_cache (NOLOAD) : { . = ALIGN(32); __OCRAM_CACHE_START__ = .; *(.ocram_cache*) *(OcramCache*) . = ALIGN(32); __OCRAM_CACHE_END__ = .; ASSERT((__OCRAM_CACHE_END __ - __ OCRAM_CACHE_START__) <= LENGTH(m_ocram_cache), 「ocram_cache セクションが大きすぎます」 } > m_ocram_cache .割り込み: { __VECTOR_TABLE = .; __ベクトル = .; . = ALIGN(4); KEEP(*(.isr_vector)) . = ALIGN(4); } > m_interrupts /* ================================================================ * ITCM のホット コード (VMA=ITCM、LMA は後で計算されます) * ======================================================================= */ .itcm_text : AT(__itcm_text_load__) { . = ALIGN(32); __itcm_text_start__ = .; *(.itcm_text*) *(ITCM_TEXT*) /* あなたのホットなTU */ */DspParameterManager.cpp.obj(.text。文章。*) */audio_param_task.cpp.obj(.text。文章。*) */StepSequencer.cpp.obj(.text。文章。*) */sequencer_task.cpp.obj(.text。文章。*) /* MU ISR(複数ユニット割り込みサービスルーチン) - シンボルセクション名別 */ *(.text.MUB_IRQHandler) /* FreeRTOS のホットビット - シンボルセクション名別 */ *(.text.SVC_Handler) *(.text.PendSV_Handler) *(.text.SysTick_Handler) *(.text.vPortEnterCritical) *(.text.vPortExitCritical) *(.text.vPortValidateInterruptPriority) *(.text.xPortStartScheduler) *(.text.vPortSetupTimerInterrupt) *(.text.xTaskIncrementTick) *(.text.vTaskSwitchContext) *(.text.vTaskGenericNotifyGiveFromISR) *(.text.xTaskGenericNotify) *(.text.xQueueGenericSendFromISR) *(.text.xQueueGiveFromISR) . = ALIGN(32); __itcm_text_end__ = .; } > m_itcm /* ================================================================ * DTCMにおけるホットロードデータ(LMAは後日計算) * ======================================================================= */ .dtcm_rodata : AT(__dtcm_rodata_load__) { . = ALIGN(32); __dtcm_rodata_start__ = .; */DspParameterManager.cpp.obj(.rodata.rodata.*) */audio_param_task.cpp.obj(.rodata.rodata.*) */StepSequencer.cpp.obj(.rodata.rodata.*) */sequencer_task.cpp.obj(.rodata.rodata.*) . = ALIGN(32); __dtcm_rodata_end__ = .; } > m_dtcm /* ================================================================ * DTCMにおけるホットデータ(LMAは後日算出) * ======================================================================= */ .dtcm_data : AT(__dtcm_data_load__) { . = ALIGN(32); __dtcm_data_start__ = .; *(.dtcm_data*) *(DTCM_DATA*) . = ALIGN(32); __dtcm_data_end__ = .; } > m_dtcm /* ================================================================ * FLASH XIP TEXT/RODATA (すべて) * ======================================================================= */ 。文章 : { . = ALIGN(4); *(.text .text*) *(.rodata .rodata*) *(.glue_7) *(.glue_7t) *(.eh_frame) KEEP(*(.init)) KEEP(*(.fini)) . = ALIGN(4); } > m_text .ARM.extab : { *(.ARM.extab*.gnu.linkonce.armextab.*)} > m_text Arm : { __exidx_start = .; *(.ARM.exidx*) __exidx_end = .; } > m_text .ctors : { __CTOR_LIST__ = .; KEEP (*crtbegin.o(.ctors)) KEEP (*crtbegin?.o(.ctors)) KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o).ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) __CTOR_END__ = .; } > m_text .dtors : { __DTOR_LIST__ = .; KEEP (*crtbegin.o(.dtors)) KEEP (*crtbegin?.o(.dtors)) KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o).dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) __DTOR_END__ = .; } > m_text .preinit_array : { PROVIDE_HIDDEN (__preinit_array_start = .); KEEP (*(.preinit_array*)) PROVIDE_HIDDEN (__preinit_array_end = .); } > m_text .init_array : { PROVIDE_HIDDEN (__init_array_start = .); KEEP (*(SORT(.init_array.*))) KEEP (*(.init_array*)) PROVIDE_HIDDEN (__init_array_end = .); } > m_text .fini_array : { PROVIDE_HIDDEN (__fini_array_start = .); KEEP (*(SORT(.fini_array.*))) KEEP (*(.fini_array*)) PROVIDE_HIDDEN (__fini_array_end = .); } > m_text /* ================================================================ * 重大な修正: * 上記のすべての flash-resident セクションの後に load-images を開始してください。 * この時点で、「.」はFlashコンテンツの本当の終わりです。 * ======================================================================= */ __DATA_ROM = .; __itcm_text_load __ = __ DATA_ROM; __dtcm_rodata_load __ = __ itcm_text_load__ + SIZEOF(.itcm_text); __dtcm_data_load __ = __ dtcm_rodata_load__ + SIZEOF(.dtcm_rodata); /* NXP の起動時に .data が期待されますLMA at __etext */ __etext = __ dtcm_data_load__ + SIZEOF(.dtcm_data); .data : AT(__etext) { . = ALIGN(4); __DATA_RAM = .; __data_start__ = .; *(。データ) *(。データ*) *(データクイックアクセス) KEEP(*(.jcr*)) . = ALIGN(4); __data_end__ = .; } > m_dtcm __NDATA_ROM = __etext + (__データ終了__ - __データ開始__); .ncache.init : AT(__NDATA_ROM) { __noncachedata_start__ = .; *(NonCacheable.init) . = ALIGN(4); __noncachedata_init_end__ = .; } > m_ncache_local .ncache (NOLOAD) : { (キャッシュ不可) . = ALIGN(4); __noncachedata_end__ = .; } > m_ncache_local .bss (NOLOAD) : { . = ALIGN(4); __bss_start__ = .; *(.bss) *(.bss*) *(一般) . = ALIGN(4); __bss_end__ = .; } > m_dtcm .dtcm_bss (NOLOAD) : { . = ALIGN(32); __dtcm_bss_start__ = .; *(.dtcm_bss*) *(DTCM_BSS*) . = ALIGN(32); __dtcm_bss_end__ = .; } > m_dtcm __SDRAM_C_DATA_ROM = __NDATA_ROM + (__noncachedata_init_end __ - __ noncachedata_start__); .sdram_c_data : AT(__SDRAM_C_DATA_ROM) { . = ALIGN(32); __sdram_c_data_start__ = .; *(.sdram_c_data*) *(SDRAM_C_DATA*) . = ALIGN(32); __sdram_c_data_end__ = .; } > m_sdram_c __sdram_c_data_load __ = __ SDRAM_C_DATA_ROM; .sdram_c_bss (NOLOAD) : { . = ALIGN(32); __sdram_c_bss_start__ = .; *(.sdram_c_bss*) *(SDRAM_C_BSS*) . = ALIGN(32); __sdram_c_bss_end__ = .; } > m_sdram_c .sdram_nc_bss (NOLOAD) : { . = ALIGN(32); __sdram_nc_bss_start__ = .; *(.sdram_nc_bss*) *(SDRAM_NC_BSS*) . = ALIGN(32); __sdram_nc_bss_end__ = .; } > m_sdram_nc .heap : { . = ALIGN(8); __end__ = .; PROVIDE(end = .); __HeapBase = .; . += HEAP_SIZE; __HeapLimit = .; __heap_limit = .; } > m_dtcm .stack : { . = ALIGN(8); . += STACK_SIZE; __StackEnd = .; } > m_dtcm __StackTop = ORIGIN(m_dtcm) + LENGTH(m_dtcm); __StackLimit = __ StackTop - STACK_SIZE; PROVIDE( __stack = __ StackTop); .ARM.attributes 0 : { *(.ARM.attributes)} __SDRAM_BASE = SDRAM_BASE; __SDRAM_SIZE = SDRAM_SIZE; __SDRAM_C_BASE = SDRAM_BASE; __SDRAM_C_SIZE = SDRAM_C_SIZE; __SDRAM_NC_BASE = SDRAM_NC_BASE; __SDRAM_NC_SIZE = SDRAM_NC_SIZE; } MPU設定: /* -------------------------------------------------------------------------- */ /* CM7 MPU 設定 */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 7 void BOARD_ConfigMPU ( void ) { #if defined ( __ICCARM__ ) || defined ( __GNUC__ ) extern uint32_t __NCACHE_REGION_START [] ; extern uint32_t __NCACHE_REGION_SIZE [] ; uint32_t nonCacheStart = ( uint32_t )__NCACHE_REGION_START; uint32_t size = ( uint32_t )__NCACHE_REGION_SIZE; #それ以外 uint32_t nonCacheStart = OCRAM_BASE_EXPECTED; uint32_t size = OCRAM_SIZE_EXPECTED; #endif ( void )nonCacheStart; ( void )size; #if defined (__ICACHE_PRESENT) && __ICACHE_PRESENT if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB -> CCR )) { SCB_DisableICache (); } #endif #if defined (__DCACHE_PRESENT) && __DCACHE_PRESENT if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB -> CCR )) { SCB_DisableDCache (); } #endif ARM_MPU_Disable (); /* リージョン 0: 全て拒否 (投機的プリフェッチの回避策) */ MPU -> RBAR = ARM_MPU_RBAR ( 0 , 0x00000000U ); MPU -> RASR = ARM_MPU_RASR ( 1 , ARM_MPU_AP_NONE, 0 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_4GB); /* リージョン 1: デバイス、共有不可、キャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 1 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512MB); /* リージョン 2: デバイス、共有不可、キャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 2 , 0x60000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512MB); /* リージョン 3: デバイス、共有不可、キャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 3 , 0x00000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_1GB); /* リージョン 4: ノーマル、WB */ MPU -> RBAR = ARM_MPU_RBAR ( 4 , 0x00000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_256KB); /* リージョン 5: ノーマル、WB */ MPU -> RBAR = ARM_MPU_RBAR ( 5 , 0x20000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_256KB); /* CM7 の OCRAM: 通常 + 共有可能 + キャッシュ不可 (TEX=1,S=1,C=0,B=0) */ /* 領域 6: 0x20240000..0x2027FFFF (256KB) */ MPU -> RBAR = ARM_MPU_RBAR ( 6 , 0x20240000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_256KB); /* 領域 7: 0x20280000..0x202FFFFF (512KB) */ MPU -> RBAR = ARM_MPU_RBAR ( 7 , 0x20280000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512KB); /* 領域 10: 0x20300000..0x2033FFFF (256KB) */ MPU -> RBAR = ARM_MPU_RBAR ( 10 , 0x20300000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_256KB); #if USE_SDRAM /* 領域 11: SDRAM デフォルトの非キャッシュ可能 64MB (通常の非キャッシュ) */ MPU -> RBAR = ARM_MPU_RBAR ( 11 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_64MB); #if defined (CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH /* リージョン 12: 最初の 8MB をキャッシュ可能 (WT) としてオーバーレイする */ MPU -> RBAR = ARM_MPU_RBAR ( 12 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 0 , 0 , ARM_MPU_REGION_SIZE_8MB); #それ以外 /* リージョン 12: 最初の 8MB をキャッシュ可能 (WB) としてオーバーレイする */ MPU -> RBAR = ARM_MPU_RBAR ( 12 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_8MB); #endif #endif /* USE_SDRAM */ #if defined (XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1 ) /* リージョン 8: XIP 外部フラッシュ、読み取り専用、キャッシュ可能な WB、64MB 全体をカバー */ MPU -> RBAR = ARM_MPU_RBAR ( 8 , 0x30000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_RO, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_64MB); #endif /* ペリフェラル ウィンドウ */ MPU -> RBAR = ARM_MPU_RBAR ( 13 , 0x40000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_16MB); MPU -> RBAR = ARM_MPU_RBAR ( 14 , 0x41000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_2MB); MPU -> RBAR = ARM_MPU_RBAR ( 15 , 0x41400000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_1MB); ARM_MPU_Enable (MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); #if defined (__DCACHE_PRESENT) && __DCACHE_PRESENT SCB_EnableDCache (); #endif #if defined (__ICACHE_PRESENT) && __ICACHE_PRESENT SCB_EnableICache (); #endif } #endif /* __CORTEX_M == 7 */ /* -------------------------------------------------------------------------- */ /* CM4 MPU 設定 */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 4 void BOARD_ConfigMPU ( void ) { /* ---- コードバスキャッシュ (LMEM) を無効にする ---- */ if ( LMEM_PCCCR_ENCACHE_MASK == ( LMEM_PCCCR_ENCACHE_MASK & LMEM -> PCCCR )) { LMEM -> PCCCR |= LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_GO_MASK ; while (( LMEM -> PCCCR & LMEM_PCCCR_GO_MASK ) != 0U ) {} LMEM -> PCCCR &= ~ ( LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK ); LMEM -> PCCCR &= ~ LMEM_PCCCR_ENCACHE_MASK ; } /* ---- システムバスキャッシュ (LMEM) を無効にする ---- */ if ( LMEM_PSCCR_ENCACHE_MASK == ( LMEM_PSCCR_ENCACHE_MASK & LMEM -> PSCCR )) { LMEM -> PSCCR |= LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_GO_MASK ; while (( LMEM -> PSCCR & LMEM_PSCCR_GO_MASK ) != 0U ) {} LMEM -> PSCCR &= ~ ( LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK ); LMEM -> PSCCR &= ~ LMEM_PSCCR_ENCACHE_MASK ; } ARM_MPU_Disable (); /* 領域 0: 0x20240000..0x2025FFFF (128KB) DMA -> デバイス/非キャッシュ。 * 元の属性はここに保持します: UART/SPI/SD DMA バッファはここに存在します * ウィンドウがあり、CM4 LMEM で実証済みの非キャッシュ動作が必要です。*/ MPU -> RBAR = ARM_MPU_RBAR ( 0 , OCRAM_DMA_NC_BASE ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL , 0 、 1 、 /*共有推奨*/ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_128KB ); /* 領域 1: 0x20260000..0x2027FFFF (128KB) ローカルスクラッチ -> 通常の WB キャッシュ可能 */ MPU -> RBAR = ARM_MPU_RBAR ( 1 , OCRAM_LOCAL_C_BASE ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL , 0 、 /* 通常 */ 0 、 /* 共有不可 */ 1 、 /* キャッシュ可能 */ 1 、 /* バッファリング可能 (WB) */ 0 、 ARM_MPU_REGION_SIZE_128KB ); /* 領域 2: 0x20280000..0x202FFFFF (512KB) 共有 -> 元の非キャッシュ属性 */ MPU -> RBAR = ARM_MPU_RBAR ( 2 , 0x20280000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL , 0 、 1 、 /* 共有可能 */ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_512KB ); /* 領域 3: 0x20300000..0x2033FFFF (256KB) 共有 -> 元の非キャッシュ属性 */ MPU -> RBAR = ARM_MPU_RBAR ( 3 , 0x20300000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL , 0 、 1 、 /* 共有可能 */ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_256KB ); #if USE_SDRAM /* リンカー分割: * m_sdram_c = 0x80000000..0x807FFFFF (8MB) * m_sdram_nc = 0x80800000..0x83FFFFFF (56MB) * * MPUは56MBを直接表現できないため、領域4で64MB全体を構成する。 * SDRAM ウィンドウ デバイス/非キャッシュおよび領域 5 は最初の 8MB をオーバーレイします * キャッシュ可能。番号の大きいMPU領域が優先されます。*/ ( void ) SDRAM_NC_BASE ; ( void ) SDRAM_NC_SIZE ; /* 領域 4: フル SDRAM デフォルト、0x80000000..0x83FFFFFF -> デバイス/非キャッシュ */ MPU -> RBAR = ARM_MPU_RBAR ( 4 , SDRAM_BASE_EXPECTED ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL , 2 、 /* デバイス */ 0 、 /* 共有不可 */ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_64MB ); #if defined (CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH /* 領域 5: リンカー m_sdram_c、0x80000000..0x807FFFFF -> 通常のライトスルー */ MPU -> RBAR = ARM_MPU_RBAR ( 5 , SDRAM_C_BASE); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 、 /* 通常 */ 0 、 /* 共有不可 */ 1 、 /* キャッシュ可能 */ 0 、 /* ライトスルー */ 0 、 ARM_MPU_REGION_SIZE_8MB); #それ以外 /* 領域 5: リンカー m_sdram_c、0x80000000..0x807FFFFF -> 通常のライトバック */ MPU -> RBAR = ARM_MPU_RBAR ( 5 , SDRAM_C_BASE ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL , 0 、 /* 通常 */ 0 、 /* 共有不可 */ 1 、 /* キャッシュ可能 */ 1 、 /* ライトバック */ 0 、 ARM_MPU_REGION_SIZE_8MB ); #endif #endif /* USE_SDRAM */ ARM_MPU_Enable ( MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk ); /* システムバスキャッシュ (PSCCR) を無効化および有効化します */ LMEM -> PSCCR |= LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK | LMEM_PSCCR_GO_MASK ; while (( LMEM -> PSCCR & LMEM_PSCCR_GO_MASK ) != 0U ) {} LMEM -> PSCCR &= ~ ( LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK ); LMEM -> PSCCR |= LMEM_PSCCR_ENCACHE_MASK ; /* コードバスキャッシュ(PCCCR)を無効化および有効化する */ LMEM -> PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK ; while (( LMEM -> PCCCR & LMEM_PCCCR_GO_MASK ) != 0U ) {} LMEM -> PCCCR &= ~ ( LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK ); LMEM -> PCCCR |= LMEM_PCCCR_ENCACHE_MASK ; } #endif /* __CORTEX_M == 4 */ 私も同様の結果で試してみましたが、キャッシュ不可能なOCRAMからキャッシュ不可能なSDRAMへDMAを使用して書き込む際に、チェックサムの不一致が発生しました。 #if __CORTEX_M == 7 void BOARD_ConfigMPU ( void ) { #if defined ( __ICCARM__ ) || defined ( __GNUC__ ) extern uint32_t __NCACHE_REGION_START [] ; extern uint32_t __NCACHE_REGION_SIZE [] ; uint32_t nonCacheStart = ( uint32_t )__NCACHE_REGION_START; uint32_t size = ( uint32_t )__NCACHE_REGION_SIZE; #それ以外 uint32_t nonCacheStart = OCRAM_BASE_EXPECTED; uint32_t size = OCRAM_SIZE_EXPECTED; #endif ( void )nonCacheStart; ( void )size; #if defined (__ICACHE_PRESENT) && __ICACHE_PRESENT if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB -> CCR )) { SCB_DisableICache (); } #endif #if defined (__DCACHE_PRESENT) && __DCACHE_PRESENT if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB -> CCR )) { SCB_DisableDCache (); } #endif ARM_MPU_Disable (); /* リージョン 0: 全て拒否 (投機的プリフェッチの回避策) */ MPU -> RBAR = ARM_MPU_RBAR ( 0 , 0x00000000U ); MPU -> RASR = ARM_MPU_RASR ( 1 , ARM_MPU_AP_NONE, 0 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_4GB); /* リージョン 1: デバイス、共有不可、キャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 1 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512MB); /* リージョン 2: デバイス、共有不可、キャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 2 , 0x60000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512MB); /* リージョン 3: デバイス、共有不可、キャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 3 , 0x00000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_1GB); /* リージョン 4: ノーマル、WB */ MPU -> RBAR = ARM_MPU_RBAR ( 4 , 0x00000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_256KB); /* リージョン 5: ノーマル、WB */ MPU -> RBAR = ARM_MPU_RBAR ( 5 , 0x20000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_256KB); /* CM7 の OCRAM: 通常 + 共有可能 + キャッシュ不可 (TEX=1,S=1,C=0,B=0) */ /* 領域 6: 0x20240000..0x2027FFFF (256KB) */ MPU -> RBAR = ARM_MPU_RBAR ( 6 , 0x20240000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_256KB); /* 領域 7: 0x20280000..0x202FFFFF (512KB) */ MPU -> RBAR = ARM_MPU_RBAR ( 7 , 0x20280000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_512KB); /* 領域 10: 0x20300000..0x2033FFFF (256KB) */ MPU -> RBAR = ARM_MPU_RBAR ( 10 , 0x20300000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 1 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_256KB); #if USE_SDRAM /* 領域 11: SDRAM デフォルトの非キャッシュ可能 64MB (通常の非キャッシュ) */ MPU -> RBAR = ARM_MPU_RBAR ( 11 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 1 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_64MB); #if defined (CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH /* リージョン 12: 最初の 8MB をキャッシュ可能 (WT) としてオーバーレイする */ MPU -> RBAR = ARM_MPU_RBAR ( 12 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 0 , 0 , ARM_MPU_REGION_SIZE_8MB); #それ以外 /* リージョン 12: 最初の 8MB をキャッシュ可能 (WB) としてオーバーレイする */ MPU -> RBAR = ARM_MPU_RBAR ( 12 , 0x80000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_8MB); #endif #endif /* USE_SDRAM */ #if defined (XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1 ) /* リージョン 8: XIP 外部フラッシュ、読み取り専用、キャッシュ可能な WB、64MB 全体をカバー */ MPU -> RBAR = ARM_MPU_RBAR ( 8 , 0x30000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_RO, 0 , 0 , 1 , 1 , 0 , ARM_MPU_REGION_SIZE_64MB); #endif /* ペリフェラル ウィンドウ */ MPU -> RBAR = ARM_MPU_RBAR ( 13 , 0x40000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_16MB); MPU -> RBAR = ARM_MPU_RBAR ( 14 , 0x41000000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_2MB); MPU -> RBAR = ARM_MPU_RBAR ( 15 , 0x41400000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 2 , 0 , 0 , 0 , 0 , ARM_MPU_REGION_SIZE_1MB); ARM_MPU_Enable (MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); #if defined (__DCACHE_PRESENT) && __DCACHE_PRESENT SCB_EnableDCache (); #endif #if defined (__ICACHE_PRESENT) && __ICACHE_PRESENT SCB_EnableICache (); #endif } #endif /* __CORTEX_M == 7 */ /* -------------------------------------------------------------------------- */ /* CM4 MPU 設定 */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 4 void BOARD_ConfigMPU ( void ) { /* ---- コードバスキャッシュ (LMEM) を無効にする ---- */ if (LMEM_PCCCR_ENCACHE_MASK == (LMEM_PCCCR_ENCACHE_MASK & LMEM -> PCCCR )) { LMEM -> PCCCR |= LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_GO_MASK; while (( LMEM -> PCCCR & LMEM_PCCCR_GO_MASK) != 0U ) {} LMEM -> PCCCR &= ~ (LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK); LMEM -> PCCCR &= ~ LMEM_PCCCR_ENCACHE_MASK; } /* ---- システムバスキャッシュ (LMEM) を無効にする ---- */ if (LMEM_PSCCR_ENCACHE_MASK == (LMEM_PSCCR_ENCACHE_MASK & LMEM -> PSCCR )) { LMEM -> PSCCR |= LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_GO_MASK; while (( LMEM -> PSCCR & LMEM_PSCCR_GO_MASK) != 0U ) {} LMEM -> PSCCR &= ~ (LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK); LMEM -> PSCCR &= ~ LMEM_PSCCR_ENCACHE_MASK; } ARM_MPU_Disable (); /* 領域 0: 0x20240000..0x2025FFFF (128KB) DMA -> 通常のキャッシュ不可 */ MPU -> RBAR = ARM_MPU_RBAR ( 0 , OCRAM_DMA_NC_BASE); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 、 /* 通常 */ 1 、 /*共有推奨*/ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_128KB); /* 領域 1: 0x20260000..0x2027FFFF (128KB) ローカルスクラッチ -> 通常の WB キャッシュ可能 */ MPU -> RBAR = ARM_MPU_RBAR ( 1 , OCRAM_LOCAL_C_BASE); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 、 /* 通常 */ 0 、 /* 共有不可 */ 1 、 /* キャッシュ可能 */ 1 、 /* バッファリング可能 (WB) */ 0 、 ARM_MPU_REGION_SIZE_128KB); /* 領域 2: 0x20280000..0x202FFFFF (512KB) 共有 -> 通常 (共有可能) */ MPU -> RBAR = ARM_MPU_RBAR ( 2 , 0x20280000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 、 /* 通常 */ 1 、 /* 共有可能 */ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_512KB); /* 領域 3: 0x20300000..0x2033FFFF (256KB) 共有 -> 通常 (共有可能) */ MPU -> RBAR = ARM_MPU_RBAR ( 3 , 0x20300000U ); MPU -> RASR = ARM_MPU_RASR ( 0 , ARM_MPU_AP_FULL, 0 、 /* 通常 */ 1 、 /* 共有可能 */ 0 、 /* キャッシュ不可 */ 0 、 0 、 ARM_MPU_REGION_SIZE_256KB); ARM_MPU_Enable (MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); /* システムバスキャッシュ (PSCCR) を無効化および有効化します */ LMEM -> PSCCR |= LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK | LMEM_PSCCR_GO_MASK; while (( LMEM -> PSCCR & LMEM_PSCCR_GO_MASK) != 0U ) {} LMEM -> PSCCR &= ~ (LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK); LMEM -> PSCCR |= LMEM_PSCCR_ENCACHE_MASK; /* コードバスキャッシュ(PCCCR)を無効化および有効化する */ LMEM -> PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK; while (( LMEM -> PCCCR & LMEM_PCCCR_GO_MASK) != 0U ) {} LMEM -> PCCCR &= ~ (LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK); LMEM -> PCCCR |= LMEM_PCCCR_ENCACHE_MASK; } #endif /* __CORTEX_M == 4 */ 評価ボード Re: RT1170 EVKB M4 memory speed こんにちは、 @cyberhelmer さん。 NXP MIMXRTシリーズにご関心をお寄せいただきありがとうございます! NXPはRT1050に基づいたテスト結果を提供した。このアプリケーションノートと関連ソフトウェアは、以下のリンクからご覧いただけます。https: //www.nxp.com/docs/en/application-note/AN12437.pdf https://www.nxp.com/products/i.MX-RT1050 簡単な比較を行ったところ、SDRAM書き込みテスト中にANSWは以下の設定を使用していることがわかりました。通常のメモリ特性、純粋な32ビットシーケンシャル書き込み、書き込み後のDSB。 該当する実験を実施する際には、このANSWを参照することをお勧めします。 よろしくお願いします、 ギャビン
View full article
RT1170 EVKB M4 memory speed I'm doing some benchmarks for M4 core memory access on the RT1170 evkb. Are these numbers expected when the M4 accesses sdram and ocram on the board? It seems extremely slow.  I have read some information on longer access times for M4 because of the axi fabric etc but this seem very slow. Have I missed something in my configs somewhere making it slower than neccesary?  The benchmark includes a few different memory sources/destinations but what I'm most interested in improving is edma between sdram and ocram. I'm implementing a multi track audio streaming engine where M4 sets of edma transfers from sdram non cacheable to ocram non cacheable. The M7 core then consumes buffers from shared ocram.  But the test is run freestanding and there should be none or very little arbitration happeningen.  Both sdram and the ocram regions are set non cacheable, ocram region is also set sharable in MPUConfig, if I'm not misstaken?  Audio streamer copy benchmark, Cortex-M4 @ 400 MHz ops: playback 16 x 4096 B SDRAM_NC->OCRAM, record 8 x 4096 B OCRAM->SDRAM_NC bytes: playback=65536 record=32768 total=98304   CPU memcpy: playback copies               1532202 cyc 3830.505 us record copies                  530291 cyc 1325.727 us scatter total                 2062493 cyc 5156.232 us single 96K bulk               2301811 cyc 5754.527 us checksum=239   Memory region copy matrix (32768 B per row): regions src: SDRAM_C=80008000 SDRAM_NC=80818000 SHARED=202B8EC0 NCACHE=20248AA0 OCRAM_CACHE=2026E3C0 MPU/cache: CTRL=0x00000007 TYPE=0x00000800 PSCCR=0x00000003 R4=0x80000004/0x03100033 R5=0x80000005/0x0303002d EDMA is only run when both endpoints are non-cacheable/DMA-safe. SDRAM_C->OCRAM_CACHE         bytes=32768 cpu= 1201410 cyc 3003.525 us 10.90 MB/s | edma=skip cacheable checksum=338 SDRAM_NC->OCRAM_CACHE        bytes=32768 cpu= 1037590 cyc 2593.975 us 12.63 MB/s | edma=skip cacheable checksum=602 SDRAM_NC->SHARED_OCRAM       bytes=32768 cpu=  781109 cyc 1952.772 us 16.78 MB/s | edma=ok   779805 cyc 1949.512 us 16.80 MB/s checksum=602/602 | edma+cache=ok   858144 cyc 2145.360 us 15.27 MB/s checksum=602 SDRAM_NC->NCACHE_OCRAM       bytes=32768 cpu=  777897 cyc 1944.742 us 16.84 MB/s | edma=ok   751101 cyc 1877.752 us 17.45 MB/s checksum=602/602 | edma+cache=ok   853273 cyc 2133.182 us 15.36 MB/s checksum=602 OCRAM_CACHE->SDRAM_NC        bytes=32768 cpu=  750396 cyc 1875.990 us 17.46 MB/s | edma=skip cacheable checksum=1204 SHARED_OCRAM->SDRAM_NC       bytes=32768 cpu=  531143 cyc 1327.857 us 24.67 MB/s | edma=ok   570792 cyc 1426.980 us 22.96 MB/s checksum=610/610 | edma+cache=ok   670564 cyc 1676.410 us 19.54 MB/s checksum=610 NCACHE_OCRAM->SDRAM_NC       bytes=32768 cpu=  541568 cyc 1353.920 us 24.20 MB/s | edma=ok   549911 cyc 1374.777 us 23.83 MB/s checksum=940/940 | edma+cache=ok   649852 cyc 1624.630 us 20.16 MB/s checksum=940 SDRAM_NC->SDRAM_NC           bytes=32768 cpu=  896656 cyc 2241.640 us 14.61 MB/s | edma=ok   997686 cyc 2494.215 us 13.13 MB/s checksum=602/602 | edma+cache=ok  1130798 cyc 2826.995 us 11.59 MB/s checksum=602 OCRAM_CACHE->OCRAM_CACHE     bytes=32768 cpu=  768904 cyc 1922.260 us 17.04 MB/s | edma=skip cacheable checksum=1204 SHARED_OCRAM->SHARED_OCRAM   bytes=32768 cpu=  425929 cyc 1064.822 us 30.77 MB/s | edma=ok   433498 cyc 1083.745 us 30.23 MB/s checksum=610/610 | edma+cache=ok   542913 cyc 1357.282 us 24.14 MB/s checksum=610   EDMA scatter/gather 24 x 4K, NBYTES=4096: ops=24 nbytes=4096 ok=1 descriptor setup+start          58942 cyc 147.355 us wait until done/error         2031292 cyc 5078.230 us total                         2090234 cyc 5225.585 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=1 biter=1   EDMA scatter/gather 24 x 4K, NBYTES=32: ops=24 nbytes=32 ok=1 descriptor setup+start          47526 cyc 118.815 us wait until done/error         2055017 cyc 5137.542 us total                         2102543 cyc 5256.357 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=128 biter=128   EDMA single 4K, NBYTES=4096: ops=1 nbytes=4096 ok=1 descriptor setup+start           5713 cyc 14.282 us wait until done/error           93592 cyc 233.980 us total                           99305 cyc 248.262 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=1 biter=1   EDMA single 4K, NBYTES=32: ops=1 nbytes=32 ok=1 descriptor setup+start           5344 cyc 13.360 us wait until done/error           94609 cyc 236.522 us total                           99953 cyc 249.882 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=128 biter=128   EDMA single 96K, NBYTES=4096: ops=1 nbytes=4096 ok=1 descriptor setup+start           5867 cyc 14.667 us wait until done/error         2230360 cyc 5575.900 us total                         2236227 cyc 5590.567 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=24 biter=24   EDMA single 96K, NBYTES=32: ops=1 nbytes=32 ok=1 descriptor setup+start           5713 cyc 14.282 us wait until done/error         2256234 cyc 5640.585 us total                         2261947 cyc 5654.867 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=3072 biter=3072 DMAMUX1_CHCFG[2]=0xa0000000 DMA1_ERQ=0x80 DMA1_ES=0x0 ============================================================ My linker: /* M4/armgcc/MIMXRT1176xxxxx_cm4_flexspi_nor.ld * M4 XIP-from-FlexSPI with ITCM/DTCM hot sections + SDRAM * OCRAM partition (1MB @ 0x2024_0000): * - 128KB DMA-safe / Device/non-cache : 0x20240000..0x2025FFFF * - 128KB M4 cacheable local scratch : 0x20260000..0x2027FFFF * - 768KB SHARED (M4<->M7) non-cache : 0x20280000..0x2033FFFF * - LAST 8KB of SHARED reserved for M7-only : 0x2033E000..0x2033FFFF (NOT in M4 linker region) * * Additional fixed carve-out (within shared-for-both, before M7 DMA slice): * - 36KB fixed SHARED SysView/RTT window for M4 : 0x20335000..0x2033DFFF * - Shared main (for IPC etc) : 0x20280000..0x20334FFF */ ENTRY(Reset_Handler) HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400; SDRAM_BASE = 0x80000000; SDRAM_SIZE = 0x04000000; /* 64 MB */ SDRAM_C_SIZE = 0x00800000; /* 8 MB cacheable */ SDRAM_NC_BASE = SDRAM_BASE + SDRAM_C_SIZE; /* 0x80800000 */ SDRAM_NC_SIZE = SDRAM_SIZE - SDRAM_C_SIZE; /* 56 MB */ M4_FLASH_BASE = 0x33600000; M4_FLASH_SIZE = 0x00A00000; /* OCRAM: 1MB */ OCRAM_BASE = 0x20240000; OCRAM_SIZE = 0x00100000; /* Local OCRAM total = DMA 128KB + cacheable scratch 128KB = 256KB */ OCRAM_LOCAL_TOTAL_SIZE = 0x00040000; /* 256KB */ /* DMA-safe non-cache local window (first 128KB) */ OCRAM_DMA_NC_BASE = 0x20240000; OCRAM_DMA_NC_SIZE = 0x00020000; /* 128KB */ /* M4 cacheable scratch window (next 128KB) */ OCRAM_LOCAL_C_BASE = 0x20260000; OCRAM_LOCAL_C_SIZE = 0x00020000; /* 128KB */ /* Shared OCRAM starts at 0x20280000 (rest = 768KB) */ OCRAM_SHARED_BASE = OCRAM_BASE + OCRAM_LOCAL_TOTAL_SIZE; /* 0x20280000 */ OCRAM_SHARED_SIZE_FULL = OCRAM_SIZE - OCRAM_LOCAL_TOTAL_SIZE; /* 0x000C0000 */ /* Reserve LAST 8KB of shared OCRAM for M7-only DMA buffers (exclude from M4 region) */ M7_DMA_OCRAM_BYTES = 0x00002000; /* 8KB */ OCRAM_SHARED_FOR_BOTH_SIZE = OCRAM_SHARED_SIZE_FULL - M7_DMA_OCRAM_BYTES; /* 0x000BE000 */ /* Fixed SysView/RTT carve-out for M4 at end of shared-for-both (36KB) */ SYSVIEW_M4_BYTES = 0x00009000; /* 36KB */ /* Shared main size (everything except the fixed 36KB window) */ OCRAM_SHARED_MAIN_SIZE = OCRAM_SHARED_FOR_BOTH_SIZE - SYSVIEW_M4_BYTES; /* 0x000B5000 */ /* SysView M4 base (fixed) */ OCRAM_SYSVIEW_M4_BASE = OCRAM_SHARED_BASE + OCRAM_SHARED_MAIN_SIZE; /* 0x20335000 */ OCRAM_SYSVIEW_M4_SIZE = SYSVIEW_M4_BYTES; /* 0x00009000 */ MEMORY { m_interrupts (RX) : ORIGIN = M4_FLASH_BASE, LENGTH = 0x00000400 m_text (RX) : ORIGIN = M4_FLASH_BASE + 0x400, LENGTH = M4_FLASH_SIZE - 0x00000400 m_itcm (RX) : ORIGIN = 0x1FFE0000, LENGTH = 0x00020000 m_dtcm (RW) : ORIGIN = 0x20000000, LENGTH = 0x00020000 /* OCRAM partition */ m_ncache_local (RW) : ORIGIN = OCRAM_DMA_NC_BASE, LENGTH = OCRAM_DMA_NC_SIZE m_ocram_cache (RW) : ORIGIN = OCRAM_LOCAL_C_BASE, LENGTH = OCRAM_LOCAL_C_SIZE m_shared_ocram_main (RW) : ORIGIN = OCRAM_SHARED_BASE, LENGTH = OCRAM_SHARED_MAIN_SIZE m_shared_sysview_m4 (RW) : ORIGIN = OCRAM_SYSVIEW_M4_BASE, LENGTH = OCRAM_SYSVIEW_M4_SIZE m_sdram_c (RW) : ORIGIN = SDRAM_BASE, LENGTH = SDRAM_C_SIZE m_sdram_nc (RW) : ORIGIN = SDRAM_NC_BASE, LENGTH = SDRAM_NC_SIZE } SECTIONS { __NCACHE_REGION_START = OCRAM_BASE; __NCACHE_REGION_SIZE = OCRAM_SIZE; __SHARED_OCRAM_START = ORIGIN(m_shared_ocram_main); __SHARED_OCRAM_SIZE = LENGTH(m_shared_ocram_main); __SYSVIEW_M4_BASE = ORIGIN(m_shared_sysview_m4); __SYSVIEW_M4_SIZE = LENGTH(m_shared_sysview_m4); __OCRAM_CACHE_START = ORIGIN(m_ocram_cache); __OCRAM_CACHE_SIZE = LENGTH(m_ocram_cache); .shared_ocram (NOLOAD) : { . = ALIGN(32); __SHARED_OCRAM_START__ = .; *(.shared_ocram*) *(SharedOcram*) . = ALIGN(32); __SHARED_OCRAM_END__ = .; ASSERT((__SHARED_OCRAM_END__ - __SHARED_OCRAM_START__) <= LENGTH(m_shared_ocram_main), "shared_ocram section too large"); } > m_shared_ocram_main .shared_sysview_m4 (NOLOAD) : { . = ALIGN(32); __SYSVIEW_M4_START__ = .; KEEP(*(.shared_sysview_m4)) KEEP(*(.shared_sysview_m4.*)) . = ALIGN(32); __SYSVIEW_M4_END__ = .; ASSERT((__SYSVIEW_M4_END__ - __SYSVIEW_M4_START__) <= LENGTH(m_shared_sysview_m4), "shared_sysview_m4 section too large (max 36KB)"); } > m_shared_sysview_m4 .ocram_cache (NOLOAD) : { . = ALIGN(32); __OCRAM_CACHE_START__ = .; *(.ocram_cache*) *(OcramCache*) . = ALIGN(32); __OCRAM_CACHE_END__ = .; ASSERT((__OCRAM_CACHE_END__ - __OCRAM_CACHE_START__) <= LENGTH(m_ocram_cache), "ocram_cache section too large"); } > m_ocram_cache .interrupts : { __VECTOR_TABLE = .; __Vectors = .; . = ALIGN(4); KEEP(*(.isr_vector)) . = ALIGN(4); } > m_interrupts /* ================================================================ * HOT CODE IN ITCM (VMA=ITCM, LMA computed later) * ================================================================ */ .itcm_text : AT(__itcm_text_load__) { . = ALIGN(32); __itcm_text_start__ = .; *(.itcm_text*) *(ITCM_TEXT*) /* your hot TUs */ */DspParameterManager.cpp.obj(.text .text.*) */audio_param_task.cpp.obj(.text .text.*) */StepSequencer.cpp.obj(.text .text.*) */sequencer_task.cpp.obj(.text .text.*) /* MU ISR(s) - by symbol section name */ *(.text.MUB_IRQHandler) /* FreeRTOS hot bits - by symbol section name */ *(.text.SVC_Handler) *(.text.PendSV_Handler) *(.text.SysTick_Handler) *(.text.vPortEnterCritical) *(.text.vPortExitCritical) *(.text.vPortValidateInterruptPriority) *(.text.xPortStartScheduler) *(.text.vPortSetupTimerInterrupt) *(.text.xTaskIncrementTick) *(.text.vTaskSwitchContext) *(.text.vTaskGenericNotifyGiveFromISR) *(.text.xTaskGenericNotify) *(.text.xQueueGenericSendFromISR) *(.text.xQueueGiveFromISR) . = ALIGN(32); __itcm_text_end__ = .; } > m_itcm /* ================================================================ * HOT RODATA IN DTCM (LMA computed later) * ================================================================ */ .dtcm_rodata : AT(__dtcm_rodata_load__) { . = ALIGN(32); __dtcm_rodata_start__ = .; */DspParameterManager.cpp.obj(.rodata .rodata.*) */audio_param_task.cpp.obj(.rodata .rodata.*) */StepSequencer.cpp.obj(.rodata .rodata.*) */sequencer_task.cpp.obj(.rodata .rodata.*) . = ALIGN(32); __dtcm_rodata_end__ = .; } > m_dtcm /* ================================================================ * HOT DATA IN DTCM (LMA computed later) * ================================================================ */ .dtcm_data : AT(__dtcm_data_load__) { . = ALIGN(32); __dtcm_data_start__ = .; *(.dtcm_data*) *(DTCM_DATA*) . = ALIGN(32); __dtcm_data_end__ = .; } > m_dtcm /* ================================================================ * FLASH XIP TEXT/RODATA (catch-all) * ================================================================ */ .text : { . = ALIGN(4); *(.text .text*) *(.rodata .rodata*) *(.glue_7) *(.glue_7t) *(.eh_frame) KEEP(*(.init)) KEEP(*(.fini)) . = ALIGN(4); } > m_text .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } > m_text .ARM : { __exidx_start = .; *(.ARM.exidx*) __exidx_end = .; } > m_text .ctors : { __CTOR_LIST__ = .; KEEP (*crtbegin.o(.ctors)) KEEP (*crtbegin?.o(.ctors)) KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) __CTOR_END__ = .; } > m_text .dtors : { __DTOR_LIST__ = .; KEEP (*crtbegin.o(.dtors)) KEEP (*crtbegin?.o(.dtors)) KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) __DTOR_END__ = .; } > m_text .preinit_array : { PROVIDE_HIDDEN (__preinit_array_start = .); KEEP (*(.preinit_array*)) PROVIDE_HIDDEN (__preinit_array_end = .); } > m_text .init_array : { PROVIDE_HIDDEN (__init_array_start = .); KEEP (*(SORT(.init_array.*))) KEEP (*(.init_array*)) PROVIDE_HIDDEN (__init_array_end = .); } > m_text .fini_array : { PROVIDE_HIDDEN (__fini_array_start = .); KEEP (*(SORT(.fini_array.*))) KEEP (*(.fini_array*)) PROVIDE_HIDDEN (__fini_array_end = .); } > m_text /* ================================================================ * CRITICAL FIX: * Start load-images AFTER ALL flash-resident sections above. * At this point, '.' is at the real end of flash content. * ================================================================ */ __DATA_ROM = .; __itcm_text_load__ = __DATA_ROM; __dtcm_rodata_load__ = __itcm_text_load__ + SIZEOF(.itcm_text); __dtcm_data_load__ = __dtcm_rodata_load__ + SIZEOF(.dtcm_rodata); /* NXP startup expects .data LMA at __etext */ __etext = __dtcm_data_load__ + SIZEOF(.dtcm_data); .data : AT(__etext) { . = ALIGN(4); __DATA_RAM = .; __data_start__ = .; *(.data) *(.data*) *(DataQuickAccess) KEEP(*(.jcr*)) . = ALIGN(4); __data_end__ = .; } > m_dtcm __NDATA_ROM = __etext + (__data_end__ - __data_start__); .ncache.init : AT(__NDATA_ROM) { __noncachedata_start__ = .; *(NonCacheable.init) . = ALIGN(4); __noncachedata_init_end__ = .; } > m_ncache_local .ncache (NOLOAD) : { *(NonCacheable) . = ALIGN(4); __noncachedata_end__ = .; } > m_ncache_local .bss (NOLOAD) : { . = ALIGN(4); __bss_start__ = .; *(.bss) *(.bss*) *(COMMON) . = ALIGN(4); __bss_end__ = .; } > m_dtcm .dtcm_bss (NOLOAD) : { . = ALIGN(32); __dtcm_bss_start__ = .; *(.dtcm_bss*) *(DTCM_BSS*) . = ALIGN(32); __dtcm_bss_end__ = .; } > m_dtcm __SDRAM_C_DATA_ROM = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_start__); .sdram_c_data : AT(__SDRAM_C_DATA_ROM) { . = ALIGN(32); __sdram_c_data_start__ = .; *(.sdram_c_data*) *(SDRAM_C_DATA*) . = ALIGN(32); __sdram_c_data_end__ = .; } > m_sdram_c __sdram_c_data_load__ = __SDRAM_C_DATA_ROM; .sdram_c_bss (NOLOAD) : { . = ALIGN(32); __sdram_c_bss_start__ = .; *(.sdram_c_bss*) *(SDRAM_C_BSS*) . = ALIGN(32); __sdram_c_bss_end__ = .; } > m_sdram_c .sdram_nc_bss (NOLOAD) : { . = ALIGN(32); __sdram_nc_bss_start__ = .; *(.sdram_nc_bss*) *(SDRAM_NC_BSS*) . = ALIGN(32); __sdram_nc_bss_end__ = .; } > m_sdram_nc .heap : { . = ALIGN(8); __end__ = .; PROVIDE(end = .); __HeapBase = .; . += HEAP_SIZE; __HeapLimit = .; __heap_limit = .; } > m_dtcm .stack : { . = ALIGN(8); . += STACK_SIZE; __StackEnd = .; } > m_dtcm __StackTop = ORIGIN(m_dtcm) + LENGTH(m_dtcm); __StackLimit = __StackTop - STACK_SIZE; PROVIDE(__stack = __StackTop); .ARM.attributes 0 : { *(.ARM.attributes) } __SDRAM_BASE = SDRAM_BASE; __SDRAM_SIZE = SDRAM_SIZE; __SDRAM_C_BASE = SDRAM_BASE; __SDRAM_C_SIZE = SDRAM_C_SIZE; __SDRAM_NC_BASE = SDRAM_NC_BASE; __SDRAM_NC_SIZE = SDRAM_NC_SIZE; } MPUconfig: /* -------------------------------------------------------------------------- */ /* CM7 MPU config */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 7 void BOARD_ConfigMPU(void) { #if defined(__ICCARM__) || defined(__GNUC__) extern uint32_t __NCACHE_REGION_START[]; extern uint32_t __NCACHE_REGION_SIZE[]; uint32_t nonCacheStart = (uint32_t)__NCACHE_REGION_START; uint32_t size = (uint32_t)__NCACHE_REGION_SIZE; #else uint32_t nonCacheStart = OCRAM_BASE_EXPECTED; uint32_t size = OCRAM_SIZE_EXPECTED; #endif (void)nonCacheStart; (void)size; #if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB->CCR)) { SCB_DisableICache(); } #endif #if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB->CCR)) { SCB_DisableDCache(); } #endif ARM_MPU_Disable(); /* Region 0: deny all (speculative prefetch workaround) */ MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U); MPU->RASR = ARM_MPU_RASR(1, ARM_MPU_AP_NONE, 0, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_4GB); /* Region 1: Device, non-shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB); /* Region 2: Device, non-shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB); /* Region 3: Device, non-shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB); /* Region 4: Normal, WB */ MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB); /* Region 5: Normal, WB */ MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB); /* OCRAM on CM7: Normal + Shareable + Non-cacheable (TEX=1,S=1,C=0,B=0) */ /* Region 6: 0x20240000..0x2027FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(6, 0x20240000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_256KB); /* Region 7: 0x20280000..0x202FFFFF (512KB) */ MPU->RBAR = ARM_MPU_RBAR(7, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_512KB); /* Region 10: 0x20300000..0x2033FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(10, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_256KB); #if USE_SDRAM /* Region 11: SDRAM default NON-cacheable 64MB (Normal non-cache) */ MPU->RBAR = ARM_MPU_RBAR(11, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_64MB); #if defined(CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH /* Region 12: overlay first 8MB as cacheable (WT) */ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_8MB); #else /* Region 12: overlay first 8MB as cacheable (WB) */ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_8MB); #endif #endif /* USE_SDRAM */ #if defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1) /* Region 8: XIP external flash, RO, cacheable WB, cover full 64MB */ MPU->RBAR = ARM_MPU_RBAR(8, 0x30000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_64MB); #endif /* Peripheral windows */ MPU->RBAR = ARM_MPU_RBAR(13, 0x40000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_16MB); MPU->RBAR = ARM_MPU_RBAR(14, 0x41000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_2MB); MPU->RBAR = ARM_MPU_RBAR(15, 0x41400000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1MB); ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); #if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT SCB_EnableDCache(); #endif #if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT SCB_EnableICache(); #endif } #endif /* __CORTEX_M == 7 */ /* -------------------------------------------------------------------------- */ /* CM4 MPU config */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 4 void BOARD_ConfigMPU(void) { /* ---- Disable code bus cache (LMEM) ---- */ if (LMEM_PCCCR_ENCACHE_MASK == (LMEM_PCCCR_ENCACHE_MASK & LMEM->PCCCR)) { LMEM->PCCCR |= LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_GO_MASK; while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U) {} LMEM->PCCCR &= ~(LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK); LMEM->PCCCR &= ~LMEM_PCCCR_ENCACHE_MASK; } /* ---- Disable system bus cache (LMEM) ---- */ if (LMEM_PSCCR_ENCACHE_MASK == (LMEM_PSCCR_ENCACHE_MASK & LMEM->PSCCR)) { LMEM->PSCCR |= LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_GO_MASK; while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U) {} LMEM->PSCCR &= ~(LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK); LMEM->PSCCR &= ~LMEM_PSCCR_ENCACHE_MASK; } ARM_MPU_Disable(); /* Region 0: 0x20240000..0x2025FFFF (128KB) DMA -> Device/non-cache. * Keep the original attributes here: UART/SPI/SD DMA buffers live in this * window and require the proven non-cache behavior with CM4 LMEM. */ MPU->RBAR = ARM_MPU_RBAR(0, OCRAM_DMA_NC_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1, /* shareable recommended */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_128KB); /* Region 1: 0x20260000..0x2027FFFF (128KB) local scratch -> Normal WB cacheable */ MPU->RBAR = ARM_MPU_RBAR(1, OCRAM_LOCAL_C_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal */ 0, /* not shareable */ 1, /* cacheable */ 1, /* bufferable (WB) */ 0, ARM_MPU_REGION_SIZE_128KB); /* Region 2: 0x20280000..0x202FFFFF (512KB) shared -> original non-cache attrs */ MPU->RBAR = ARM_MPU_RBAR(2, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1, /* shareable */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_512KB); /* Region 3: 0x20300000..0x2033FFFF (256KB) shared -> original non-cache attrs */ MPU->RBAR = ARM_MPU_RBAR(3, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1, /* shareable */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_256KB); #if USE_SDRAM /* Linker split: * m_sdram_c = 0x80000000..0x807FFFFF (8MB) * m_sdram_nc = 0x80800000..0x83FFFFFF (56MB) * * The MPU cannot describe 56MB directly, so region 4 makes the full 64MB * SDRAM window Device/non-cache and region 5 overlays the first 8MB as * cacheable. Higher-numbered MPU regions take precedence. */ (void)SDRAM_NC_BASE; (void)SDRAM_NC_SIZE; /* Region 4: full SDRAM default, 0x80000000..0x83FFFFFF -> Device/non-cache */ MPU->RBAR = ARM_MPU_RBAR(4, SDRAM_BASE_EXPECTED); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, /* Device */ 0, /* not shareable */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_64MB); #if defined(CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH /* Region 5: linker m_sdram_c, 0x80000000..0x807FFFFF -> Normal write-through */ MPU->RBAR = ARM_MPU_RBAR(5, SDRAM_C_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal */ 0, /* not shareable */ 1, /* cacheable */ 0, /* write-through */ 0, ARM_MPU_REGION_SIZE_8MB); #else /* Region 5: linker m_sdram_c, 0x80000000..0x807FFFFF -> Normal write-back */ MPU->RBAR = ARM_MPU_RBAR(5, SDRAM_C_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal */ 0, /* not shareable */ 1, /* cacheable */ 1, /* write-back */ 0, ARM_MPU_REGION_SIZE_8MB); #endif #endif /* USE_SDRAM */ ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); /* Invalidate and enable system bus cache (PSCCR) */ LMEM->PSCCR |= LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK | LMEM_PSCCR_GO_MASK; while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U) {} LMEM->PSCCR &= ~(LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK); LMEM->PSCCR |= LMEM_PSCCR_ENCACHE_MASK; /* Invalidate and enable code bus cache (PCCCR) */ LMEM->PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK; while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U) {} LMEM->PCCCR &= ~(LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK); LMEM->PCCCR |= LMEM_PCCCR_ENCACHE_MASK; } #endif /* __CORTEX_M == 4 */ I also tried this with similar results but got missmatching checksums when writing from non cacheable ocram to non cacheable sdram using dma:  #if __CORTEX_M == 7 void BOARD_ConfigMPU(void) { #if defined(__ICCARM__) || defined(__GNUC__) extern uint32_t __NCACHE_REGION_START[]; extern uint32_t __NCACHE_REGION_SIZE[]; uint32_t nonCacheStart = (uint32_t)__NCACHE_REGION_START; uint32_t size = (uint32_t)__NCACHE_REGION_SIZE; #else uint32_t nonCacheStart = OCRAM_BASE_EXPECTED; uint32_t size = OCRAM_SIZE_EXPECTED; #endif (void)nonCacheStart; (void)size; #if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB->CCR)) { SCB_DisableICache(); } #endif #if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB->CCR)) { SCB_DisableDCache(); } #endif ARM_MPU_Disable(); /* Region 0: deny all (speculative prefetch workaround) */ MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U); MPU->RASR = ARM_MPU_RASR(1, ARM_MPU_AP_NONE, 0, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_4GB); /* Region 1: Device, non-shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB); /* Region 2: Device, non-shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB); /* Region 3: Device, non-shareable, non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB); /* Region 4: Normal, WB */ MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB); /* Region 5: Normal, WB */ MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB); /* OCRAM on CM7: Normal + Shareable + Non-cacheable (TEX=1,S=1,C=0,B=0) */ /* Region 6: 0x20240000..0x2027FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(6, 0x20240000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_256KB); /* Region 7: 0x20280000..0x202FFFFF (512KB) */ MPU->RBAR = ARM_MPU_RBAR(7, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_512KB); /* Region 10: 0x20300000..0x2033FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(10, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_256KB); #if USE_SDRAM /* Region 11: SDRAM default NON-cacheable 64MB (Normal non-cache) */ MPU->RBAR = ARM_MPU_RBAR(11, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_64MB); #if defined(CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH /* Region 12: overlay first 8MB as cacheable (WT) */ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_8MB); #else /* Region 12: overlay first 8MB as cacheable (WB) */ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_8MB); #endif #endif /* USE_SDRAM */ #if defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1) /* Region 8: XIP external flash, RO, cacheable WB, cover full 64MB */ MPU->RBAR = ARM_MPU_RBAR(8, 0x30000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_64MB); #endif /* Peripheral windows */ MPU->RBAR = ARM_MPU_RBAR(13, 0x40000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_16MB); MPU->RBAR = ARM_MPU_RBAR(14, 0x41000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_2MB); MPU->RBAR = ARM_MPU_RBAR(15, 0x41400000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1MB); ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); #if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT SCB_EnableDCache(); #endif #if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT SCB_EnableICache(); #endif } #endif /* __CORTEX_M == 7 */ /* -------------------------------------------------------------------------- */ /* CM4 MPU config */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 4 void BOARD_ConfigMPU(void) { /* ---- Disable code bus cache (LMEM) ---- */ if (LMEM_PCCCR_ENCACHE_MASK == (LMEM_PCCCR_ENCACHE_MASK & LMEM->PCCCR)) { LMEM->PCCCR |= LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_GO_MASK; while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U) {} LMEM->PCCCR &= ~(LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK); LMEM->PCCCR &= ~LMEM_PCCCR_ENCACHE_MASK; } /* ---- Disable system bus cache (LMEM) ---- */ if (LMEM_PSCCR_ENCACHE_MASK == (LMEM_PSCCR_ENCACHE_MASK & LMEM->PSCCR)) { LMEM->PSCCR |= LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_GO_MASK; while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U) {} LMEM->PSCCR &= ~(LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK); LMEM->PSCCR &= ~LMEM_PSCCR_ENCACHE_MASK; } ARM_MPU_Disable(); /* Region 0: 0x20240000..0x2025FFFF (128KB) DMA -> Normal non-cacheable */ MPU->RBAR = ARM_MPU_RBAR(0, OCRAM_DMA_NC_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal */ 1, /* shareable recommended */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_128KB); /* Region 1: 0x20260000..0x2027FFFF (128KB) local scratch -> Normal WB cacheable */ MPU->RBAR = ARM_MPU_RBAR(1, OCRAM_LOCAL_C_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal */ 0, /* not shareable */ 1, /* cacheable */ 1, /* bufferable (WB) */ 0, ARM_MPU_REGION_SIZE_128KB); /* Region 2: 0x20280000..0x202FFFFF (512KB) shared -> Normal (shareable) */ MPU->RBAR = ARM_MPU_RBAR(2, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal */ 1, /* shareable */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_512KB); /* Region 3: 0x20300000..0x2033FFFF (256KB) shared -> Normal (shareable) */ MPU->RBAR = ARM_MPU_RBAR(3, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, /* Normal*/ 1, /* shareable */ 0, /* non-cacheable */ 0, 0, ARM_MPU_REGION_SIZE_256KB); ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); /* Invalidate and enable system bus cache (PSCCR) */ LMEM->PSCCR |= LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK | LMEM_PSCCR_GO_MASK; while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U) {} LMEM->PSCCR &= ~(LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK); LMEM->PSCCR |= LMEM_PSCCR_ENCACHE_MASK; /* Invalidate and enable code bus cache (PCCCR) */ LMEM->PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK; while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U) {} LMEM->PCCCR &= ~(LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK); LMEM->PCCCR |= LMEM_PCCCR_ENCACHE_MASK; } #endif /* __CORTEX_M == 4 */ Evaluation Board Re: RT1170 EVKB M4 memory speed Hi @cyberhelmer , Thanks for your interest in NXP MIMXRT series! NXP has provided test results based on the RT1050. You can view this application note and the corresponding software: https://www.nxp.com/docs/en/application-note/AN12437.pdf https://www.nxp.com/products/i.MX-RT1050 I did a quick comparison and found that during the SDRAM write test, ANSW used the following settings: Normal memory property, pure 32-bit sequential writes, and DSB after write. We recommend that you refer to this ANSW to conduct the corresponding experiment. Best regards, Gavin
View full article
RT1170 EVKB M4 内存速度 我正在对 RT1170 evkb 的 M4 内核内存访问进行一些基准测试。当 M4 访问主板上的 同步动态随机存取存储器 (SDRAM) 和 ocram 时,这些数字是预期的吗?看起来非常慢。 我读到过一些关于 M4 的访问时间较长的信息,因为有 axi 织物等,但这似乎非常慢。我是否在配置中遗漏了什么,导致速度慢于需要? 基准测试包括一些不同的内存源/目的地,但我最感兴趣的改进是 同步动态随机存取存储器(SDRAM) 和 ocram 之间的 edma。我正在实现一个多轨音频流媒体引擎,其中 M4 组 edma 从同步动态随机存取存储器(SDRAM)不可缓存传输到 ocram 不可缓存。然后,M7 内核消耗共享 ocram 的缓冲区。 但测试是独立进行的,应该没有或很少有仲裁发生。 如果我没猜错的话,同步动态随机存取存储器(SDRAM) 和 ocram 区域都设置为不可缓存,在 mpuConfig 中也将 ocram 区域设置为可共享? 音频流复制基准,Cortex-M4 @ 400 MHz 操作:回放 16 x 4096 B SDRAM_NC->OCRAM,记录 8 x 4096 B OCRAM->SDRAM_NC 字节:回放=65536 记录=32768 总计 =98304   CPU memcpy: 播放副本 1532202 Cyc 3830.505 us 记录副本 530291 cyc 1325.727 us scatter total 2062493 cyc 5156.232 us 单个 96K 散装 2301811 cyc 5754.527 us 校验和=239   内存区域复制矩阵(每行 32768 B): regions src: SDRAM_C=80008000 SDRAM_NC=80818000 SHARED=202B8EC0 NCACHE=20248AA0 OCRAM_CACHE=2026E3C0 MPU/ 缓存:CTRL=0x00000007 TYPE=0x00000800 PSCCR=0x00000003 R4=0x80000004/0x03100033 R5=0x80000005/0x0303002d 只有当两个端点都是非高速缓存/DMA 安全时,才会运行 EDMA。 SDRAM_C-> OCRAM_CACHE 字节 =32768 cpu= 1201410 cyc 3003.525 us 10.90 MB/s | edma=跳过可缓存校验和=338 SDRAM_NC-> OCRAM_CACHE 字节 =32768 cpu= 1037590 cyc 2593.975 us 12.63 MB/s | edma=跳过可缓存校验和=602 SDRAM_NC-> SHARED_OCRAM 字节=32768 cpu= 781109 cyc 1952.772 美国 16.78 MB/s | edma=ok 779805 cyc 1949.512 美国 16.80 MB/s 校验和=602/602 | edma+cache=ok 858144 cyc 2145.360 美国 15.27 MB/s checksum=602 SDRAM_NC-> NCACHE_OCRAM 字节=32768 cpu= 777897 cyc 1944.742 美国 16.84 MB/s | edma=ok 751101 cyc 1877.752 我们 17.45 MB/s checksum=602 | edma+cache=ok 853273 cyc 2133.182 美国 15.36 MB/s checksum=602 OCRAM_CACHE-> SDRAM_NC 字节=32768 cpu= 750396 cyc 1875.990 美国 17.46 MB/s | edma=跳过可缓存校验和 =1204 SHARED_OCRAM-> SDRAM_NC 字节=32768 cpu= 53 1143 cyc 1327.857 美国 24.67 MB/s | edma=ok 570792 cyc 1426.980 美国 22.96 MB/s checksum=610 | edma+cache=ok 670564 cyc 1676.410 us 19.54 Mb/s checksum=610 NCACHE_OCRAM-> SDRAM_NC 字节=32768 cpu= 541568 cyc 1353.920 美国 24.20 Mb/s | edma=ok 549911 cyc 1374.777 美国 23.83 Mb/s checksum=940 | edma+cache=ok 649852 cyc 1624.630 us 20.16 Mb/s checksum=940 SDRAM_NC-> SDRAM_NC 字节=32768 cpu= 896 656 cyc 2241.640 我们 14.61 Mb/s | edma=ok 997686 cyc 2494.215 我们 13.13 MB/s checksum=602/602 | edma+cache=ok 1130798 cyc 2826.995 美国 11.59 MB/s checksum=602 OCRAM_CACHE-> OCRAM_CACHE 字节 =32768 cpu= 768904 cyc 1922.260 us 17.04 MB/s | edma=跳过可缓存校验和 =1204 SHARED_OCRAM-> SHARED_OCRAM 字节 =32768 cpu= 425929 cyc 1064.822 美国 30.77 MB/s | edma=ok 433498 cyc 1083.745 美国 30.23 MB/s 校验和=610/610 | edma+cache=ok 542913 cyc 1357.282 us 24.14 Mb/s checksum=610   EDMA 散射/采集 24 x 4K,NBYTES=4096: ops=24 nbytes=4096 ok=1 描述符 设置+启动 58942 cyc 147.355 us 等待完成/出错 2031292 cyc 5078.230 us 共计 2090234 Cyc 5225.585 US checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=1 biter=1   EDMA 散射/采集 24 x 4K,NBYTES=32: ops=24 nbytes=32 ok=1 描述符设置+启动 47526 cyc 118.815 us 等待完成/错误 2055017 Cyc 5137.542 us 共计 2102543 Cyc 5256.357 US checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=128 biter=128   EDMA 单 4K,NBYTES=4096: ops=1 nbytes=4096 ok=1 描述符设置+启动 5713 Cyc 14.282 us 等待完成/出错 93592 Cyc 233.980 us 共计 99305 cyc 248.262 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=1 biter=1   EDMA 单 4K,NBYTES=32: ops=1 nbytes=32 ok=1 描述符 设置+启动 5344 Cyc 13.360 us 等待完成/出错 94609 cyc 236.522 us 共计 99953 cyc 249.882 us checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=128 biter=128   EDMA 单通道 96K,NBYTES=4096: ops=1 nbytes=4096 ok=1 描述符 设置+启动 5867 cyc 14.667 us 等待完成/出错 2230360 Cyc 5575.900 us 共计 2236227 Cyc 5590.567 US checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=24 biter=24   EDMA 单通道 96K,NBYTES=32: ops=1 nbytes=32 ok=1 描述符设置+启动 5713 Cyc 14.282 us 等待完成/错误 2256234 Cyc 5640.585 us 共计 2261947 Cyc 5654.867 US checksum=239 channelFlags=0x1 errorFlags=0x0 remaining=0 csr=0x0088 citer=3072 biter=3072 DMAMUX1_CHCFG[2]=0xa0000000 DMA1_ERQ=0x80 DMA1_ES=0x0 ============================================================ My linker: /* M4/armgcc/MIMXRT1176xxxxx_cm4_flexspi_nor.ld * 带有 ITCM/DTCM 热门部分的 M4 XIP-from-FlexSPI + 同步动态随机存取存储器(SDRAM) * OCRAM 分区(1MB @ 0x2024_0000): *-128KB DMA 安全/设备/非缓存:0x20240000.. 0x2025FFFF * 128KB M4 缓存本地抓取:0x20260000...0x2027FFFF * - 768KB 共享(M4<->M7)非高速缓存:0x20280000...0x2033FFFF * - 仅为 M7 保留的最后 8KB 共享:0x2033E000...0x2033FFFF(不在 M4 连接器区域内) * * 额外的固定分割(在 M7 DMA 分割之前的共享-双向): * M4 的 36KB 固定共享 SysView/RTT 窗口:0x20335000...0x2033DFFF * - 共享主系统(用于 IPC 等) :0x20280000..0x20334FFF */ ENTRY(Reset_Handler) HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0400; STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400; SDRAM_BASE = 0x80000000; SDRAM_SIZE = 0x04000000; /* 64 MB */ SDRAM_C_SIZE = 0x00800000; /* 8 MB 缓存 */ SDRAM_NC_BASE = SDRAM_BASE + SDRAM_C_SIZE; /* 0x80800000 */ sdram_nc_size = sdram_size - sdram_c_size; /* 56 MB */ M4_FLASH_BASE = 0x33600000; M4_FLASH_SIZE = 0x00A00000; /* OCRAM: 1MB */ OCRAM_BASE = 0x20240000; OCRAM_SIZE = 0x00100000; /* 本地 OCRAM 总容量 = DMA 128KB + 可缓存划痕 128KB = 256KB */ OCRAM_LOCAL_TOTAL_SIZE = 0x00040000; /* 256KB */ /* DMA 安全非高速缓存本地窗口(前 128KB) */ OCRAM_DMA_NC_BASE = 0x20240000; OCRAM_DMA_NC_SIZE = 0x00020000; /* 128KB */ /* M4 可缓存抓取窗口(下 128KB) */ OCRAM_LOCAL_C_BASE = 0x20260000; OCRAM_LOCAL_C_SIZE = 0x00020000; /* 128KB */ /* 共享 OCRAM 从 0x20280000 开始(其余部分 = 768KB) */ OCRAM_SHARED_BASE = OCRAM_BASE + OCRAM_LOCAL_TOTAL_SIZE; /* 0x20280000 */ OCRAM_SHARED_SIZE_FULL = OCRAM_SIZE - OCRAM_LOCAL_TOTAL_SIZE; /* 0x000C0000 */ /* 为 M7 专用 DMA 缓冲区保留最后 8KB 共享 OCRAM(不包括 M4 区域) */ M7_DMA_OCRAM_BYTES = 0x00002000; /* 8KB */ OCRAM_SHARED_FOR_BOTH_SIZE = OCRAM_SHARED_SIZE_FULL - M7_DMA_OCRAM_BYTES; /* 0x000BE000 */ /* 修正了 SysView/RTT 在双方共享(36KB)结束时对 M4 的分割 */ SYSVIEW_M4_BYTES = 0x00009000; /* 36KB */ /* 共享主大小(除固定的 36KB 窗口外的所有内容) */ OCRAM_SHARED_MAIN_SIZE = OCRAM_SHARED_FOR_BOTH_SIZE - SYSVIEW_M4_BYTES; /* 0x000B5000 */ /* SysView M4 base(固定) */ OCRAM_SYSVIEW_M4_BASE = OCRAM_SHARED_BASE + OCRAM_SHARED_MAIN_SIZE; /* 0x20335000 */ OCRAM_SYSVIEW_M4_SIZE = SYSVIEW_M4_BYTES; /* 0x00009000 */ 存储器 { m_interrupts (RX) :ORIGIN = M4_FLASH_BASE,LENGTH = 0x00000400 m_text (RX) :ORIGIN = M4_FLASH_BASE + 0x400,LENGTH = M4_FLASH_SIZE - 0x00000400 m_itcm (RX) :ORIGIN = 0x1FFE0000,LENGTH = 0x00020000 m_dtcm (RW) :ORIGIN = 0x20000000,LENGTH = 0x00020000 /* OCRAM 分区 */ m_ncache_local (RW) :origin = ocram_dma_nc_base, length = ocram_dma_nc_size m_ocram_cache (RW) :origin = ocram_local_c_base, length = ocram_local_c_size m_shared_ocram_main (RW) :origin = ocram_shared_base, length = ocram_shared_main_size m_shared_sysview_m4 (RW) :origin = ocram_sysview_m4_base, length = ocram_sysview_m4_size m_sdram_c (RW) :origin = sdram_base,length = sdram_c_size m_sdram_nc (RW) :origin = sdram_nc_base,length = sdram_nc_size } SECTIONS { __ncache_region_start = ocram_base; __ncache_region_size = ocram_size; __SHARED_OCRAM_START = ORIGIN(m_shared_ocram_main); __SHARED_OCRAM_SIZE = LENGTH(m_shared_ocram_main); __SYSVIEW_M4_BASE = ORIGIN(m_shared_sysview_m4); __SYSVIEW_M4_SIZE = LENGTH(m_shared_sysview_m4); __OCRAM_CACHE_START = ORIGIN(m_ocram_cache); __OCRAM_CACHE_SIZE = LENGTH(m_ocram_cache); .shared_ocram (NOLOAD) : { . = ALIGN(32); __shared_ocram_start__ = ..; *(.shared_ocram*) *(SharedOcram*) . = ALIGN(32); __shared_ocram_end__ = ..; ASSERT((__SHARED_OCRAM_END__ - __SHARED_OCRAM_START__)<= LENGTH(m_shared_ocram_main)、 "shared_ocram 部分过大"); }> m_shared_ocram_main .shared_sysview_m4 (NOLOAD) : { . = ALIGN(32); __sysview_m4_start__ = ..; KEEP(*(.shared_sysview_m4)) KEEP(*(.shared_sysview_m4.*)) . = ALIGN(32); __sysview_m4_end__ = ; ASSERT((__SYSVIEW_M4_END__ - __SYSVIEW_M4_START__)<= LENGTH(m_shared_sysview_m4)、 "shared_sysview_m4 部分过大 (max 36KB)"); }> m_shared_sysview_m4 .ocram_cache (NOLOAD) : { . = ALIGN(32); __ocram_cache_start__ = ..; *(.ocram_cache*) *(OcramCache*) . = ALIGN(32); __ocram_cache_end__ = ; ASSERT((__OCRAM_CACHE_END__ - __OCRAM_CACHE_START__)<= LENGTH(m_ocram_cache)、 "ocram_cache 部分过大"); }> m_ocram_cache .中断 : { __vector_table = ; __Vectors = ; . = ALIGN(4); KEEP(*(.isr_vector)) . = ALIGN(4); }> m_interrupts /* ================================================================ * ITCM 中的热代码(VMA=ITCM,LMA 稍后计算) * ================================================================ */ .itcm_text : AT(__itcm_text_load__) { . = ALIGN(32); __itcm_text_start__ = ; *(.itcm_text*) *(ITCM_TEXT*) /* 您的热 TU */ */DspParameterManager.cpp.obj(.text.text.*) */audio_param_task.cpp.obj(.text.text.*) */StepSequencer.cpp.obj(.text.text.*) */sequencer_task.cpp.obj(.text.text.*) /* MU ISR - 按符号部分名称 */ *(.text.MUB_IRQHandler) /* FreeRTOS 热位 - 按符号部分名称 */ *(.text.SVC_Handler) *(.text.PendSV_Handler) *(.text.SysTick_Handler) *(.text.vPortEnterCritical) *(.text.vPortExitCritical) *(.text.vPortValidateInterruptPriority) *(.text.xPortStartScheduler) *(.text.vPortSetupTimerInterrupt) *(.text.xTaskIncrementTick) *(.text.vTaskSwitchContext) *(.text.vTaskGenericNotifyGiveFromISR) *(.text.xTaskGenericNotify) *(.text.xQueueGenericSendFromISR) *(.text.xQueueGiveFromISR) . = ALIGN(32); __itcm_text_end__ = ; }> m_itcm /* ================================================================ * DTCM 中的热 RODATA(稍后计算 LMA) * ================================================================ */ .dtcm_rodata :AT(__dtcm_rodata_load__) { . = ALIGN(32); __dtcm_rodata_start__ = ..; */DspParameterManager.cpp.obj(.rodata.rodata.*) */audio_param_task.cpp.obj(.rodata.rodata.*) */StepSequencer.cpp.obj(.rodata.rodata.*) */sequencer_task.cpp.obj(.rodata.rodata.*) . = ALIGN(32); __dtcm_rodata_end__ = ..; }> m_dtcm /* ================================================================ * DTCM 中的热数据(稍后计算 LMA) * ================================================================ */ .dtcm_data :AT(__dtcm_data_load__) { . = ALIGN(32); __dtcm_data_start__ = ..; *(.dtcm_data*) *(DTCM_DATA*) . = ALIGN(32); __dtcm_data_end__ = ..; }> m_dtcm /* ================================================================ * 闪存 XIP 文本/RODATA(包罗万象) * ================================================================ */ .text : { . = ALIGN(4); *(.text .text*) *(.rodata .rodata*) *(.glue_7) *(.glue_7t) *(.eh_frame) KEEP(*(.init)) KEEP(*(.fini)) . = ALIGN(4); }> m_text .arm.extab: {* (.arm.extab*.gnu.linkonce.armextab.*)}> m_text Arm : { __exidx_start = ; * (.arm.exidx*) __exidx_end = ; }> m_text .ctors : { __ctor_list__ = ; KEEP (*crtbegin.o(.ctors)) KEEP (*crtbegin?.o(.ctors)) KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o)).ctors)) KEEP (*(SORT(.ctors.*)) KEEP (*(.ctors)) __ctor_end__ = ; }> m_text .dtors : { __dtor_list__ = ..; KEEP (*crtbegin.o(.dtors)) KEEP (*crtbegin?.o(.dtors)) KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o)).dtors)) KEEP (*(SORT(.dtors.*)) KEEP (*(.dtors)) __dtor_end__ = ; }> m_text .preinit_array : { PROVIDE_HIDDEN (__preinit_array_start = .); KEEP (*(.preinit_array*)) PROVIDE_HIDDEN (__preinit_array_end = .); }> m_text .init_array : { PROVIDE_HIDDEN (__init_array_start = .); KEEP (*(SORT(.init_array.*)) KEEP (*(.init_array*)) PROVIDE_HIDDEN (__init_array_end = .); }> m_text .fini_array : { PROVIDE_HIDDEN (__fini_array_start = .); KEEP (*(SORT(.fini_array.*)) KEEP (*(.fini_array*)) PROVIDE_HIDDEN (__fini_array_end = .); }> m_text /* ================================================================ * 重要修复: * 在上述所有闪存驻留部分之后开始加载图像。 * 此时,". "位于闪存内容的真正末尾。 * ================================================================ */ __data_rom = ; __itcm_text_load__ = __DATA_ROM; __dtcm_rodata_load__ = __itcm_text_load__ + SIZEOF(.itcm_text); __dtcm_data_load__ = __dtcm_rodata_load__ + SIZEOF(.dtcm_rodata); /* 恩智浦启动时希望使用 .dataLMA at __etext */ __etext = __dtcm_data_load__ + SIZEOF(.dtcm_data); .data :AT(__etext) { . = ALIGN(4); __data_ram = ; __data_start__ = ; *(.data) *(.data*) *(DataQuickAccess) KEEP(*(.jcr*)) . = ALIGN(4); __data_end__ = ; }> m_dtcm __NDATA_ROM =__etext + (__data_end__ - __data_start__); .ncache.init : AT(__NDATA_ROM) { __noncachedata_start__ = ..; *(NonCacheable.init) . = ALIGN(4); __noncachedata_init_end__ = ..; }> m_ncache_local .ncache (NOLOAD) : { *(不可缓存) . = ALIGN(4); __noncachedata_end__ = ..; }> m_ncache_local .bss (NOLOAD) : { . = ALIGN(4); __bss_start__ = ; *(.bss) *(.bss*) *(通用) . = ALIGN(4); __bss_end__ = ; }> m_dtcm .dtcm_bss (NOLOAD) : { . = ALIGN(32); __dtcm_bss_start__ = ..; *(.dtcm_bss*) *(DTCM_BSS*) . = ALIGN(32); __dtcm_bss_end__ = ; }> m_dtcm __SDRAM_C_DATA_ROM = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_start__); .sdram_c_data :at(__sdram_c_data_rom) { . = ALIGN(32); __sdram_c_data_start__ = ..; *(.sdram_c_data*) *(sdram_c_data*) . = ALIGN(32); __sdram_c_data_end__ = ..; }> m_sdram_c __sdram_c_data_load__ = __SDRAM_C_DATA_ROM; .sdram_c_bss (NOLOAD) : { . = ALIGN(32); __sdram_c_bss_start__ = ..; *(.sdram_c_bss*) *(sdram_c_bss*) . = ALIGN(32); __sdram_c_bss_end__ = ..; }> m_sdram_c .sdram_nc_bss (NOLOAD) : { . = ALIGN(32); __sdram_nc_bss_start__ = ..; *(.sdram_nc_bss*) *(sdram_nc_bss*) . = ALIGN(32); __sdram_nc_bss_end__ = ..; }> m_sdram_nc .heap : { . = ALIGN(8); __end__ = .; PROVIDE(end = .); __HeapBase = ; .+= HEAP_SIZE; __HeapLimit = ; __heap_limit = ; }> m_dtcm .stack : { . = ALIGN(8); .+= STACK_SIZE; __StackEnd = ; }> m_dtcm __StackTop = ORIGIN(m_dtcm) + LENGTH(m_dtcm); __StackLimit = __堆栈顶 - STACK_SIZE; PROVIDE(__stack = __StackTop); .arm.Attributes 0: {* (.arm.Attributes)} __sdram_base = sdram_base; __sdram_size = sdram_size; __sdram_c_base = sdram_base; __sdram_c_size = sdram_c_size; __sdram_nc_base = sdram_nc_base; __sdram_nc_size = sdram_nc_size; } MPUconfig: /* -------------------------------------------------------------------------- */ /* CM7 MPU 配置 */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 7 void BOARD_ConfigMPU(void) { #if 定义(__ICCARM__) || 定义(__GNUC__) 外部 uint32_t__ncache_region_start[]; 外部 uint32_t__ncache_region_size[]; uint32_tnonCacheStart =(uint32_t)__ncache_region_start; uint32_t大小 =(uint32_t)__ncache_region_size; #else uint32_tnonCacheStart =ocram_base_expected; uint32_t大小 =ocram_size_expected; #endif ()非缓存启动)nonCacheStart; (void)大小; #if 定义(__icache_present) &&__icache_present 如果(SCB_CCR_IC_Msk ==(SCB_CCR_IC_Msk & SCB->CCR)) { SCB_DisableICache(); } #endif #if 定义(__dcache_present) &&__dcache_present 如果(SCB_CCR_DC_Msk ==(SCB_CCR_DC_Msk & SCB->CCR)) { SCB_DisableDCache(); } #endif ARM_MPU_Disable(); /* 区域 0:全部拒绝(投机预取变通方法) */ MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U); MPU->RASR = ARM_MPU_RASR(1, arm_mpu_ap_none、 0, 0, 0, 0, 0, arm_mpu_region_size_4GB); /* 区域 1:设备,不可共享,不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_512mb); /* 区域 2:设备,不可共享,不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_512mb); /* 区域 3:设备,不可共享,不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_1GB); /* 区域 4:正常,WB */ MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 1, 0, arm_mpu_region_size_256kb); /* 区域 5:正常,WB */ MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 1, 0, arm_mpu_region_size_256kb); /* CM7 上的 OCRAM:正常 + 可共享 + 不可缓存(TEX=1,S=1,C=0,B=0) */ /* 区域 6:0x20240000...0x2027FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(6, 0x20240000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 1, 0, 0, 0, arm_mpu_region_size_256kb); /* 区域 7:0x20280000...0x202FFFFF (512KB) */ MPU->RBAR = ARM_MPU_RBAR(7, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 1, 0, 0, 0, arm_mpu_region_size_512kb); /* 区域 10:0x20300000...0x2033FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(10, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 1, 0, 0, 0, arm_mpu_region_size_256kb); #ifUSE_SDRAM /* 区域 11:同步动态随机存取存储器(SDRAM) 默认不可缓存 64MB(普通非缓存)*/ MPU->RBAR = ARM_MPU_RBAR(11, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 0, 0, 0, 0, arm_mpu_region_size_64mb); #if 定义(cache_mode_write_through) &&cache_mode_write_through /* 区域 12:将前 8MB 重叠为高速缓存(WT) */ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 0, 0, arm_mpu_region_size_8mb); #else /* 第 12 区:将前 8MB 重叠为可缓存(WB)*/ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 1, 0, arm_mpu_region_size_8mb); #endif #endif/* use_sdram */ #if 定义(xip_external_flash) &&(xip_external_flash == 1) /* 区域 8:XIP 外部闪存,RO,可缓存 WB,覆盖全 64MB */ MPU->RBAR = ARM_MPU_RBAR(8, 0x30000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO、 0, 0, 1, 1, 0, arm_mpu_region_size_64mb); #endif /* 外围窗口 */ MPU->RBAR = ARM_MPU_RBAR(13, 0x40000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_16mb); MPU->RBAR = ARM_MPU_RBAR(14, 0x41000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_2mb); MPU->RBAR = ARM_MPU_RBAR(15, 0x41400000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_1mb); ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk |ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); #if 定义(__dcache_present) &&__dcache_present SCB_EnableDCache(); #endif #if 定义(__icache_present) &&__icache_present SCB_EnableICache(); #endif } #endif/* __cortex_m == 7 */ /* -------------------------------------------------------------------------- */ /* CM4 MPU 配置 */ /* -------------------------------------------------------------------------- */ #if __CORTEX_M == 4 void BOARD_ConfigMPU(void) { /*----禁用代码总线缓存 (LMEM)----*/ 如果(lmem_pcccr_encache_mask ==(lmem_pcccr_encache_mask & LMEM->PCCCR)) { LMEM->PCCCR |= LMEM_PCCCR_PUSHW0_Mask | lmem_pcccr_pushw1_mask | lmem_pcccr_go_mask; 虽然((LMEM->PCCCR & LMEM_PCCCR_GO_Mask) != 0U) {} LMEM->PCCCR &= ~(lmem_pcccr_pushw0_mask | lmem_pcccr_pushw1_mask); LMEM->PCCCR &= ~lmem_pcccr_encache_mask; } /*----禁用系统总线缓存 (LMEM)----*/ 如果(lmem_psccr_encache_mask ==(lmem_psccr_encache_mask & LMEM->PSCCR)) { LMEM->PSCCR |= LMEM_PSCCR_PUSHW0_Mask | lmem_psccr_pushw1_mask | lmem_psccr_go_mask; 虽然((LMEM->PSCCR & LMEM_PSCCR_GOo_Mask) != 0U) {} LMEM->PSCCR &= ~(lmem_psccr_pushw0_mask | lmem_psccr_pushw1_mask); LMEM->PSCCR &= ~LMEM_PSCCR_encache_mask; } ARM_MPU_Disable(); /* 区域 0:0x20240000.. 0x2025FFF (128KB) DMA-> 设备/非缓存。 * 这里保留原始属性:UART/SPI/SD DMA 缓冲区位于此处 * 窗口,并要求使用 CM4 LMEM 经过验证的非缓存行为。*/ MPU->RBAR = ARM_MPU_RBAR(0, ocram_dma_nc_base); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1,/* 建议共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_128kb); /* 区域 1: 0x20260000..0x2027FFFF (128KB) 本地抓取 -> Normal WB cacheable */ MPU->RBAR = ARM_MPU_RBAR(1, ocram_local_c_base); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0,/* 正常 */ 0,/* 不可共享 */ 1,/* 可缓存 */ 1,/* 可缓冲 (WB) */ 0, arm_mpu_region_size_128kb); /* 区域 2:0x20280000...0x202FFFFF (512KB) 共享 -> 原始非缓存 attrs */ MPU->RBAR = ARM_MPU_RBAR(2, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1,/* 可共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_512kb); /* Region 3: 0x20300000..0x2033FFFF (256KB) shared -> original non-cache attrs */ MPU->RBAR = ARM_MPU_RBAR(3, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1,/* 可共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_256kb); #if USE_SDRAM /* 链接器分割: * m_sdram_c = 0x80000000..0x807FFFFF (8MB) * m_sdram_nc = 0x80800000..0x83FFFFFF (56MB) * * MPU 无法直接描述 56MB,因此第 4 区域可提供完整的 64MB * 同步动态随机存取存储器(SDRAM) 窗口设备/非缓存和区域 5 将前 8MB 覆盖为 * 可缓存。编号较高的 MPU 区域优先。*/ (void)SDRAM_NC_BASE; (void)SDRAM_NC_SIZE; /* 区域 4:全部 同步动态随机存取存储器(SDRAM) 默认,0x80000000... 0x83FFFFFF-> 设备/非缓存 */ MPU->RBAR = ARM_MPU_RBAR(4, sdram_base_expected); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2,/* 设备 */ 0,/* 不可共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_64mb); #if 定义(cache_mode_write_through) &&cache_mode_write_through /* 区域 5:链接器 m_sdram_c,0x80000000...0x807FFFFF -> 正常写透 */ MPU->RBAR = ARM_MPU_RBAR(5, sdram_c_base); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0,/* 正常 */ 0,/* 不可共享 */ 1,/* 可缓存 */ 0,/* 写入 */ 0, arm_mpu_region_size_8mb); #else /* 区域 5:链接器 m_sdram_c,0x80000000...0x807FFFFF -> 正常回写 */ MPU->RBAR = ARM_MPU_RBAR(5, SDRAM_C_BASE); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0,/* 正常 */ 0,/* 不可共享 */ 1,/* 可缓存 */ 1,/* 回写 */ 0, arm_mpu_region_size_8mb); #endif #endif/* use_sdram */ ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); /* 失效并启用系统总线缓存 (PSCCR) */ LMEM->PSCCR |= LMEM_PSCCR_INVW0_Mask | lmem_psccr_invw1_mask | lmem_psccr_go_mask; 虽然((LMEM->PSCCR & LMEM_PSCCR_GOo_Mask) != 0U) {} LMEM->PSCCR &= ~(lmem_psccr_invw0_mask | lmem_psccr_invw1_mask); LMEM->PSCCR |= LMEM_PSCCR_encache_mask; /* 使代码总线缓存失效并启用该缓存 (PCCCR) */ LMEM->PCCCR |= LMEM_PCCCR_INVW0_Mask | lmem_pcccr_invw1_mask | lmem_pcccr_go_mask; 虽然((LMEM->PCCCR & LMEM_PCCCR_GO_Mask) != 0U) {} LMEM->PCCCR &= ~(lmem_pcccr_invw0_mask | lmem_pcccr_invw1_mask); LMEM->PCCCR |= lmem_pcccr_encache_mask; } #endif /* __CORTEX_M == 4 */ 我也尝试过这个,但是在使用 dma 从不可缓存的 ocram 写入不可缓存的 同步动态随机存取存储器(SDRAM) 时出现校验和不匹配 的情况: #if__CORTEX_M == 7 void BOARD_ConfigMPU(void) { #if 定义(__ICCARM__) || 定义(__GNUC__) 外部 uint32_t__ncache_region_start[]; 外部 uint32_t__ncache_region_size[]; uint32_tnonCacheStart =(uint32_t)__ncache_region_start; uint32_t大小 =(uint32_t)__ncache_region_size; #else uint32_tnonCacheStart =ocram_base_expected; uint32_t大小 =ocram_size_expected; #endif ()非缓存启动)nonCacheStart; (void)大小; #if 定义(__icache_present) &&__icache_present 如果(SCB_CCR_IC_Msk ==(SCB_CCR_IC_Msk & SCB->CCR)) { SCB_DisableICache(); } #endif #if 定义(__dcache_present) &&__dcache_present 如果(SCB_CCR_DC_Msk ==(SCB_CCR_DC_Msk & SCB->CCR)) { SCB_DisableDCache(); } #endif ARM_MPU_Disable(); /* 区域 0:全部拒绝(投机预取变通方法) */ MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U); MPU->RASR = ARM_MPU_RASR(1, arm_mpu_ap_none、 0, 0, 0, 0, 0, arm_mpu_region_size_4GB); /* 区域 1:设备,不可共享,不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_512mb); /* 区域 2:设备,不可共享,不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_512mb); /* 区域 3:设备,不可共享,不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_1GB); /* 区域 4:正常,WB */ MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 1, 0, arm_mpu_region_size_256kb); /* 区域 5:正常,WB */ MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 1, 0, arm_mpu_region_size_256kb); /* CM7 上的 OCRAM:正常 + 可共享 + 不可缓存(TEX=1,S=1,C=0,B=0) */ /* 区域 6:0x20240000...0x2027FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(6, 0x20240000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 1, 0, 0, 0, arm_mpu_region_size_256kb); /* 区域 7:0x20280000...0x202FFFFF (512KB) */ MPU->RBAR = ARM_MPU_RBAR(7, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 1, 0, 0, 0, arm_mpu_region_size_512kb); /* 区域 10:0x20300000...0x2033FFFF (256KB) */ MPU->RBAR = ARM_MPU_RBAR(10, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 1, 0, 0, 0, arm_mpu_region_size_256kb); #ifUSE_SDRAM /* 区域 11:同步动态随机存取存储器(SDRAM) 默认不可缓存 64MB(普通非缓存)*/ MPU->RBAR = ARM_MPU_RBAR(11, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 1, 0, 0, 0, 0, arm_mpu_region_size_64mb); #if 定义(cache_mode_write_through) &&cache_mode_write_through /* 区域 12:将前 8MB 重叠为高速缓存(WT) */ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 0, 0, arm_mpu_region_size_8mb); #else /* 第 12 区:将前 8MB 重叠为可缓存(WB)*/ MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0, 0, 1, 1, 0, arm_mpu_region_size_8mb); #endif #endif/* use_sdram */ #if 定义(xip_external_flash) &&(xip_external_flash == 1) /* 区域 8:XIP 外部闪存,RO,可缓存 WB,覆盖全 64MB */ MPU->RBAR = ARM_MPU_RBAR(8, 0x30000000U); MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO、 0, 0, 1, 1, 0, arm_mpu_region_size_64mb); #endif /* 外围窗口 */ MPU->RBAR = ARM_MPU_RBAR(13, 0x40000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_16mb); MPU->RBAR = ARM_MPU_RBAR(14, 0x41000000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_2mb); MPU->RBAR = ARM_MPU_RBAR(15, 0x41400000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 2, 0, 0, 0, 0, arm_mpu_region_size_1mb); ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk |ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); #if 定义(__dcache_present) &&__dcache_present SCB_EnableDCache(); #endif #if 定义(__icache_present) &&__icache_present SCB_EnableICache(); #endif } #endif/* __cortex_m == 7 */ /* -------------------------------------------------------------------------- */ /* CM4 MPU 配置 */ /* -------------------------------------------------------------------------- */ #if__CORTEX_M == 4 void BOARD_ConfigMPU(void) { /*----禁用代码总线缓存 (LMEM)----*/ 如果(lmem_pcccr_encache_mask ==(lmem_pcccr_encache_mask & LMEM->PCCCR)) { LMEM->PCCCR |=LMEM_PCCCR_PUSHW0_Mask |lmem_pcccr_pushw1_mask |lmem_pcccr_go_mask; 虽然((LMEM->PCCCR &LMEM_PCCCR_GO_Mask) != 0U) {} LMEM->PCCCR &= ~(LMEM_PCCCR_PUSHW0_Mask |PCCCR = ~ (lmem_pcccr_pushw0_mask | lmem_pcccr_pushw1_mask); LMEM->PCCCR &= ~lmem_pcccr_encache_mask; } /*----禁用系统总线缓存 (LMEM)----*/ 如果(lmem_psccr_encache_mask ==(lmem_psccr_encache_mask & LMEM->PSCCR)) { LMEM->PSCCR |=LMEM_PSCCR_PUSHW0_Mask |lmem_psccr_pushw1_mask |lmem_psccr_go_mask; 虽然((LMEM->PSCCR &LMEM_PSCCR_GOo_Mask) != 0U) {} LMEM->PSCCR &= ~(LMEM_PSCCR_PUSHW0_Mask |lmem_psccr_pushw1_mask); LMEM->PSCCR &= ~LMEM_PSCCR_encache_mask; } ARM_MPU_Disable(); /* 区域 0: 0x20240000..0x2025FFFF (128KB) DMA -> 正常不可缓存 */ MPU->RBAR = ARM_MPU_RBAR(0, ocram_dma_nc_base); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0,/* 正常 */ 1,/* 建议共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_128kb); /* 区域 1: 0x20260000..0x2027FFFF (128KB) 本地抓取 -> Normal WB cacheable */ MPU->RBAR = ARM_MPU_RBAR(1, ocram_local_c_base); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0,/* 正常 */ 0,/* 不可共享 */ 1,/* 可缓存 */ 1,/* 可缓冲 (WB) */ 0, arm_mpu_region_size_128kb); /* 区域 2:0x20280000...0x202FFFFF (512KB) 共享 -> 正常(可共享) */ MPU->RBAR = ARM_MPU_RBAR(2, 0x20280000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0,/* 正常 */ 1,/* 可共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_512kb); /* 区域 3: 0x20300000..0x2033FFFF (256KB) 共享 -> 正常(可共享) */ MPU->RBAR = ARM_MPU_RBAR(3, 0x20300000U); MPU->RASR = ARM_MPU_RASR(0, arm_mpu_ap_full、 0,/* 正常*/ 1,/* 可共享 */ 0,/* 不可缓存 */ 0, 0, arm_mpu_region_size_256kb); ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk |ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk); /* 失效并启用系统总线缓存 (PSCCR) */ LMEM->PSCCR |=LMEM_PSCCR_INVW0_Mask |lmem_psccr_invw1_mask |lmem_psccr_go_mask; 虽然((LMEM->PSCCR &LMEM_PSCCR_GOo_Mask) != 0U) {} LMEM->PSCCR &= ~(LMEM_PSCCR_INVW0_Mask |lmem_psccr_invw1_mask); LMEM->PSCCR |=lmem_psccr_encache_mask; /* 使代码总线缓存失效并启用该缓存 (PCCCR) */ LMEM->PCCCR |=LMEM_PCCCR_INVW0_Mask |lmem_pcccr_invw1_mask |lmem_pcccr_go_mask; 虽然((LMEM->PCCCR &LMEM_PCCCR_GO_Mask) != 0U) {} LMEM->PCCCR &= ~(LMEM_PCCCR_INVW0_Mask |PCCCR = ~ (lmem_pcccr_invw0_mask | lmem_pcccr_invw1_mask); LMEM->PCCCR |=lmem_pcccr_encache_mask; } #endif/* __cortex_m == 4 */ 评估板 Re: RT1170 EVKB M4 memory speed 你好@cyberhelmer、 感谢您对 NXP MIMXRT 系列的关注! 恩智浦提供了基于 RT1050 的测试结果。你可以查看这份应用笔记和相应的软件:https://www.nxp.com/docs/en/application-note/AN12437.pdf https://www.nxp.com/products/i.MX-RT1050 我进行了快速比较,发现在 同步动态随机存取存储器(SDRAM) 写入测试期间,ANSW 使用了以下设置:正常内存属性、纯 32 位顺序写入和写入后的 DSB。 我们建议您参考本 ANSW 进行相应的实验。 致以最诚挚的问候, Gavin
View full article
h264 or similar formats on mimxrt595s Hello, I am currently working on a GUI for a wearable using lvgl, zephyr and GUI-Guider. We would like to have some more complex animations in our project, which are hard to recreate from scratch with the existing widgets and for that purpose we would like to implement small videos we can just drop into the UI when needed. I already was able to create a POC by converting a video to a series of pictures, but that takes a lot of flash space, as the compression is very limited that way. The idea was to use a better format like h264 or similar. But the support for that seems to be limited to the i.MX RT1050 out of the box. Is there some way to also get this running on the mimxrt595s, or does it not make sense? My research led me to believe, that it is not possible without linking ffmpeg libraries to our lvgl implementation, which surely would take some porting effort and take too much flash and RAM from our chip to make any sense. Am I right in this last assumption or is there a way to save resources in our situation? Best regards, Kai
View full article