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.

[参考译文] RM48L952:HalCoGen FreeRTOS vPortSWI 正在损坏存储器

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1133411/rm48l952-halcogen-freertos-vportswi-is-corrupting-memory

器件型号:RM48L952
主题中讨论的其他器件:HALCOGEN

我正在研发 Hercules HDK。  我生成了 HalCoGen FreeRTOS 代码、并且正在移植 LwIP v2。  发送 DHCP 数据包时遇到问题-我还没有通过 DHCP。

首先、我将使用来自 LWIP 的 sys_arch.c: https://github.com/lwip-tcpip/lwip/blob/master/contrib/ports/freertos/sys_arch.c

在存储器中构建 DHCP 数据结构后、LWIP 开始将缓冲区向下传递到硬件。  最终调用 sys_arch_protect(),进而调用 :pragma SWI_alias (vPortEnterCritical,2)

对 vPortSWI 的调用会将 r11、R12、LR 的随机数据写入 DHCP 缓冲区的中间。

vPortSWI

       stmfd  sp!、{r11、r12、lr}
       R12夫人    、spsr
       数   R12、R12、#0x20
       ldrbne R12、[LR、#-2]
       ldrbeq R12、[LR、#-4]
       LDR    r14、 表
       LDR    R12、[r14、R12、LSL #2]
       Blx    R12
       mfldd  sp!、{r11、r12、pc}^

我已经尝试将堆栈大小增加到8192 (堆65536)、但 vPortSWI 始终将这些寄存器保存到缓冲区的中间。  在寄存器"sp"的值之后、当调用接近 vPortSWI 的点时、似乎是有道理的、但是"sp"会在我的 DHCP pbuf 中加载一个地址。  不清楚为什么会发生这种情况。

有什么想法为什么会发生这种情况?  或者我应该检查的东西?

谢谢、
Matt

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

    我想我看到发生了什么。  我的 RAM 配置不正确。  在 HalCoGen 中、FIQ 堆栈基地址为0x08001100、恰好位于分配 DHCP 缓冲区的中间位置。  我将研究重新配置 RAM 分配、以便 FreeRTOS/LwIP/FIQ 不会发生冲突。

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

    您好、Matt、

    很高兴听到这个消息、请尝试一下、让我们知道您是否可以解决您的问题。

    --

    谢谢、

    Jagadish。

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

    这似乎解决了我的问题。  不过,我仍然有一个问题:

    这是 HalCoGen 为 RM48L950W_FreeRTOS 创建的链接器命令

    存储器

       引导程序(X) :origin=0x00000000 length=0x00000020
       内核 (RX):origin=0x00000020 length=0x00008000
       FLASH0 (RX):origin=0x00008020 length=0x00177FE0
       FLASH1 (RX):origin=0x00180000 length=0x00180000
       堆栈 (RW):origin=0x08000000 length=0x00000800
       Kram   (RW):origin=0x08000800 length=0x00000800
       RAM    (RW):origin=(0x08000800+0x00000800) length=(0x0003F800 - 0x00000800)
       
    /*用户代码开始(2)*/
    /*用户代码结束*/

    堆栈配置是我的软件的问题。  正常的非 FreeRTOS HalCoGen 配置为:

    存储器

       引导程序(X) :origin=0x00000000 length=0x00000020
       FLASH0 (RX):origin=0x00000020 length=0x0017FFE0
       FLASH1 (RX):origin=0x00180000 length=0x00180000
       堆栈 (RW):origin=0x08000000 length=0x00001500
       RAM    (RW):origin=0x08001500 length=0x0003EB00

    更改 HalCoGen FreeRTOS 版本以匹配非免费 RTOS (并调整 Kram、RAM)可更正我的问题。  这是一个 HalCoGen 错误吗?  为什么它只为堆栈保留长度= 0x800?

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

    您好、Matt、


    这是一个 HalCoGen 错误吗?  为什么它只为堆栈保留长度= 0x800?

    这不是 HALCoGen 错误、用户需要为自己的应用考虑堆栈大小。 用户可以在"RAM"选项卡的"HALCoGen"中配置此堆栈大小。

    --

    谢谢、此致、

    Jagadish。