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