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.

[参考译文] Linux/processor-SDK-AM335X:SPL malloc 挂起

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/634226/linux-processor-sdk-am335x-spl-malloc-hangs

器件型号:PROCESSOR-SDK-AM335X

工具/软件:Linux

U-Boot 版本: U-Boot 2013.07

我们有基于 Beaglbone Black 的定制板。

我们拥有256MB DDR 和4GB eMMC、  

我们将添加具有512MB DDR 和8GB eMMC 的新电路板。

我们计划在 EEPROM 中放置板版本、并读取相同的内容以确定从哪个板 SPL 引导(例如256MB 或512MB DDR)、并根据板版本初始化 DDR

现在、我在(特定于工程) board.c 和的 s_init()函数中添加了代码

添加几个 printf 后,我发现 spi.c 中的函数 spi_do_alloc_slave (U-Boosource/drivers/spi/)在处挂起

ptr = malloc (size) 

我从板配置中看到了这一点

/*
1MB 到 SDRAM 中、以允许 SPL 在 SDRAM 开头的 BSS
*在将该地址预留给 u-boot.img 的
*标头之前为64字节。 即0x800FFFC0-0x80100000不应用于
任何*其他需求。
*/
#define CONFIG_SYS_TEXT_BASE0x80800000
#define CONFIG_SYS_SPL_MALLOC_START0x80a08000
#define CONFIG_SYS_SPL_MALLOC_SIZE0x100000 

因此、如果认为 malloc start 是 DDR 中的、而 DDR 未被初始化、则会使 malloc 函数挂起。

然后、我更改了代码、如下所示、

#include 
#include 
#include 

静态结构 SPI_SLAVE GLOBAL_PTR_EEPROM;


void * SPI_DO _alloc_SLAVE (int offset、int size、unsigned int bus、
unsigned int cs)
{
struct SPI_Slave *从属设备;
void * ptr;
ptr =&global_ptr_eeprom;

。 剪切

.} 

这似乎起作用了

当我看到 u-boot-spl.map 文件时、我看到指针位于 DDR 段中。

.bss.global_ptR_EEPROM
0x0000000080a004b4 0xc drivers/spi/libspi.o
0x0000000080a004c0 。 =对齐(0x4)
0x0000000080a004c0 __bss_end =。
将.text 段的地址设置为0x402f0400 

现在它似乎可以工作,但 我不明白怎么做!!

因为现在还有一个变量位于 DDR 中,在 DDR 初始化之前它 是如何工作的?

我在这里错过了什么吗?

有什么建议?

此致、

Ankur




  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    u-boot 版本与 TI SDK 的版本不同。 您是否可以使用最新的 SDK u-boot?

    Steve K.

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

    您好、Steve、

    它来自 TI SDK、我正在对该版本进行更改。

    工作正常,我不明白 为什么在 DDR 初始化失败之前 malloc,但在同一 DDR (DDR 初始化之前)中的静态分配工作正常。

    静态分配转到 BSS 部分、该部分在配置文件中定义如下

    #define CONFIG_SPL_BSS_START_ADDR0x80a00000
    #define CONFIG_SPL_BSS_MAX_SIZE0x80000// 512 KB * 

    以上地址在 DDR 地址范围内。 现在、对于 malloc 地址空间、如下所示、

    /*
    1MB 到 SDRAM 中、以允许 SPL 在 SDRAM 开头的 BSS
    *在将该地址预留给 u-boot.img 的
    *标头之前为64字节。 即0x800FFFC0-0x80100000不应用于
    任何*其他需求。
    */
    #define CONFIG_SYS_TEXT_BASE0x80800000
    #define CONFIG_SYS_SPL_MALLOC_START0x80a08000
    #define CONFIG_SYS_SPL_MALLOC_SIZE0x100000 

    现在、我不了解 malloc 是如何工作的、但 DDR 中的静态分配是有效的(除非我认为在 DDR 中的 BSS 范围实际上不在 DDR 中)。

    谢谢、

    此致、

    Ankur

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有人能帮您解决这个问题吗?

    谢谢、

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

    我仍在研究这一点。 很抱歉耽误你的时间。

    Steve K.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没问题、Steve、我可以等待。
    感谢您的帮助、

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

    你找到了什么吗?

    谢谢、

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

    还没有。 您能否 发布包含更改的"git diff (git diff)"或补丁?

    Steve K.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您有 EVM、那就很难了
    您能否查看以下内容、
    在以下文件中更改 s_init 函数。
    `bootloader/board/ti/am335x/board.c`

    更改是在 DDR 初始化之前(在 CONFIG_DDR 函数调用之前)尝试执行 malloc。
    我确信它不会起作用。 但是静态分配会起作用。
    如果您看到 am335x_evm.h 文件、您会发现与我在上面提到的相同的定义。

    这是我有疑问的地方。

    谢谢、

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

    您是否能够复制它?

    谢谢、

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

    当我在 s_init 中放置一个 malloc 时、我可以重新生成电路板而不是引导。 但是、然后我修改了 SPI 代码、以匹配您在 s_init 中所做的和调用的例程、电路板挂起且不会引导。 我假设您在 s_init 中调用了 SPI 例程?

    Steve K.

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

    是的、完全正确、
    这就是我所做的、理想情况下、SPI 驱动程序也应在 s_init 中工作。
    奇怪的是,如果您看到文本 base CONFIG_SYS_TEXT_BASE 是0x80800000 (它在 DDR 右边?)
    SPL malloc CONFIG_SYS_SPL_malloc_start 地址为0x80a08000、这也在 DDR 中
    所以我不理解静态变量的工作原理、但尽管两者都在 DDR 中、但动态分配却不起作用。
    此外、我在 DDR 初始化之前读取了所有这些内容。