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.

[参考译文] CCS/TM4C1294NCPDT:使用LM闪存编程器刷新elf文件

Guru**** 2587345 points
Other Parts Discussed in Thread: UNIFLASH, TM4C1294NCPDT, SYSBIOS

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/602696/ccs-tm4c1294ncpdt-flashing-elf-file-using-lm-flash-programmer

零件号:TM4C1294NCPDT
主题中讨论的其他部件:UNIFLASH,, SysBIOS

工具/软件:Code Composer Studio

大家好,

目前我正在处理外部闪存和RAM,能够成功地刷新TI编译器项目的.bin文件,但当我切换到GCC项目时,无法使用此工具刷新输出文件.out (ELF32),如果我使用objcopy转换为.bin格式, 生成的bin文件的大小为1 GB (因为ELF有内存间隙,直接转换为bin)。 有没有人能帮我说明如何使用与LM闪存编程器兼容的内存压缩转换成bin格式。

提前感谢。

此致,

——Prajnith

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    您是否尝试使用Uniflash www.ti.com/.../uniflash 直接加载您的elf文件?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Charles:

    是的,我尝试了闪存elf,直接转换了十六进制和S19文件,但没有成功。 仅当我通过调试器运行时,代码才会执行

    -Prajnith
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Prajnith:
    我会将您的帖子转到CCS论坛,那里的同事可能会帮助您解决问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们已设法解决了大bin文件的问题,但bin文件不会执行,除非通过调试模式运行。 我们的地址入口点为_c_int00,但当Micro正常开机时,它不会执行。 如何在lds链接器文件(gcc)中添加入口点并定义固定地址?

    谢谢

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

    我们已设法解决了大bin文件的问题,但除非通过调试模式运行,否则bin文件将无法执行。 我们将地址入口点设置为_c_int00,但当Micro正常开机时它不会执行。

    如果使用GCC ARM semihosting支持,设备将无法在调试器之外成功运行,因为semihosting支持使用BKPT指令,这会导致设备停止,除非使用调试器 附加以在断点后恢复目标。

    如果已链接rdimon库,则程序将使用半宿主支持,需要将该库更改为nosys库,以允许设备在调试器之外运行。

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

    谢谢,是的,禁用半宿主后,此问题已解决。 再次感谢您的快速帮助和支持。 我的下一个问题是我尝试从外部闪存执行,我已修改链接器和gel文件以指向外部闪存,但在自动生成的linker.cmd文件中,它仍然指向0x00。 我已经为此创建了一个单独的线程,但它仍然未解析。 我尝试使用向导工具来修改内存位置,但不幸的是,我发现对于M4皮层和TIVA设置,向导工具不允许修改内存布局,不确定我做了什么错误。 我们是否有其他方法可以修改自动生成的linker.cmd以指向EPI地址??

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

    Prajnith Kumar 说:
    我已为此创建了一个单独的线程,但该线程仍未解决。[/QUOT]您能否澄清问题:

    A)使用GCC编译器创建的程序 在通过LM Flash编程器和TI引导加载器编程到外部闪存之后,无法从外部EPI闪存正常运行。

    B)您无法通过CCS调试器将程序下载到外部闪存。

    如果问题是b) 通过LM闪存编程器和TI引导加载器将程序写入外部闪存后,您可以使用CCS调试器 手动启动 来调试闪存中的现有程序,而无需CCS调试器尝试写入外部闪存。 您将需要按照您的其他 EK-TM4C129EXL:调试运行在EPI闪 存线程上的固件来更改GEL函数,以便CCS调试器考虑外部闪存可由调试器读取。

    我不相信CCS调试器知道如何对外部闪存进行编程,尽管我没有带外部EPI闪存的TIVA板来对其进行测试。

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

    我面临的问题是,当我将闪存和RAM的地址更改为链接器(LSD)文件和Gel文件中的EPI,即0x6000万和0xA0万 (我不记得确切的零),并尝试构建时,我收到错误,说明闪存和ram的位置超过了, 如果查看自动生成的linker.cmd文件,则闪存和SRAM位置仍设置为0x0万和0x2000万。 我不知道如何确保linker.cmd文件指向与我在LSD (链接程序文件)和Gel文件中设置的闪存和SRAM位置相同的闪存和SRAM位置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我遇到的问题是,当我将闪存和RAM的地址更改为EPI时,链接器(LSD)文件和gel文件中的0x6000万和0xA0万 (我不记得确切的零),并尝试构建时,我收到闪存和ram位置超出的错误, 如果查看自动生成的linker.cmd文件,则闪存和SRAM位置仍设置为0x0万和0x2000万。

    我假定提到自动生成 的linker.cmd文件意味着您正在使用基于TI-RTOS或SYS/BIOS的项目。

    我查看 了TM4C1294NCPDT的SYS/BIOS项目示例,闪存和SRAM存储器区域仅在 项目根目录的TM4C1294NCPDT.lds文件中指定, 且未在 自动生成的linker.cmd文件中指定闪存和SRAM存储器区域。

    是否可以发布完整的项目,或者无法发布.cfg文件的内容?

    另外,正在使用哪个版本的SYS/BIOS或TI-RTOS?

    根据可用信息,不确定.cfg文件中的某些内容是否导致将冲突的内存区域添加到 自动生成的linker.cmd文件中。

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

    您好,Chester,

    是的,您正确了它是TIRTOS/SysBIOS项目。 我附上了一个示例GCC项目,发现了相同的溢出问题。

    为您提供有关工具的详细信息

    编译器:GNU 4.9 ................................3.

    TI-RTOS:2.16 .1.14

    XDC:3.32 .0.06

    请在下面查找错误日志

    Makefile:150:目标'gpiointerrupT_EK_TM4C129EXL_GNU_TivaTM4C129ENCPDT.out的配方失败
    C:/ti/ccsv7/tools/compiler/gcc-arm-no-eabi-4_9-2015q3/bin/./lib/gcc/arm-no-eabi/gnota.3/././././././././arm-none-eabi/bin/ld.exe 4.9 :地址0x3c gpiocc/no-eabi/eabi_extran.ctf_expia_ex9tm_intc_intc_ex4cp ` p在区域内`
    C:/ti/ccsv7/tools/compiler/gcc-arm-none-eabi-4_9-2015q3/bin/./lib/gcc/arm-none-eabi/gna.3/././././../arm-none-eabi/bin/ld.exe 4.9 :gpiointerrup_tve_none-eabi/tngnu_tf_fl.3/e.3/.pngf_exc_excf_ex4cfar_cn.``
    C:/ti/ccsv7/tools/compiler/gcc-arm-no-eabi-4_9-2015q3/bin/./lib/gcc/arm-no-eabi/gnota.3/././././././././arm-none-eabi/bin/ld.exe 4.9 :地址0x3c gpiocc/no-eabi/eabi_extran.ctf_expia_ex9tm_intc_intc_ex4cp ` p在区域内`
    C:/ti/ccsv7/tools/compiler/gcc-arm-no-eabi-4_9-2015q3/bin/./lib/gcc/arm-no-eabi/gnota.3/././././././././arm-none-eabi/bin/ld.exe 4.9 :地址0x3c gpiocc/no-eabi/eabi_extran.ctf_expia_ex9tm_intc_intc_ex4cp ` p在区域内`
    C:/ti/ccsv7/tools/compiler/gcc-arm-none-eabi-4_9-2015q3/bin/./lib/gcc/arm-none-eabi/arm.3/./././../arm-none-eabi/bin/ld.exe 4.9 :区域`闪存'溢出-1611749449字节
    collect2.exe:错误:LD返回1个退出状态
    gmake [1]:***[gpiointerrupT_EK_TM4C129EXL_GNU_TivaTM4C129ENCPDT.UT]错误1
    gmake:***[All]错误2
    Makefile:146:目标'All'的配方失败

    e2e.ti.com/.../gpiointerrupt_5F00_EK_5F00_TM4C129EXL_5F00_GNU_5F00_TivaTM4C129ENCPDT.zip

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

    我在cfg文件中添加了下面列出的代码行,现在可以在外部闪存中执行固件,尝试了相同的SRAM,但最终生成了大的bin文件,需要弄清楚如何修复。 我已经没有.vtable的加载,但它仍然导致了问题。 请告诉我您的想法

    Program.sectMap[".intvecs"]=新Program.SectionSpec();
    Program.sectMap[".intvecs"].loadAddress = 0x6002万;

    Program.sectMap["_intvecs_base_address"]=新Program.SectionSpec();
    Program.sectMap["_intvecs_base_address"].loadAddress = 0x600.2003万C;

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

    已解决此问题

    下面是我的链接程序脚本,并在cfg文件中添加了几行

    /************** 这是链接器脚本********************** /

    内存

    Flash (RX):原始= 0x600.2003万C,长度= 0x10万
    SRAM (WX):原点= 0x2000万,长度= 0x4万
    XSRAM (WX):原点= 0xA0万,长度= 0x10万
    }

    region_alias ("region_text",flash);
    region_alias ("region_BSS",XSRAM);
    region_alias ("vtable_region_data",SRAM);
    region_alias ("region_data",XSRAM);
    region_alias ("region_stack",XSRAM);
    region_alias ("region_heap",XSRAM);
    region_alias ("region_arm_EXIDX",flash);
    region_alias ("region_arm_extAB",flash);

    部分{

    提供(_intvecs_base_address =)
    已定义(_intvecs_base_address)? _intvecs_base_address:0x600.2003万C);


    intvecs (0x6002万):在(0x6002万){
    保留(*(.intvecs))
    }> region_text

    提供(_vtable_base_address =
    已定义(_vtable_base_address)? _vtable_base_address:0x2000万);


    .vtable (_vtable_base_address)(NoLoad):{
    保留(*(.vtable))
    }> vtable_region_data

    文本:{
    创建对象符号
    *(.text)
    *(.text.*)
    。 =对齐(0x4);
    保留(*(.ctors))
    。 =对齐(0x4);
    保留(*(.ditors))
    。 =对齐(0x4);
    __init_array_start =.;
    保留(*(.init_array*)
    __init_array_end =.;
    *(.init)
    *(.fini*)

    }> region_text AT> region_text

    提供(__etext =.);
    提供(_etext =.);
    提供(图文=.);

    .rodata:{
    *(.rodata)
    *(.rodata*)
    }> region_text AT> region_text

    数据:对齐(4){
    __data_load__= LOADADADADDDR (.data);
    __data_start__=.;
    *(.data)
    *(.data*)
    。 =对齐(4);
    __data_end__=.;
    }> region_data AT> region_text

    arm.exidx:{
    __exidx_start =.;
    *(.arm.exidx*.gu.linkonce.armexidx.*)
    __exidx_end =.;
    }> region_arm_EXIDX AT> region_arm_EXIDX

    arm.extab:{
    *(.arm.extab*.gnu.linkonce.armextab.*)
    }> region_arm_extAB at > region_arm_extAB

    bss:{
    __bss_start__=.;
    *(.shbss)
    *(.BSS)
    *(.bss.*)
    *(普通)
    。 =对齐(4);
    __bss_end__=.;
    }> region_BSS AT> region_BSS

    堆:{
    __heap_start__=.;
    end =__heap_start_;
    _end =结束;
    __end = end;
    Keep(*(.heap))
    __heap_end__=.;
    __HeapLimit =__heap_end__;
    }> region_heap at > region_heap
    堆栈(NoLoad):对齐(0x8){
    _stack =.;
    __stack =.;
    Keep (*(.stack))
    }> region_stack at > region_stack

    }


    /************** 链接器脚本结束********************** /



    /************** 这是cfg部分代码-复制到cfg文件********** /


    Program.sectMap[".intvecs"]=新Program.SectionSpec();
    Program.sectMap[".intvecs"].loadAddress = 0x6002万;

    Program.sectMap["_intvecs_base_address"]=新Program.SectionSpec();
    Program.sectMap["_intvecs_base_address"].loadAddress = 0x600.2003万C;





    谢谢
    ——Prajnith