TI中文支持网
TI专业的中文技术问题搜集分享网站

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服务器端完成的编译工作

Gary Lu:

您好,

根据您提供的信息,您在链接脚本中指定了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中,并且跳转指令的目标地址正确。

,

user5769726:

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

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

MEMORY
{FLASH0(RX): origin=(OS_START_ADDR) length=0x001E8000 vfill=0xFFFFFFFFFLASH1(RX): origin=0x00200000 length=0x00200000 vfill=0xFFFFFFFFFLASH7(RX): origin=0xF0200000 length=0x00020000 vfill=0xFFFFFFFFSTACKS(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的擦写操作是否可以被中断打断?

,

Gary Lu:

您好,

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

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

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

,

user5769726:

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

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

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

,

Gary Lu:

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

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

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

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

,

user5769726:

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

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

,

Gary Lu:

您好,

您可以添加

-ffunction-sections

-fdata-sections

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

,

user5769726:

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

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

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

,

Gary Lu:

您好,

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

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

,

user5769726:

我的DATA和FLASHAPI没有重叠部分

,

Gary Lu:

您好,

如果您的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段的定义和配置 */}
}

赞(0)
未经允许不得转载:TI中文支持网 » TMS570LC4357: f021 flash API问题咨询
分享到: 更多 (0)