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.

[参考译文] RTOS/EK-TM4C1294XL:定制 SPI 引导加载程序+ TI-RTOS 问题- Tiva C TM4C1294

Guru**** 2540720 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/574584/rtos-ek-tm4c1294xl-custom-spi-bootloader-ti-rtos-problem---tiva-c-tm4c1294

器件型号:EK-TM4C1294XL

工具/软件:TI-RTOS

您好!

在了解 TI-RTOS 应用程序的链接器配置时遇到问题。

使用示例 Tiva c 中的自定义引导加载程序

 引导加载程序的配置命令、  

--retain=矢量


内存
{
闪存(RX):origin = 0x00000000,length = 0x00004000
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)

} 

引导加载程序的分配映射、  
入口点符号:"_c_int00"地址:200003fb


存储器配置

名称 原点长度 已使用 未使用的属性填充
--- ---- ------ ---- ---- --------
闪存 00000000 00004000 00000618 000039e8 R X
SRAM 20000000 00010000 00000778 0000f888 RW X


段分配映射

运行原点 加载原点长度 init 长度 吸引成员
--- ------ ------ ------ ---- ----
20000000 00000000 00000618 00000618 r-x
20000000 00000000 00000044 00000044 r-.intvecs
20000044 00000044 000005d0 000005d0 r-x .text
20000614 000004 00000004 r-.const
20000618 00618 00000160 00000000 0000000000 r- 20000000614 000004 00000004 r- 200000006
00000006 00000006 00000006 0000000600 0000.rw 堆栈

TI-RTOS 应用程序的配置命令

--retain=g_pfnVectors

#define BL_BASE 0x00000000
#define APP_BASE 0x00004000
#define RAM_BASE 0x20000000

MEMORY
{
Flash_BL (RX):origin = BL_BASE,length = APP_BASE
闪存(RX):origin = APP_BASE,length = 0x00100000
SRAM (rwx):origin = RAM_base,length = 0x00040000
}//


内存
中的段分配*/ SECTIONS
{
.intvecs:> app_base
.text:> FLASH
.const:> FLASH
.cinit:>闪存
.pinit:> FLASH
init_array:> FLASH

.vtable:> RAM_base
.data :> SRAM
.bss:> SRAM
.sysmem:> SRAM
.stack:> SRAM
}

__stack_top =__stack + 512; 

TI-RTOS 应用程序的分配映射

入口点符号:"_c_int00"地址:0000a199


存储器配置

名称 起点 长度 已使用 未使用 属性填充
--- ---- ------ ---- ---- --------
FLASH_BL 00000000 00004000 0000003c 00003fc4 R x
闪存 00004000 00100000 0000af32 000f50ce R
x SRAM 20000000 00040000 0000394d 0003c6b3 RW X


段分配映射

运行原点 加载原点 长度 初始长度吸引成员
--- ------ ------ ------ ---- ----
00000000 00000000 0000003c 0000003c r-
00000000 00000000 0000003c 0000003c r-.resetVecs
00004000 00004000 0000af3c 0000af3c R-x
00004000 000087b2 000087b2 r-x .text
0000c7b8 0000c7b8 000023e4 000023e4 r-.const
0000eba0 000000039c 0000039c r-.cinit
20000000 00000 00000360 0000000400 00000008 00000008 00000008
00000008 00000008 00000008 00000008 00000008 00000008 00000008 00000008 00000008 00000008 00000008 00000008 00000008



200036f0 00000300 00000000 rw-.stack 

问题:

  1. 我的配置错误了吗?
  2. 下载程序需要在哪个地址?
  3. 要寻址(或段分配映射)、是否需要调用 bootlader run_cmd 来启动应用程序?

另一个问题: 在应用程序中如何重新进入引导加载程序以更新固件?

引导加载程序适用于非 TI-RTOS 应用程序

