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.

[参考译文] MSP432E401Y:将引导加载程序与 NDK 和 RTOS 配合使用

Guru**** 2563630 points
Other Parts Discussed in Thread: MSP432E401Y

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/848783/msp432e401y-using-bootloader-with-ndk-and-rtos

器件型号:MSP432E401Y

我一直在研究引导加载程序的示例用法、目前来源于 SDK v.3.20.00.10。   主要我对开发将使用 tftp 上的以太网引导加载程序的应用程序感兴趣。   

我已经成功部署了 boot_serial_emac_flash 示例、所有这些示例都使用 lwip、并且没有任何 RTOS 实现。

我现在想开发一个使用 FreeRTOS 的示例、它还集成了 NDK、而不是用于 TCP/IP 设置的 lwip、但我很难使其正常工作。   添加此功能时、我需要注意哪些问题领域、或者是否不可能?

例如、我需要采取哪些主要步骤来调整'tcpecho'示例的 FreeRTOS 类型、以便通过以太网引导加载程序进行部署?

谢谢

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

    H iPatrick、

    因此、您需要一个基于 FreeRTOS + NDK 的引导加载程序

    1、使用 tftp 获取应用程序映像并将其放入非易失性存储器中。

    2.跳转至新应用程序

    对吧?  

    新的应用程序映像是否也使用 FreeRTOS 和 NDK?

    为什么不使用现有 的 boot_serial_emac_flash 示例、然后将新的应用程序映像简单地基于 FreeRTOS 和 NDK?

    Todd

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

    Todd、您好、感谢您的回复。

    两个点都正确!

    我已按照您的建议进行了尝试。 我使用 tcpecho (FreeRTOS)示例作为我的应用程序映像、并尝试使用引导加载程序将此应用程序映像加载到非易失性存储器中、但它似乎开箱即用、因此我假设需要对 tcpecho 源代码进行一些更改才能使其兼容。

    这是我所做的。

    我从资源扩展中汇编了以下方案。 BOOT_SERIAL_EMAC_FLASH_MSP_EXP432E401Y_nortos_gcc tcpecho_MSP_EXP432E401Y_FreeRTOS_gcc

    2.我使用输出设置来构建这两个版本的 srec、然后使用 srec_cat 来创建每个版本的 TI-txt 版本。

    然后、我使用 BSL_scripter 首先通过 BOOTP 和 TFTP 将 boot_serial_EMAC_flash 映像加载到已擦除的 MSP432E401Y 开发板。 此步骤没有问题。

    4.接下来,我使用脚本尝试 tcpecho 映像的 TFTP 传输,主要方法是将前一个脚本中的文件更改为指向 tcpecho 映像。

    最后一步似乎是正确加载映像、但是电路板似乎无法正常工作。 重置似乎不起作用、然后上传任何其他映像的尝试失败。 基本上、加载纸张 tcpecho 图像会损坏波托加载器、我不确定这种行为的原因。

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

    您是否确保设置了 tcpEcho 链接器文件、以便它不会与 boot_serial_emac_flash 映像重叠(闪存和 RAM 中均有)?  

    您使用了哪个.out 来确认该示例有效?

    以下行是否在  BL_EMAC.c 文件的 BOOTPThread()函数中执行?

    //
    //执行软件复位请求。 这将导致微控制器
    //重置;不再执行任何代码。
    //
    SCB->AIRCR = NVIC_APINT_VECTKEY | NVIC_APINT_SYSRESETREQ;
    

    tcpecho 图像上的矢量表在哪里?

    Todd

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

    我不确定您在询问哪个.out 时所指的是什么、我用于确认该示例是否有效?   但为了限制一些变量、我进入并提取 了 boot_serial_emac_flash_MSP_EXP432E401Y_nortos_ccs 和 boot_emac_flash_app_magicpacket_update_MSP_EXP432E401Y_nortos_ccs 的 CCS 编译版本、以测试引导加载程序示例。   我使用"ARM 十六进制实用程序"以 TI-TXT 十六进制格式创建输出文件。   然后使用这些测试功能。   

    对于 tcpecho 示例、我使用 了 tcpecho_MSP_EXP432E401Y_FreeRTOS_CCS 示例、并再次创建了 TI-TXT 文件。  这就是我使用引导加载程序加载的内容。   我还使用 xds110将程序加载到开发板、但这是使用生成的.out 文件和 CCS 完成的。   使用 XDS110加载 tcpecho 时工作正常、但通过 tftp 和以太网引导加载程序处理时不工作。

    //bl_emac.c  文件中的 BOOTPThread()函数中是否执行了以下行?

    //

    //1.
    //2.
    //3.
    //4.
    //5.
    //
    // Perform a software reset request.  This will cause the microcontroller 
    // to reset; no further code will be executed.
    //
    SCB->AIRCR = NVIC_APINT_VECTKEY | NVIC_APINT_SYSRESETREQ;

    我不知道是这样做的。   我无法重新确定如何在调试器中运行 Boatloader 以确保执行该行。   

    我想这里最可能的问题是我的内存分配。   遗憾的是、我对链接器文件没有太多了解、因此我很难找到信息。   矢量表也是如此。   

    我尝试更新.cmd 文件以更改内存分配、但由于我不断收到编译错误、因此未成功

    默认存储器范围与现有存储器范围重叠 SRAM
    默认存储器范围与现有存储器范围闪存重叠 

    以下是 可通过 boot_serial_emac_flash_MSP_EXP432E401Y_nortos_ccs 找到的.cmd 文件:

    --retain=Vectors
    
    /*系统内存映射*/
    
    内存
    {
    闪存(RX):origin = 0x00000000,length = 0x00010000
    SRAM (rwx):origin = 0x20000000,length = 0x00010000
    }/*
    
    在内存中的段分配*/
    
    SECTIONS
    {
    组
    {
    .intvecs
    .text
    .const
    .data
    } load = flash、run = 0x20000000、load_start (init_load)、run_start (init_run)、size (init_size)
    
    组
    {
    .bss
    .stack
    } run = SRAM、run_start (bss_run)、run_end (bss_end)、size (bss_size)、run_end (__stack_top)
    
    }
    

    这是我编辑后 tcpecho 中的.cmd 文件(提供了上述错误)

    --stack_size=1024 // C stack 也用于 ISR 堆栈*/
    --retain=interruptVectors
    
    #define APP_base 0x00004000
    
    HEAPSIZE = 0x20000;HeapMem 使用的堆缓冲区的大小*/
    
    MEMORY
    {
    闪存(RX):origin = APP_BASE,length = 0x000FC000
    SRAM (rwx):origin = 0x20000000,length = 0x00040000
    }//
    
    内存中的段分配*/
    
    SECTIONS
    {.intvecs:>APP_base
    
    .text:> FLASH
    .const:> FLASH
    .cinit:>闪存
    .pinit:> FLASH
    init_array:> FLASH
    
    .vtable:> 0x20000000
    .TI.ramfunc:{} load=flash,run=SRAM,table (BINIT)
    .data :> SRAM
    .bss:> SRAM
    .sysmem:> SRAM
    
    /* HeapMem 使用的堆缓冲区*/
    .priheap:{
    _primary_heap_start__=.;
    。 += HEAPSIZE;
    __primary_heap_end__=.;
    } > SRAM 对齐8
    
    .stack:> SRAM (高)
    }
    
    __stack_top =__stack + 512; 

    最初列出的闪存的原点= 0x00000000、长度= 00100000。   段中没有初始化.vtable。

    不过、就像我说过的、我对编辑这些文件的熟悉程度很低、而且很难找到信息。

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

    嗯、我修复了编译错误。  我只需要定义一个存储器空间默认值、我给出了 origin = 0x00000000、length = 0x00010000

    但是、如果通过 TFTP 加载程序、则仍然无法解决该程序不运行的问题。   

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

    继续 这里的讨论 并结束本主题。

    -Seong