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.

TMS570LC4357: f021 flash API问题咨询

Part Number: TMS570LC4357

我在链接脚本中指定了flashAPI,如下所示

在代码中我调用了一部分Fapi接口对片内flash进行擦写操作,按理来说编译出的文件中flashAPI不会出现在.text section中,而是都在flashAPI section中,但是从编译后的.map文件看到,.text section中还是存在一部分代码,如下所示:

根据反汇编来看,这些.text section中的只是简单地跳转指令

这种情况是什么原因?如何避免?flash api要求将代码段都copy到sram中才能运行,这种情况会不会导致flashAPI的调用出错?

注:我们没有使用CCS IDE进行编译,而是从TI官网下载了编译工具链ti-cgt-arm_20.2.7.LTS,在linux服务器端完成的编译工作

  • 您好,

    根据您提供的信息,您在链接脚本中指定了flashAPI,并且调用了一部分Fapi接口对片内flash进行擦除和写入操作。您期望编译后的代码中,flashAPI应该都在flashAPI section中,而不是在.text section中。然而,根据您提供的编译后的.map文件和反汇编结果,似乎仍然存在一部分flashAPI代码在.text section中。这可能是由于链接器的优化策略导致的。链接器会尝试将代码段进行优化和重排,以提高执行效率和减少存储空间的使用。因此,一些flashAPI代码可能被链接器移动到.text section中,并用简单的跳转指令进行引用。

    要避免这种情况,您可以尝试在链接脚本中显式地指定flashAPI的代码段位置,以确保它们被放置在flashAPI section中。

    关于flashAPI的调用是否会出错,如果flashAPI的代码段被正确地复制到SRAM中并能够正确执行,那么调用应该不会出错。但是,由于您的代码中存在一些flashAPI代码仍然在.text section中,并通过跳转指令进行引用,可能需要确保跳转指令的目标地址是正确的。否则,可能会导致flashAPI的调用出错。建议您仔细检查链接脚本的配置和代码中对flashAPI的调用,确保flashAPI的代码段正确地被复制到SRAM中,并且跳转指令的目标地址正确。

  • 要避免这种情况,您可以尝试在链接脚本中显式地指定flashAPI的代码段位置,以确保它们被放置在flashAPI section中。

    我已经显式指定了flashapi的代码段load在flash,run在SRAM中,但在.text section中还是有上面第二张图的这些代码,请问我是遗漏了哪里吗?

    MEMORY
    {
        FLASH0  (RX)  : origin=(OS_START_ADDR) length=0x001E8000 vfill=0xFFFFFFFF     
        FLASH1  (RX)  : origin=0x00200000 length=0x00200000 vfill=0xFFFFFFFF
        FLASH7  (RX)  : origin=0xF0200000 length=0x00020000 vfill=0xFFFFFFFF
        STACKS  (RW)  : origin=(RAM_BASE) length=(TOTAL_STACK_SIZE)
        DATA    (RWX) : origin=(DATA_ADDR) length=(DATA_SIZE)
        FLASHAPI(RWX) : origin=(FLASH_API_RUN_ADDR) length=(FLASH_API_RUN_SIZE)
        RESERVED(RX)  : origin=(SRAM_RESERVED_ADDR) length=(SRAM_RESERVED_SIZE)
    }
    
    SECTIONS
    {
        .flashAPI
        {
            --library="./src/F021.lib" (.text)
        } load = FLASH0, run = FLASHAPI, LOAD_START(g_apiLoadStart), RUN_START(g_apiRunStart), SIZE(g_apiLoadSize)
        ......

    另外还有个问题,我在擦除、写入操作时,是否需要关闭中断?也就是说flash的擦写操作是否可以被中断打断?

  • 您好,

    根据您提供的链接脚本,您已经明确指定了flashAPI代码段的加载和运行位置。然而,您仍然在.text段中看到了一些代码。这可能是由于编译器的优化策略导致的,编译器可能会将某些跳转指令放在.text段中以优化代码执行。为了避免这种情况,您可以尝试使用编译器的选项来禁用或调整优化策略。

    至于您的第二个问题,关于在执行flash擦除和写入操作时是否需要关闭中断。一般来说,为了确保数据的一致性和正确性,执行flash擦除和写入操作时建议关闭中断。这样可以防止在操作过程中发生中断,从而避免可能导致数据损坏的情况。然而,如果您的应用对实时性要求很高,您可能需要权衡中断关闭带来的影响,并根据具体情况做出决策。

    请注意,关闭中断可能会影响系统的性能和响应能力,因此在决定是否关闭中断时,需要综合考虑应用的实时性要求和系统的其他需求。

  • 为了避免这种情况,您可以尝试使用编译器的选项来禁用或调整优化策略。

    我需要修改哪个编译选项?

    flash的哪些操作是不能被打断的?

  • 我需要修改哪个编译选项?

    编译选项包括优化级别、目标平台、代码生成选项等

    flash的哪些操作是不能被打断的?

    flash的擦除和写入操作是不能被打断

  • 为了避免这种情况,您可以尝试使用编译器的选项来禁用或调整优化策略。

    您并没有回答我的问题,我想知道我应该添加哪个编译选项来保证flashAPI的代码段不会出现在.text段中?

  • 您好,

    您可以添加

    -ffunction-sections
    -fdata-sections
    编译选项。这将使编译器将每个函数和数据放置在单独的节中。

  • 我的代码段放在flash bank0,且只占用了前4个sector;flashAPI拷贝至sram运行

    当我通过调用flashAPI对bank0的sector14、15进行擦除时板子卡死

    这种情况可能是什么原因呢?

  • 您好,

    可能是flashAPI在运行时需要使用一些临时变量或缓冲区来执行擦除操作。

    如果这些变量或缓冲区位于sram的地址范围内,可能会与已经存储在该区域的代码或数据发生冲突,导致板子卡死。

  • 我的DATA和FLASHAPI没有重叠部分

  • 您好,

    如果您的DATA和FLASHAPI没有重叠部分,那么您可以在两者之间进行分离和区分。

    通常,DATA段用于存储程序的全局和静态变量,以及堆栈和堆等运行时数据。而FLASHAPI段用于存储程序的代码和只读数据。

    您可以按照以下步骤来分离DATA和FLASHAPI段:

    1. 首先,查看您的编译器和链接器的文档,了解如何在代码中显式地将变量和函数放置在特定的段中。这通常涉及使用特定的编译器指令或链接器脚本。

    2. 在您的代码中,使用适当的编译器指令或注释来将变量和函数放置在DATA或FLASHAPI段中。例如,对于全局变量,您可以使用类似于以下的编译器指令:

    #pragma DATA_SECTION(variable_name, "data_section_name")
    int variable_name;

    对于函数,您可以使用类似于以下的编译器指令:

    #pragma CODE_SECTION(function_name, "flashapi_section_name")
    void function_name() {
        // 函数代码
    }

    请注意,"data_section_name"和"flashapi_section_name"是您自己定义的段名称。

    3. 在链接器脚本中,将DATA和FLASHAPI段分配给适当的存储区。您可以根据自己的需求和硬件平台进行调整。例如,您可以在链接器脚本中添加类似于以下的语句:

    SECTIONS {
        .data : {
            /* DATA段的定义和配置 */
        }
        .flashapi : {
            /* FLASHAPI段的定义和配置 */
        }
    }