This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] am243x FreeRTOS 运行缓慢

Guru**** 1831610 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1327410/am243x-freertos-is-slow

您好

我们研究系统中的实时问题。

主要思路是测试任务对中断的响应时间(通过信标端口)并测量任务唤醒时间中的抖动。

设置:
125us 的中断、将信标布置到任务、随后发布另一个信标。
在2个位置/任务中对 CPU 时间戳计数器进行采样。 进行一次发送。

我们总共有2个跃点、即从 ISR 发布的信标、任务唤醒、采样时间、并且将信标布置到下一个较低优先级的任务、再进行采样。

我们将测量表示任务唤醒中抖动的时间戳差异。

随着每个新的"跳"抖动的增加、系统节拍(1毫秒)和抖动之间存在明显的相关性。

看起来 Tick 通知花费太多的时间或者 CPU 只是很慢。

我已检查 DDR 已缓存且两个 I/D 缓存均已打开。

是否可以检查 SOC 配置、是否可能某些 PLL/频率设置不正确?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    罗斯法尔

    如果您要在 EVM 上运行这些实验,请共享可重现的代码,以便小组能够密切分析您观察到的内容。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,穆库尔

    我实现了用于测量任务唤醒抖动的循环测试、请遵循 xSemaphoreTag/xSemaphoreGive 对。

    1、任务1由中断唤醒

    2.任务2由任务1唤醒

    3.任务3由任务2唤醒

    优先级1< 2< 3

    我 在每个任务中测量唤醒时间的抖动。

    如果我有一个任务抖动是几微秒、如果3个抖动低至28微秒、那么将任务一无作为是不合逻辑的。

    请遵循以下变量:

    e2e.ti.com/.../empty_5F00_am243x_2D00_evm_5F00_r5fss0_2D00_0_5F00_freertos_5F00_ti_2D00_arm_2D00_clang.zip

    此致

    罗斯法尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Raster:

    我正在查看您的问题,您可能希望在一两天内得到回复。

    此致、

    S.Anil.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我还无法解释的另一件事

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果我在以下之间进行交叉校验:FreeRTOS 节拍(1毫秒) 与定时器中断(125微秒)与 CPU 时间戳计数器、我可以获得 CPU 频率(R5内核)、 近似为13 MHz (!)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    罗斯法尔

    我相信您在过去评估过 AM64、并对其性能有一些重要反馈、可用于替代 AM57x。  

    AM24属于同一个系列-在为您的项目选择该器件之前进行了哪些预评估、在选择处理器时会评估哪些性能标准? 您正在努力实现哪些宏观 KPI。 您是否要评估器件或免费的 RTOS 产品-您是否有通过 AM24上的3P 的其他操作系统选择?

    当你做各种实验时、只是想了解大局。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mukul:

    FreeRTOS 对我们很有用。

    我们发现性能很低。  经过一周的测试后、我 设法将问题缩小为非常简单的问题:

    为什么我通过 CycleCounterP_getCount32和2个周期计时器(用于交叉检查)测量的 CPU 频率仅显示12956289.072268067Hz、而不是800MHz?  

    此致

    拉斯蒂  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您对此进行澄清。 让团队看看这个星期一、因为我确信某处存在断点-您的请求是合乎逻辑的。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,穆库尔

    1.我发现了错误测量时钟的原因 -这是 FreeRTOS 空闲挂钩中的 WFI 指令。

    2、当我删除它时、我使用与 SDK 版本9.0.0.35获得了非常好的测量结果

    3.版本8.6.0.43 (我们的版本)提供奇怪的数字。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    罗斯法尔

    为什么我用 CycleCounterP_getCount32和2个周期性计时器(用于交叉检查)测量的 CPU 频率不是800 MHz、而是12956289.072268067Hz?  [/报价]

    请分享这些实验是如何进行的。 您能分享一段代码吗?

    1. 我发现时钟测量错误的原因 -这是 FreeRTOS 空闲挂钩中的 WFI 指令。

    除非在计时器开始计时之前生成了另一个中断、否则 WFI 不应产生问题。 如果另一个 ISR/任务(较高优先级)中断内核、则频率计算会持续一个 TOSS。

    示例

    time_stamp(t1)

    delay(2 ms)

    time_stamp(t2)

    如果在 T2和 T1之间、有额外的上下文切换(而非切换到空闲和返回)、则 T2-T1不会是2ms。

    请分享您在这里指的是什么挂钩函数。

    2、当我删除它时、我使用与 SDK 版本9.0.0.35获得了非常好的测量结果

    3.版本8.6.0.43 (我们的版本)提供奇怪的数字。

    [/报价]

    请说明、这是否意味着对于9.0.0.35、如果您从空闲挂钩中移除 WFI、结果是否合理。 但是、即使您使用8.6.0.43执行同样的操作、结果仍然不正确?

    此致

    卡兰

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外、最好澄清一下是否有任何理由需要使用 SDK8.6、我希望对于像您这样的新开发、您将使用最新的 SDK 产品、即 SDK 9.0.1

    https://www.ti.com/tool/download/MCU-PLUS-SDK - AM243X/09.01.00.41

    与上一个版本相比、此版本中似乎有合理数量的错误修复

    https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/09_01_00_41/exports/docs/api_guide_am243x/RELEASE_NOTES_09_01_00_PAGE.html

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1.此应用程序使用 GCC (非 TI clang)编译。 操作(TI/Rasty)、以复制包含单个 ISR 和3个任务的简单应用(不应具有任何额外的代码块/功能)。

    2. Rasting 以共享用于编译应用程序的 GCC 编译器标志。 TI 将与编译器团队一起审阅。 怀疑用于 GCC 编译应用程序的标志不是最佳的。

    3.

    1. 我发现时钟测量错误的原因 -这是 FreeRTOS 空闲挂钩中的 WFI 指令。

    WFI 将停止 PMU、从而可能导致周期计数器的测量错误。

    此致

    卡兰

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我设法在您的示例之上重现了抖动。

    只需添加持续(紧密循环)填充大型阵列的低优先级任务就足够了。 CPU 耗尽缓存并需要缓存重新填充。

    一项任务可处理12uSecs 的抖动。 缓存重新填充是否可能需要12 uSecs?

    它还影响中断 反应时间。

    有人可以使用 IS DDR 和高速缓存设置进行查看吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Rasty,

    我们已经在工作台上测试了上述示例、并注意到 PMU 计时器无法正常工作。

    我们在应用中增加了 GTC 计时器、而不是使用 PMU 计时器、请尝试在您的工作台上进行检查、并分享您的测试结果。

    我尝试在 GCC 编译器中重现此问题并让您知道状态。

    e2e.ti.com/.../5125.empty_5F00_am243x_2D00_evm_5F00_r5fss0_2D00_0_5F00_freertos_5F00_ti_2D00_arm_2D00_clang.zip

    此致、

    S.Anil.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Raster:

    [报价 userid="359686" url="~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1327410/am243x-freertos-is-slow/5059599 #5059599"]

    只需添加持续(紧密循环)填充大型阵列的低优先级任务就足够了。 CPU 耗尽缓存并需要缓存重新填充。

    [/报价]

    您能否与我们分享可重现的代码,以便在我们身边进一步调试问题?

    [报价 userid="359686" url="~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1327410/am243x-freertos-is-slow/5059599 #5059599"]

    一项任务可处理12uSecs 的抖动。 缓存重新填充是否可能需要12 uSecs?

    [/报价]

    我们还需要使用其他接口来检查这个计时细节。

    如果您删除此缓冲区内存的非缓存,仍有抖动问题吗?

    此致、

    S.Anil.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好

    您可以监控这些计数器。

    您可以停止调试器并每次置0以重新开始测量。 您应该会看到接近125的值(除以800.0后)

    [0]是 ISR 周期时间

    [1]、[2]、[3]任务周期时间。

     e2e.ti.com/.../empty_5F00_am243x_2D00_evm_5F00_r5fss0_2D00_0_5F00_freertos_5F00_ti_2D00_arm_2D00_clang_5F00_1.zip

    尝试"按原样"、然后在主代码中注释掉。

    gHop4Task = xTaskCreateStatic( empty_hop4,/*指向实现该任务的函数的指针。 */
    gHop5Task = xTaskCreateStatic( empty_hop5,/*指向实现该任务的函数的指针。 */

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Raster:

    empty_am243x-evm_r5fs0-0_freertos_ti-arm-clang_1.zip

    在本例中,您只创建了一个任务? 我是否需要创建2个其他任务并在我身边检查?

    此致、

    S.Anil.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../3301.empty_5F00_am243x_2D00_evm_5F00_r5fss0_2D00_0_5F00_freertos_5F00_ti_2D00_arm_2D00_clang.zip

    您好  

    我上传了我在会议期间展示的示例。

    坦斯克

    罗斯法尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此主题的更新

    1.当较低优先级的任务填充大型缓冲区(32 x 10000 / 8字节= 40KB)和执行缓冲区复制时、TI 能够复制该问题并查看任务调度中的抖动。

    我们的期望是这将覆盖高速缓存内容、因此、另一线程执行和上下文切换需要时间、从而导致抖动。 通过将大缓冲区放在未缓存的 DDR 中来验证这一点、之后没有抖动。

    开放性问题

    • 较低优先级任务中使用的缓冲区应缓存在数据缓存中、而不是指令缓存中、因此不可能引起应该由指令缓存处理的指令抖动。
    • 12 us (我们在任务中看到的最大抖动)是否要加以说明?

    其他信息

    • ISR 执行时间<< 125us、结果为4-6us。

    后续步骤

    • 运行 PMU 分析以测量 I$和 D$的缓存未命中数据

    此致

    卡兰

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    3月6日更新

    TI 仍在执行上述操作、正在获取 PMU 数据。

    可用于此情况的示例- mcu_plus_sdk_am243x_09_01_00_41\examples\drivers\pmu\pmu_multievent\pmu_multievent.c

    此致

    卡兰

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    实验说明

    1. ISR 的 D$缺失也很高(可能是由于分析代码导致的)、因此当低优先级任务填充大型缓冲区(32 x 10000 / 8字节= 40KB)并进行缓冲区复制时、有必要影响 ISR 执行。

    ISR 中的 D$缺失大于4000。

    下一步是尝试将基准代码和缓冲区放在未缓存的存储器或 TCM 中。

    2.将时间戳代码移至 ISR (及任务)的开头可减少抖动,这可能是因为连续运行时由于缓存未命中而导致的增量是一致的。 最坏情况延迟127us (1.6%抖动)时、ISR 的命中率约为130us (4%抖动)。

    3. ISR 的执行时间如果低优先级任务没有填充大缓冲区的时间为1us、如果在其他任务中启用了缓冲区填充和复制、则执行时间增加到6us。

    如果您的团队做了任何其他实验? 请发布结果。 让我们在今天开会时确定接下来的步骤。

    此致

    卡兰

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    后续步骤

    1.查看 ISR 的连续执行时间。如果连续访问的时间不同、则时间差可能表现为抖动。

    2.在运行此实验时不缓存 TCM/DDR 中的分析代码。

    3.减小缓冲区的大小以查看对抖动的影响。 TI 尝试了4KB 而非40KB ->这降低了抖动。

    来自客户的快递

    1.将示例移动到内部 RAM

    TI 操作:如何将自动编码移动到内部存储器。 这样可以减少抖动、但不会消除抖动、因为当您从内部存储器运行时、缓存仍会进入画面中。

    如果事件位于 TCM 中、则不应出现抖动、因为 R5和 TCM 访问之间没有缓存。

    2.客户当前未使用 TCM 或内部存储器。

    3. DDR 频率- 1600MT/s

    4. TCP/IP -可能在未缓存的 DDR 中。

    此致

    卡兰

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好  

    同时、我们采用以下策略"

    内部、外部缓存和外部非缓存存储器有独立堆。 这种工作方式很好与 C++,由于过载的"新"/"删除"

    问题在于、FreeRTOS 不知道如何使用乘法堆、因此我们也会对 FreeRTOS 进行调整。

    我在 FreeRTOS 开发者论坛上讨论了此内容。

    下一步是根据段进行代码分离、它适用于 C、但不适用于 C++。

    需要 GCC 版本14。 如果您 可以为此工具链提供帮助、那就很好了。  L ARM 站点上的最新二进制文件用于13。

    此致

    罗斯法尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好  

    您能否提供有关如何将(附加属性到)自动生成的 ISR 包装器移动到特定存储器部分的说明:

    谢谢

    罗斯法尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Rasty,

    我尝试过两种方法。 一种方法是_attribute 方法、另一种方法是在链接器命令文件中将函数保留在.text 中。

    在我的测试中、我发现第二种方法很简单、因为我们不需要更新生成的文件。

    请尝试以下方法。 只需更新链接器 cmd 文件以将函数保留在 TCM 存储器中即可。

    也在同一链接器命令文件中定义了 TCMA 存储器大小。  

    /* This is the stack that is used by code running within main()
     * In case of NORTOS,
     * - This means all the code outside of ISR uses this stack
     * In case of FreeRTOS
     * - This means all the code until vTaskStartScheduler() is called in main()
     *   uses this stack.
     * - After vTaskStartScheduler() each task created in FreeRTOS has its own stack
     */
    --stack_size=16384
    /* This is the heap size for malloc() API in NORTOS and FreeRTOS
     * This is also the heap used by pvPortMalloc in FreeRTOS
     */
    --heap_size=32768
    -e_vectors  /* This is the entry of the application, _vector MUST be plabed starting address 0x0 */
    
    /* This is the size of stack when R5 is in IRQ mode
     * In NORTOS,
     * - Here interrupt nesting is enabled
     * - This is the stack used by ISRs registered as type IRQ
     * In FreeRTOS,
     * - Here interrupt nesting is disabled
     * - This is stack that is used initally when a IRQ is received
     * - But then the mode is switched to SVC mode and SVC stack is used for all user ISR callbacks
     * - Hence in FreeRTOS, IRQ stack size is less and SVC stack size is more
     */
    __IRQ_STACK_SIZE = 256;
    /* This is the size of stack when R5 is in IRQ mode
     * - In both NORTOS and FreeRTOS nesting is disabled for FIQ
     */
    __FIQ_STACK_SIZE = 256;
    __SVC_STACK_SIZE = 4096; /* This is the size of stack when R5 is in SVC mode */
    __ABORT_STACK_SIZE = 256;  /* This is the size of stack when R5 is in ABORT mode */
    __UNDEFINED_STACK_SIZE = 256;  /* This is the size of stack when R5 is in UNDEF mode */
    
    SECTIONS
    {
        /* This has the R5F entry point and vector table, this MUST be at 0x0 */
        .vectors:{} palign(8) > R5F_VECS
        /*.controlfnc:{} palign(8) > R5F_TCMA*/
    
    
        /* This has the R5F boot code until MPU is enabled,  this MUST be at a address < 0x80000000
         * i.e this cannot be placed in DDR
         */
        GROUP {
            .text.hwi: palign(8)
            .text.cache: palign(8)
            .text.mpu: palign(8)
            .text.boot: palign(8)
            .text:abort: palign(8) /* this helps in loading symbols when using XIP mode */
        } > MSRAM
    
        /* This is rest of code. This can be placed in DDR if DDR is available and needed */
        GROUP {
            .text:   {} palign(8)   /* This is where code resides */
            .rodata: {} palign(8)   /* This is where const's go */
        } > DDR ///MSRAM
    
        /* This is rest of initialized data. This can be placed in DDR if DDR is available and needed */
        GROUP {
            .data:   {} palign(8)   /* This is where initialized globals and static go */
        } > DDR ///MSRAM
    
        /* This is rest of uninitialized data. This can be placed in DDR if DDR is available and needed */
        GROUP {
            .bss:    {} palign(8)   /* This is where uninitialized globals go */
            RUN_START(__BSS_START)
            RUN_END(__BSS_END)
            .sysmem: {} palign(8)   /* This is where the malloc heap goes */
            .stack:  {} palign(8)   /* This is where the main() stack goes */
        } > DDR ///MSRAM
    
        /* This is where the stacks for different R5F modes go */
        GROUP {
            .irqstack: {. = . + __IRQ_STACK_SIZE;} align(8)
            RUN_START(__IRQ_STACK_START)
            RUN_END(__IRQ_STACK_END)
            .fiqstack: {. = . + __FIQ_STACK_SIZE;} align(8)
            RUN_START(__FIQ_STACK_START)
            RUN_END(__FIQ_STACK_END)
            .svcstack: {. = . + __SVC_STACK_SIZE;} align(8)
            RUN_START(__SVC_STACK_START)
            RUN_END(__SVC_STACK_END)
            .abortstack: {. = . + __ABORT_STACK_SIZE;} align(8)
            RUN_START(__ABORT_STACK_START)
            RUN_END(__ABORT_STACK_END)
            .undefinedstack: {. = . + __UNDEFINED_STACK_SIZE;} align(8)
            RUN_START(__UNDEFINED_STACK_START)
            RUN_END(__UNDEFINED_STACK_END)
        } > DDR ///MSRAM
    
        /* Sections needed put into TCM */
        GROUP {
            CRITICAL_DATA_SECTION:  {} palign(8)   /* critical data section */
            CRITICAL_TEXT_SECTION: {} palign(8)   /* critical text section */
        } > DDR ///MSRAM
    
        /* Sections needed for C++ projects */
        GROUP {
            .ARM.exidx:  {} palign(8)   /* Needed for C++ exception handling */
            .init_array: {} palign(8)   /* Contains function pointers called before main */
            .fini_array: {} palign(8)   /* Contains function pointers called after main */
        } > MSRAM
    
        /* General purpose user shared memory, used in some examples */
        .bss.user_shared_mem (NOLOAD) : {} > USER_SHM_MEM
        /* this is used when Debug log's to shared memory are enabled, else this is not used */
        .bss.log_shared_mem  (NOLOAD) : {} > LOG_SHM_MEM
        /* this is used only when IPC RPMessage is enabled, else this is not used */
        .bss.ipc_vring_mem   (NOLOAD) : {} > RTOS_NORTOS_IPC_SHM_MEM
        /* General purpose non cacheable memory, used in some examples */
        .bss.nocache (NOLOAD) : {} > NON_CACHE_MEM
    
    	GROUP {
        .text.TimerP_isr0 : {} palign(8)
        .text.TimerTick : {} palign(8)
    	} >  R5F_TCMA
    
    
         /*.DDR_UNCACHED.filebuf:   {} palign(8) > DDR_UNCACHED*/
    
    
    }
    
    
    
    
    /*
    NOTE: Below memory is reserved for DMSC usage
     - During Boot till security handoff is complete
       0x701E0000 - 0x701FFFFF (128KB)
     - After "Security Handoff" is complete (i.e at run time)
       0x701F4000 - 0x701FFFFF (48KB)
    
     Security handoff is complete when this message is sent to the DMSC,
       TISCI_MSG_SEC_HANDOVER
    
     This should be sent once all cores are loaded and all application
     specific firewall calls are setup.
    */
    
    MEMORY
    {
        R5F_VECS  : ORIGIN = 0x00000000 , LENGTH = 0x00000040
        R5F_TCMA  : ORIGIN = 0x00000040 , LENGTH = 0x00007FC0
        R5F_TCMB0 : ORIGIN = 0x41010000 , LENGTH = 0x00008000
    
        /* memory segment used to hold CPU specific non-cached data, MAKE to add a MPU entry to mark this as non-cached */
        NON_CACHE_MEM : ORIGIN = 0x70060000 , LENGTH = 0x8000
    
        /* when using multi-core application's i.e more than one R5F/M4F active, make sure
         * this memory does not overlap with other R5F's
         */
        MSRAM     : ORIGIN = 0x70080000 , LENGTH = 0x40000
    
        DDR       : ORIGIN = 0x80000000 , LENGTH = 0x80000
    
        /* This section can be used to put XIP section of the application in flash, make sure this does not overlap with
         * other CPUs. Also make sure to add a MPU entry for this section and mark it as cached and code executable
         */
        FLASH     : ORIGIN = 0x60100000 , LENGTH = 0x80000
    
    
        DDR_UNCACHED  : ORIGIN = 0x80080000 , LENGTH = 0x70000
        /* shared memory segments */
        /* On R5F,
         * - make sure there is a MPU entry which maps below regions as non-cache
         */
        USER_SHM_MEM            : ORIGIN = 0x701D0000, LENGTH = 0x180
        LOG_SHM_MEM             : ORIGIN = 0x701D0000 + 0x180, LENGTH = 0x00004000 - 0x180
        RTOS_NORTOS_IPC_SHM_MEM : ORIGIN = 0x701D4000, LENGTH = 0x0000C000
    }
    

    请查看"Memory Allocation"窗口。 上述两项功能  仅存储在 TCM 存储器中。

    我已经尝试过 TCMA、并对其他 存储器区域采用相同的过程 。

    此致、

    S.Anil.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的。 谢谢。 它有所帮助。