非常感谢!

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

    Semen、

    以下链接介绍了 TivaC 平台上的 USB 器件固件更新。 我知道您正在使用 SPI、但您可能会在项目文件中找到一些有用的信息。 具体而言、请查看引导加载程序和应用程序的链接器命令文件。 您可能会发现应用程序配置脚本也很有用。

    TI-RTOS USB DFU

    引导加载程序的链接器命令文件看起来正确。 在应用程序的链接器命令文件中、我将删除引导加载程序存储器段。 应用程序不需要该文件、它会防止链接器意外使用引导加载程序存储器。 对于应用程序闪存、您应该从存储器大小中减去16KiB 、因为它已经分配给引导加载程序。

    内存
    {
    闪存(RX):origin = 0x00004000、length = 0x000FC000
    SRAM (rwx):origin = 0x20000000,length = 0x00040000
    }
    

    对于应用、.intvecs 段应放置在地址零。 这是运行地址。

    .intvecs:> 0x00000000
    

    在应用程序配置脚本中、您需要指定矢量表加载地址。

    /*将矢量表放置在应用程序起始地址*
    / var ti_sysbios_family_arm_m3/hwi = xdc.useModule('ti.sysbios.family.arm.m3.Hwi');
    ti_sysbios_family_arm_m3_hwi.resetVectorAddress = 0x00004000;
    

    从上面的链接下载项目。 查看 DFU.c、了解应用程序如何跳回到引导加载程序。 我想除了最后一次调用 ROM_UpdateUSB()之外,您也可以执行同样的操作。 将其替换为跳转至引导加载程序入口点、该入口点应在地址0x00000004处定义。 我没有尝试过这种方法、因此您可能需要使用一些汇编代码来处理这种方法。

    ~Ramsey

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

    Ramsey、

    添加后  

    .intvecs :>0x00000000 

    此部分不会显示在定位图中

    关于 TI-RTOS USB DFU,我看到了它, 它对我没有帮助:(

    我认为启动 ti-RTOS 应用程序有问题、可能需要更改.cfg 添加了"启动"模块覆盖启动和复位功能。 您是否有类似的经验?

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

    Semen、

    您不应更改应用程序启动模块。 在引导加载程序配置中,必须指定应用程序矢量表。 这就是引导加载程序启动应用程序的方式。

    bl_config.h
    
    #define APP_START_ADDRESS 0x00004000
    

    我已经连接了两个 CCS 项目:1) bootloader_SPI、2) application_TM4C1294XL。 引导加载程序配置为 SPI 更新。 应用程序是 GPIO 中断驱动程序示例的副本。 请检查两个项目中的链接器命令文件。 您将看到、我已将闪存的第一个16KiB 分配给引导加载程序、并将剩余的闪存分配给应用程序。

    e2e.ti.com/.../1122.Bootloader_5F00_SPI.zip

    在 application.cfg 文件中、我添加了以下代码来定义应用程序矢量表加载地址。

    /*将矢量表放置在应用程序起始地址*
    / var ti_sysbios_family_arm_m3/hwi = xdc.useModule('ti.sysbios.family.arm.m3.Hwi');
    ti_sysbios_family_arm_m3_hwi.resetVectorAddress = 0x00004000; 

    了解 CCS 的加载行为非常重要。 每个项目都有其自己 的目标配置文件。 这告诉 CCS 如何连接到您的器件。

    application_TM4C1294XL/application.ccxml
    Bootloader_SPI/bootloader.ccxml

    启动调试会话时、CCS 将根据这些 目标配置文件创建调试启动配置。 遗憾的是、需要修改调试启动配置。 默认情况 下、当 CCS 将程序加载到目标上时、它将擦除所有闪存。 因此、如果您加载引导加载程序、然后加载应用程序、第二次加载将擦除引导加载程序。 为了解决此问题、您必须修改应用程序启动配置以仅擦除应用程序使用的闪存。

    此外、当 CCS 加载程序时、它会将 PC 寄存器设置为应用程序入口点(_c_int00)。 这对引导加载程序不起作用。 您必须发出 CPU 内核复位命令、该命令会将地址0x00000004的值载入 PC。 您可以使用工具栏中的图标(加载程序后)发出 Core 重置、也可以修改启动配置以执行此操作。 最后,引导加载程序没有名为 main()的函数。 因此、您需要禁用引导加载程序的 main 自动运行。

    遗憾的是、当您导入我提供的工程时、将使用默认值重新创建调试启动配置。 导出工程时无法包含启动配置。 有关修改调试启动配置的详细 信息、请参阅 TI-RTOS USB DFU 下载中包含的 USB_Serial_DFU.pdf 文件。

    USB_Serial_DFU.pdf
    第2部分步骤 9为引导加载程序创建目标配置
    第2部分步骤10自定义目标配置
    第3部分第4步为应用程序自定义目标配置

    因此、请确保首先启动引导加载程序调试会话。 下载引导加载程序。 然后终止调试会话。 启动应用程序调试会话。 下载应用程序。 您必须使用相应的调试会话。

    在我附加的示例中、如果您按照上述步骤操作、您将能够重置电路板(按启动板上的重置按钮)、引导加载程序将首先运行、然后启动应用程序。 按按钮(USR_SW1和 USR_SW2)切换 LED。

    执行以下操作以进入更新模式:

    1.按住 RESET
    2.按住 USR_SW1
    3.释放复位
    4.释放 USR_SW1

    现在、引导加载程序将处于 SPI 循环中、等待更新。 您可以通过以下步骤进行检查。

    当应用程序运行时:

    1.启动应用程序调试会话。
    2.加载 应用程序的符号。
    3.连接到目标。
    目标应该处于空闲任务中。

    引导加载程序运行时:

    启动引导加载程序调试会话。
    2.加载引导加载程序的符号。
    3.连接到目标。
    目标将位于 SSIReceive()中

    请告诉我它是怎么发生的。

    ~Ramsey