Multi Source Translation Content

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

Multi Source Translation Content

讨论

排序依据:
如何使用 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- 提供了我的更改列表。 顺祝商祺! 帕维尔
查看全文
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などの第三者プロバイダーに連絡する必要があります。 よろしくお願いします、 ジュリアン
查看全文
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
查看全文
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。流程图如下所示:
查看全文
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:
查看全文
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をご確認ください。変更点の一覧も記載しています。 よろしくお願いいたします。 パベル
查看全文
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を参照することをお勧めします。 よろしくお願いします、 ギャビン
查看全文
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
查看全文
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
查看全文
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
查看全文
LS1012A 无法自动启动 你好,我使用的 ls1012a 板很好。 启动不像前一阵子的照片那样。 我想知道问题出在哪里。
查看全文
Integration of UDS Bootloader and J1939 Stack on CAN   Description: Hi Team, I am working on S32K344 using S32DS 3.6.5 with RTD 3.0.0 Current implementation: FlexCAN CAN communication UDS bootloader over ISO-TP J1939 application communication GCC compiler AUTOSAR RTD drivers I need guidance regarding coexistence of: UDS diagnostics (ISO14229) ISO-TP transport layer J1939 communication stack ensure CAN termination resistor configuration shall be select through software in S32k344 and How to do ? explain how CAN termination will designed in transceiver and MCU  Questions: What is the recommended architecture for running UDS and J1939 simultaneously on same CAN controller? Is it recommended to use separate CAN message buffers for UDS and J1939? How should CAN ID filtering be configured? Are there any NXP reference examples for: UDS bootloader J1939 stack Shared FlexCAN usage Any known limitations in RTD 3.0 for this use case? Controller: S32K344 RTD 3.0 S32DS 3.5 Thanks. 
查看全文
Jellytide 是合法尝试吗?2026 年回顾 Jellytide 正在成为 2026 年最受关注的备灾系统之一 ,因为它专注于现实的停电生存策略,而不是好莱坞式的恐惧策略。该计划由退伍军人丹尼尔斯创建,结合了实用指南、分步视频和受军事启发的规划,以帮助家庭为长期停电、网络威胁和紧急情况做好准备。Jellytide 准备就绪 它的与众不同之处在于其方便初学者使用的方法。 该系统不是推销昂贵的掩体或复杂的救生装备,而是专注于经济实惠的实际行动,例如储水、备用电源、粮食安全、EMP 保护和家居准备。许多用户赞赏该指南将所有内容分解成简单的周末项目,普通家庭也能真正实施。 2026 年, 随着人们对电网不稳定、恶劣天气和供应链中断的担忧与日俱增,备灾已从一个小众爱好转变为主流话题。Jellytide直接利用了这一趋势,为那些想要安心而又不想成为极端 “末日准备者” 的家庭提供结构化的生存路线图。 值得购买吗? 对于正在寻找实用备灾蓝图的人们来说,答案似乎是肯定的。其价值来自于系统的组织性、简洁性和对现实世界的关注。不过,指南只有在用户实际应用这些策略时才能发挥作用。它最适合那些愿意采取循序渐进的行动来提高家庭复原力和应急准备的人。 查看更多https://tinyurl.com/2epyz5wu
查看全文
Regarding power estimation tool for S32K328 MCU I'm using S32K328 as functional MCU and S32K341 as safety MCU in my application. I want to know if there is any power estimation tool available for these ICs. If yes kindly let me know where i can find it for my use case. Thanks. Re: Regarding power estimation tool for S32K328 MCU Hello @Abhinavv_007, For now, you can refer to the S32K Power Estimation Tool (PET). It includes a limited number of devices, but it may prove useful. I've also sent you a private message here in community regarding some preliminary information for S32K3X8 devices. Lastly, kindly refer to chapter 6.7 (Supply Currents) from the S32K3XX's Data Sheet document, where the STANDBY, Low speed RUN, and RUN supply currents are noted. This may prove useful as reference information. Best regards, Julián
查看全文
如何在 imx6sx 中处理浮点数值 各位专家好, 我正在使用 imx6sx 将现有程序移植到自定义主板上。 此前,它使用的是 P1011 CPU。 环境是 Yocto BSP 5.15.52-2.1.0。 问题是,在将通过通信接收到的浮点数值存储到结构中时,会出现信号错误。 我问了 gemini,发现如果对齐不正确,可能会发生这种情况, 但是由于我使用的是外部库(我收到的是二进制库), 我想知道如何在不修改源代码的情况下解决这个问题。 我问过人工智能,得到了一些提示,但没有成功 衷心感谢 i.MX6SoloX i.MX7 双核
查看全文
Time Drift in PCF85063TP/1Z RTC We are using the PCF85063TP/1Z RTC in our temperature logger product for maintaining time stamps during temperature data logging. During testing, we observed time drift issues across multiple boards, where each board shows a different amount of drift over time. In our current hardware design, we are using a 12.5 pF load capacitance crystal. Based on this, we updated the RTC register setting by configuring the CAP_SEL bit to ‘1’ to match the crystal load capacitance requirement. After making this configuration change, we are still observing approximately 2 seconds of drift in real-time operation. We would like to understand: Whether this level of drift is expected for the PCF85063TP/1Z. If there are any recommended register configurations or calibration methods to improve RTC accuracy. Whether PCB layout, crystal selection, or other hardware considerations could contribute to the observed variation between boards. Kindly provide your recommendations and guidance for improving RTC timing accuracy in this application. Re: Time Drift in PCF85063TP/1Z RTC Hello, Please see application note AN11247 Improved timekeeping accuracy with PCF85063, PCF8523 and PCF2123 using an external temperature sensor Hope this helps!
查看全文
S32K344の消費電力評価について これは、デフォルトで2つのコアを使用した場合の消費電力の推定値ですか?また、各周辺機器を選択した後、内部で追加の電流要件が発生します。これはどういう意味ですか?また、自分で評価する必要がありますか?現在選択されている周辺機器は使用する必要があるものですが、内部での追加電流要件は設定されていません。この消費電力の推定値162.13mA/535.03mWは信頼できるものですか? 回复: 关于S32K344功耗评估问题 こんにちは、ノースストリートのオールドドライバーポテンシャルキング データシートには、テスト対象の周辺機器の状態を一覧にした表も掲載されています。 回复: 关于S32K344功耗评估问题 ご回答ありがとうございます。2点目についてですが、この表には、クロック速度160MHz、デュアルコアとシングルコア、一部の周辺機器がオフになっていない状態での消費電力が記載されています。これは、一部の周辺機器がオフになっていないことを意味します。どの周辺機器がオフになっていないか教えていただけますか?それとも、すべての周辺機器がオンになっている状態での消費電流でしょうか?私の質問は、S32K344がRUNモードで、EMAC、LPI2C、QuadSPI、TempSense、eDMA、eMIOSが有効になっている場合、この消費電流の基準値はどの程度意味があるのでしょうか?PETの消費電力に基づくと、少し低いように思えますが、いかがでしょうか? Re: 关于S32K344功耗评估问题 こんにちは、ノースストリートのオールドドライバーポテンシャルキング この消費電力評価ツールはメンテナンスされておらず、一部の消費電力データは最新のデータシートと異なる場合があります。 最新のデータシートを参照することをお勧めします。 Revを使用しました。2025年11月13日~12日、最新バージョンはRev.14です。 1. この表では、クロック速度160MHz、デュアルコア、シングルコア、周辺機器オフ時の消費電力を確認できます。 2. この表では、クロック速度160MHz、デュアルコア、シングルコアの場合の消費電力、および一部の周辺機器がオフになっていない場合の消費電力を確認できます。
查看全文
Sch of RDA8420TEIS0 Hi there, I am Hong in Australia.  I am going to design a BMS with EIS, and going to use BMA7418, 6402, 8420 etc.  but in terms of generating AC excitation signal, I could not figure out.  can you tell me how this board RDA8420TEIS0 generates AC excitation signals.  can  you post the schematic ?  how those parts Q1, Q2, D2, D3, the inductor and the  cap work ?  I can't figure out, can you please help ? cheers H-Bridge Driver Re: Sch of RDA8420TEIS0 HI  You can try to download this board from below link for reference. https://www.nxp.com/design/design-center/development-boards-and-designs/EVBMA8420T
查看全文
S32DSおよびRTDライブラリのCI/CD こんにちは、 S32DS、RTD、freeRTOSの.mexプロジェクトをCI/CDパイプライン(GitHub、Gitlab、Jenkinsなど)に完全に統合できた人はいますか? この記事を読んだのですが、まだ不明瞭な点がたくさんあるように思います。 CI/CDのベストプラクティス S32DSのDockerイメージも利用可能であることが分かりましたが、それらは使用できますか? NXPから、これを実装するための公式な手順書はありますか? ありがとう。
查看全文
RDA8420TEIS0 的 Sch 你好,我是澳大利亚的 Hong。 我打算设计一个带有 EIS 的电池管理系统,并打算使用 BMA7418、6402、8420 等,但是在生成交流激励信号方面,我无法弄清楚。你能告诉我这个主板 RDA8420TEIS0 是如何产生交流励磁信号的。能贴出原理图吗? Q1、Q2、D2、D3、电感器和电容器是如何工作的? 我想不明白,能帮帮我吗?欢呼声 H桥驱动器 Re: Sch of RDA8420TEIS0 你好 你可以尝试从下面的链接下载这个主板以供参考。 https://www.nxp.com/design/design-center/development-boards-and-designs/EVBMA8420T
查看全文