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/CC1310:在闪存中的两个应用之间跳转

Guru**** 2595805 points
Other Parts Discussed in Thread: CC1310

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/579150/rtos-cc1310-jumping-between-two-applications-in-flash

器件型号:CC1310

工具/软件:TI-RTOS

您好!

我在 CC1310闪存中存储的两个应用之间经常跳转时遇到问题。

我的产品在闪存中存储了两个固件:引导加载程序和应用程序。

引导加载程序存储在地址0x0000。

应用程序存储在地址0x6000。

我分别测试了每个跳转:

1.在引导加载程序中启动 CC1310、然后跳转到应用程序。 它正在工作!

跳转代码:

1
2.
3.
4.
asm(" MOV R0, #0x06000 ");
asm(" LDR R1, [R0, #0x4] ");
asm(" LDR SP, [R0, #0x0] ");
asm(" BX R1 ");

2.在应用程序中启动 CC1310、然后跳转至引导加载程序。 它正在工作:

跳转代码:

1
2.
3.
4.
asm(" MOV R0, #0x00000 ");
asm(" LDR R1, [R0, #0x4] ");
asm(" LDR SP, [R0, #0x0] ");
asm(" BX R1 ");

但我真正需要做的是从应用程序跳转到引导加载程序、执行一些操作、然后跳回到应用程序。

今天、我可以从应用程序跳转到引导加载程序、但无法跳回到应用程序。 正如我在前面所说的、从引导加载程序跳转到应用程序的操作正常。当我在引导加载程序中启动 CC1310时、测试了它。

简单地说:我可以从一个固件跳转到另一个固件、但我无法跳回到第一个固件。

你有一些线索吗?

是否有更好的方法来执行跳转?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这种情况可能会有很多种方式发生不良。

    引导加载程序和/或应用程序 TI-RTOS 项目吗? 两者都是针对 ROM 中的 BIOS 构建的? 哪个代码拥有复位矢量表(即在复位时从闪存位置0x0和0x4提取的矢量表?)。 在退出该应用程序之前、两个应用程序中的一个导致的中断是否会被服务或禁用、从而使其处于布防状态并对另一个应用程序造成危险?

    当您说"跳回应用程序"时、这意味着什么? 您是否从应用程序调用引导加载程序映像中的 API、然后返回? 或者、您是否在启动应用程序后跳转到引导加载程序的入口点、然后想要返回到应用程序中的剩余位置?

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

    1。

    [引述]

    引导加载程序和/或应用程序 TI-RTOS 项目吗?

    [/报价]

    它们都是 TI-RTOS 项目。

    2.

    [引述]

    两者都是针对 ROM 中的 BIOS 构建的?  

    [/报价]

    我不知道我是否理解您的问题、但两个项目都配置如下:

    /*========================= ROM 配置======================== //
    *
    *要在闪存中使用 BIOS,请注释掉下面的代码块。
    */
    var ROM = xdc.useModule('ti.sysbios.rom.ROM');
    if (Program.cpu.deviceName.match(/CC26/)){
    rom.romName = rom.CC2650;
    }
    否则(Program.cpu.deviceName.match(/CC13/)){
    rom.romName = ROM.CC1350;
    } 

    3.

    [引述]

    哪个代码拥有复位矢量表(即在复位时从闪存位置0x0和0x4提取的矢量表?)

    [/报价]

    再说一次、我不知道我是否理解了您的问题。 我认为这两个都有复位矢量。 我只更改了.cfg 文件中的以下内容:

    引导加载程序:

    /*
    为复位矢量分配地址。
    *
    *默认为0x0、这是闪存的开始。 通常、此设置
    不应*更改。
    /
    m3Hwi.resetVectorAddress = 0x0; 

    应用:

    /*
    为复位矢量分配地址。
    *
    *默认为0x0、这是闪存的开始。 通常、此设置
    不应*更改。
    /
    m3Hwi.resetVectorAddress = 0x6000; 

    4.

    [引述]

    当您说"跳回应用程序"时、这意味着什么?

    [/报价]

    我不需要跳回我离开的位置。 当我说"跳转"时、我始终是指转到固件的开始位置、无论是引导加载程序还是应用程序。 每次我"跳转"时、我希望从开始运行目标固件。

    感谢您尝试了解我的问题。

    请提出您需要了解的问题。 这是完成我的产品所剩的唯一问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于 ROM 中的 BIOS 代码引用了闪存(常量数据)和 RAM (BSS 数据)中固定位置的对象、因此在使用 ROM 中的 BIOS 构建的两个项目之间切换非常困难(正如您所做的那样)。 两个项目的链接器命令文件将 ROM 引用的 BIOS 对象放置在所需的地址。 但是、每个应用程序的这些对象的内容将有所不同。 一些目标内容将是应用代码库的指针。

    为了避免引导加载程序和应用程序之间的对象放置重叠、必须构建一个或两个不使用 ROM 的项目(即注释掉.cfg 文件中的 ROM.romName 分配)。 (我建议不要针对 ROM 构建引导加载程序。) 通过仔细分析生成的.map 文件、确保两个应用程序的段位置都不会相互重叠。 根据需要修改非 ROM 工程的链接器命令文件、以避免对象重叠。

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

    尊敬的 Alan:

    感谢您迄今为止的反馈。

    [引述]

    为了避免引导加载程序和应用程序之间的对象放置重叠、必须构建一个或两个不使用 ROM 的项目(即注释掉.cfg 文件中的 ROM.romName 分配)。

    [/报价]

    我在 bootloader .cfg 文件中注释了 rom.romName、但问题仍然存在。

    请看一下.cmd 文件吗? 我不确定 CCFG 的位置。

    1)引导加载程序.cmd 文件:

    /*覆盖默认入口点。 */
    --entry_point ResetISR
    /*允许 main()获取 args */
    --args 0x8
    //禁止警告和错误: //
    /*- 10063:有关入口点不是_c_int00的警告 //
    /*- 16011、16012:8字节对齐错误。 在使用
    Keil (ARM 编译器)编译的对象*//*文件中进行链接时观察 */
    --diag_suppress=10063、16011、16012
    
    //应用程序的起始地址。 通常,中断向量*/
    /*必须位于应用程序的开头。 */
    #define FLASH_PAGE_SIZE 4096
    
    #define FLASH_ADDR 0x0
    #define FLASH_SIZE 0x20000
    
    #define bootloader_ADDR FLASH_ADDR
    #define bootloader_size (FLASH_PAGE_SIZE * 6)
    
    #define application_ADDR (bootloader_ADDR + bootloader_size)
    #define application_size (FLASH_PAGE_SIZE * 25)
    
    #define CCFG_ADDR(application_ADDR + application_size)// CCFG 存储在最后一页
    #define CCFG_SIZE(FLASH_PAGE_SIZE * 1)
    
    #define RAM_base 中 0x20000000
    #define RAM_SIZE 0x5000
    
    _FLASH_ADDR = FLASH_ADDR;
    __FLASH_SIZE = FLASH_SIZE;
    __FLASH_application_ADDR = application_ADDR;
    __FLASH_application_size = application_size;
    
    //系统内存映射*
    
    内存
    {
    引导加载程序(RX):origin = bootloader_ADDR,length = bootloader_size
    
    应用程序(RX):origin = application_ADDR,length = application_size
    
    SRAM (rwx):origin = RAM_base,length = RAM_SIZE
    
    CCFG (RX):origin = CCFG_ADDR,length = CCFG_SIZE
    }
    
    //内存中的段分配*/
    
    SECTIONS
    {
    .text :>引导加载程序
    .const :>引导加载程序
    .constdata :>引导加载程序
    rodata :>引导加载程序
    .cinit :>引导加载程序
    .pinit :>引导加载程序
    init_array :>引导加载程序
    .EMB_TEXT :>引导加载程序
    应用程序:>应用程序
    .ccfg :> CCFG (高电平)
    
    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>=15009000
    .TI.ramfunc :{}load=flash、run=SRAM、table (BINIT)
    #endif
    #endif
    .data :> SRAM
    .bss :> SRAM
    sysmem :> SRAM
    堆栈 :> SRAM (高)
    .nonretenvar:> SRAM
    } 

    2)应用程序.cmd 文件:

    /*
    === CC1310_LAUNCHXL.cmd ===
    用于 Code Composer Studio
    的* CC26x0F128 PG2链接器配置文件*/
    
    //*覆盖默认入口点。 */
    --entry_point ResetISR
    /*允许 main()获取 args */
    --args 0x8
    //禁止警告和错误: //
    /*- 10063:有关入口点不是_c_int00的警告 //
    /*- 16011、16012:8字节对齐错误。 在使用
    Keil (ARM 编译器)编译的对象*//*文件中进行链接时观察 */
    --diag_suppress=10063、16011、16012
    
    //应用程序的起始地址。 通常,中断向量*/
    /*必须位于应用程序的开头。 */
    #define FLASH_PAGE_SIZE4096
    
    #define FLASH_base 0x6000 //0x0
    #define FLASH_SIZE (FLASH_PAGE_SIZE * 25)
    //#define CCFG_base(FLASH_PAGE_SIZE * 31)// CCFG 由引导加载程序存储
    //#define CCFG_SIZE(FLASH_PAGE_SIZE * 1)
    #define RAM_base 0x20000000
    #define RAM_SIZE 0x5000
    
    /*系统内存映射*/
    
    内存
    {
    /*存储在内部闪存中并从内部闪存执行的应用程序*/
    闪存(RX):origin = flash_BASE,length = flash_size
    /*应用程序使用内部 RAM 进行数据*/
    SRAM (rwx):origin = RAM_base,length = RAM_SIZE
    
    //CCFG (RX):origin = CCFG_base,length = CCFG_SIZE // CCFG 存储在引导加载程序
    中}
    
    //段分配在内存中*/
    
    SECTIONS
    {
    .text :>闪存
    .const :>闪存
    .constdata :>闪存
    rodata :>闪存
    .cinit :>闪存
    .pinit :>闪存
    init_array :>闪存
    .EMB_TEXT :>闪存
    //.ccfg :> CCFG (高电平)// CCFG 由引导加载程序
    
    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>=15009000进行存储
    .TI.ramfunc :{}load=flash、run=SRAM、table (BINIT)
    #endif
    #endif
    .data :> SRAM
    .bss :> SRAM
    sysmem :> SRAM
    堆栈 :> SRAM (高)
    .nonretenvar:> SRAM
    } 

    如您所见、引导加载程序涵盖了所有闪存、因此首先存储。 然后、应用程序存储在"reserverd"空间中。

    如果这种方法正确、我不会告诉您。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    根据我的理解、您无法重新定位 CCFG 区域。 它必须放置在闪存的末尾、从地址0x1ffa8开始。

    为了避免引导加载程序和应用程序之间的重叠、引导加载程序的.cmd 文件不应在地址0x1000和0x1700之间的闪存中放置任何内容。 这些地址是 ROM 代码希望其.const 段对象所在的位置。 此外、应避免0x20000100和0x20000600之间的 RAM 地址、因为这是 ROM 代码期望其.bss 段对象所在的位置。

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

    谢谢、Alan!

    [引述]

    根据我的理解、您无法重新定位 CCFG 区域。 它必须放置在闪存的末尾、从地址0x1ffa8开始。  

    [/报价]

    我将 CCFG 放置在最后一页的开头。 不正确吗?

    [引述]

    为了避免引导加载程序和应用程序之间的重叠、引导加载程序的.cmd 文件不应在地址0x1000和0x1700之间的闪存中放置任何内容。 这些地址是 ROM 代码希望其.const 段对象所在的位置。 此外、应避免0x20000100和0x20000600之间的 RAM 地址、因为这是 ROM 代码期望其.bss 段对象所在的位置。

    [/报价]

    引导加载程序还从0x00000开始、但我无法在这些地址之间放置任何段?

    您能向我展示一个示例、说明如何执行您的建议?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "我将 CCFG 放置在最后一页的开头。 它不正确吗?"

    是的、这是不正确的。 必须将其放置在地址0x1ffa8的闪存末尾。

    "引导加载程序还从0x00000开始、但我无法在这些地址之间放置任何段?
    您能向我展示一个示例、说明如何执行您的建议?"

    我想您必须将特定于闪存的存储器分解为跳过0x1000 - 0x1700的多个区域(即"FLASSHA"和"FLASSHB")、然后使用以下语法将内容放置到闪存中:

    text :> FLASHA | FLASHB
    .const :> FLASHA | FLASHB
    (笑声)

    同样、对于 SRAM:

    .data :> SRAMA | SRAMB
    .bss:> SRAMA | SRAMB
    (笑声)

    我从未尝试过完成您要做的事情、我在这里猜测。

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

    尊敬的 Alan:

    现在、引导加载程序使用7页闪存、应用程序使用24页、CCFG 使用1页。

    该应用程序的24页几乎已完全使用、我担心将来会出现什么情况。 如果将来增加应用程序、我将会遇到问题。

    我认为简单引导加载程序的7页太多、其中很大一部分是由于 TI-RTOS。

    我尝试在不使用 TI-RTOS 的情况下、仅使用 driverlib 来实现引导加载程序、但我无法初始化 uController、而 TI 不提供任何有关在没有 TI-RTOS 的情况下如何执行该操作的示例。

    由于引导加载程序和 TI-RTOS 都使用相同的 TI-RTOS 代码、是否有方法将其置于闪存中的已知位置、并且两者(引导加载程序和应用程序)共享相同的代码?

    如果没有、我将感谢有关如何最大程度地减小引导加载程序代码大小的任何其他提示。

    提前感谢您。

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

    [引用用户="Alan ]

    我想您必须将特定于闪存的存储器分解为跳过0x1000 - 0x1700的多个区域(即"FLASSHA"和"FLASSHB")、然后使用以下语法将内容放置到闪存中:

    text :> FLASHA | FLASHB
    .const :> FLASHA | FLASHB
    (笑声)

    同样、对于 SRAM:

    .data :> SRAMA | SRAMB
    .bss:> SRAMA | SRAMB
    ...[/报价]

    尊敬的 Alan:

    我尝试执行您的建议。

    这就是我所做的:

    #define FLASH_PAGE_SIZE 4096
    
    #define FLASH_ADDR 0x0
    #define FLASH_SIZE 0x20000
    
    #define bootloader_part_1_ADDR 0x0000
    #define bootloader_part_1_size 0x1000
    
    #define bootloader_part_2_ADDR 0x1700
    #define bootloader_part_2_size (((flash_page_size * 7)-(0x1700)
    
    )#define application_ADDR (bootloader_part_2_ADDR + bootloader_part_2_size)
    #define application_size (FLASH_PAGE_SIZE * 24)
    
    #define CCFG_ADDR(application_ADDR + application_size)
    #define CCFG_SIZE(FLASH_PAGE_SIZE * 1)
    
    #define RAM_base 0x20000000
    #define RAM_SIZE 0x5000
    
    #define RAM_PART_1_ADDR RAM_base
    #define RAM_PART_1_SIZE (0x20000100 - RAM_PART_1_ADDR)
    
    #define RAM_PART_2_ADDR 0x20000600
    #define RAM_PART_2_SIZE ((RAM_SIZE + RAM_BASE)- RAM_PART_2_ADDR)
    
    /*系统存储器映射
    
    
    
    bootloader_part_1 (RX):origin = bootloader_part_1_ADDR,length = bootloader_part_1_size
    bootloader_part_2 (RX):origin = bootloader_part_2_ADDR,length = bootloader_part_2_size
    
    应用程序(RX):origin = application_ADDR,length = application_size
    
    SRAM_PART_1 (rwx):origin = RAM_PART_1_ADDR,length = RAM_PART_1_SIZE
    SRAM_PART_2 (RWX):origin = RAM_PART_2_ADDR,length = RAM_PART_2_SIZE
    
    CCFG (RX):origin = CCFG_ADDR,length = CCFG_SIZE
    }
    
    //内存中的段分配*/
    
    SECTIONS
    {
    .text :> bootloader_part_1 | bootloader_part_2
    .const :> bootloader_part_1 | bootloader_part_2
    .constdata :> bootloader_part_1 | bootloader_part_2
    rodata :> bootloader_part_1 | bootloader_part_2
    .cinit :> bootloader_part_1 | bootloader_part_2
    .pinit :> bootloader_part_1 | bootloader_part_2
    init_array :> bootloader_part_1 | bootloader_part_2
    .EMB_TEXT :> bootloader_part_1 | bootloader_part_2
    应用程序:>应用程序
    .ccfg :> CCFG (高电平)
    
    .data :> SRAM_PART_1 | SRAM_PART_2
    .bss :> SRAM_PART_1 | SRAM_PART_2
    sysmem :> SRAM_PART_1 | SRAM_PART_2
    堆栈 :> SRAM_PART_2 (高电平)
    nonretenvar:> SRAM_PART_1 | SRAM_PART_2
    } 

    但我在引用默认值时遇到错误、我不知道它的含义。

    我希望以下打印屏幕能帮助您理解。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在项目中的某个位置、您似乎有另一个指定了"默认"存储器区域的.cmd 文件。 您应该在您的项目目录中针对"default"尝试'grep ping。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    项目中的某个位置似乎有另一个指定了"默认"存储器区域的.cmd 文件。 您应该在您的项目目录中尝试"default"的'grep ping 命令。

    我进行了文件搜索、选择了所有文件外部。

    这就是我得到的结果:

    我认为这与此无关。

    你有其他线索吗?

    也许这个缺省值是在项目配置中的某个位置配置的?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯。 您看到生成的.map 文件中提到的"default"吗? 即使链接失败、也会在与您找到的.xml 文件相同的目录中生成.map 文件。

    此项目是否引用任何外部文件? (例如、项目中是否可以包含外部.cmd 文件)。

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

    [引用用户="Alan。]HMM。 您看到生成的.map 文件中提到的"default"吗? 即使链接失败、也会在与您找到的.xml 文件相同的目录中生成.map 文件。

    此项目是否引用任何外部文件? (例如、项目中是否可以包含外部.cmd 文件)。

    Alan [/引述]

    尊敬的 Alan:

    我在项目中找不到任何外部.cmd。

    不包含工程的 TI 文件夹(如 TI-RTOS 和驱动程序)是否可以包含此默认声明?

    这是我的项目包含列表:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    至少部分问题是存储器定义部分不包含 TIRTOS 代码(0x20000100至0x20000600)使用的 RAM 存储器的定义。
    它也没有 TIRTOS 使用的闪存存储器的定义(0x1000-0x1700)。 因此、链接器在无法将对象放置在该区域中时会疯狂。

    尝试将此内容添加到您的存储器定义中:

    SRAM_RTOS (rwx):origin = 0x20000100,length = 0x600
    Flash_RTOS (RW):origin = 0x00001000,length = 0x700

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

    [引用 USER="Alan ]\n 问题的至少部分是内存定义部分不包括 TIRTOS 代码(0x20000100至0x20000600)使用的 RAM 内存的定义。
    它也没有 TIRTOS 使用的闪存存储器的定义(0x1000-0x1700)。 因此、链接器在无法将对象放置在该区域中时会疯狂。

    尝试将此内容添加到您的存储器定义中:

    SRAM_RTOS (rwx):origin = 0x20000100,length = 0x600
    Flash_RTOS (RW):origin = 0x00001000,length = 0x700

    这应该会有所帮助。

    尊敬的 Alan:

    我仍 在努力使我的两个程序在同一个闪存中工作。

    我的最后一次尝试是您建议的。

    可以麻烦你来评论一下吗?

    #define FLASH_PAGE_SIZE 0x1000
    
    #define FLASH_ADDR 0x0
    #define FLASH_SIZE 0x20000
    
    #define BOOTLOADER_PART0_ADDR0x0000//第一个部分从0x0000到0x1000
    #define BOOTLOADER_PART0_SIZE0x1000//我们不能超过0x1000,因为其中
    
    有 RTOS 填充#define FLASH_RTOS_OBJ_ADDR0x1000// RTOS 填充从0x1000存储到0x1700 #define RTOS_ADDR_S1#define
    0x1700 #define RTOS
    
    直到第7页
    #define bootloader_PART1_SIZE(0x7000 - 0x1700)
    
    #define application_ADDR0x7000//应用程序从第7页开始直到第31页
    #define application_size(0x1F000 - 0x7000)
    
    #define CCFG_ADDR0x1F000// CCFG 存储在最后一页的末尾(在#define SECTIONS 中使用的关键字 HIGH)
    #define CCFG_base0x1000 #define
    
    RAM 0x20000000
    #define RAM_SIZE 0x5000
    
    #define RAM_PART0_ADDR0x20000000// Fist 部件从0x20000000变为0x20000100
    #define RAM_PART0_SIZE(0x20000100 - 0x20000000)//我们无法超过0x20000100,因为其中
    
    有#define RAM_RTOS_OBJ_ADDR_ADDR_0x20000100- 0x20000100 RTOS 大小0x20000100 /
    define RTOS 填充0x20000100
    
    #define RAM_PART1_ADDR0x20000600 //第二个部分一直到 RAM 的末尾
    #define RAM_PART1_SIZE((RAM_base + RAM_SIZE)- 0x20000600)
    
    //系统内存映射*
    
    / MEMORY
    {
    bootloader_PART0 (RX):origin = bootloader_PART0_ADDR,length = bootloader_PART0_size
    FLASH_RTOS_obj (RW):origin = FLASH_RTOS_OBJ_ADDR,length = FLASH_RTOS_OBJ_SIZE
    bootloader_PART1 (RX):origin = bootloader_PART1_ADDR,length = bootloader_PART1_size
    应用程序(RX):origin = application_ADDR,length = application_size
    CCFG (RX):origin = CCFG_ADDR,length = CCFG_SIZE
    
    RAM_PART0 (RX):origin = RAM_PART0_ADDR,length = RAM_PART0_SIZE
    RAM_RTOS_obj (rwx):origin = RAM_RTOS_OBJ_ADDR,length = RAM_RTOS_OBJ_SIZE
    RAM_PART1 (RX):origin = RAM_PART1_ADDR,length = RAM_PART1_SIZE
    }
    
    //内存中的段分配*/
    
    SECTIONS
    {
    .text :> bootloader_PART0 | bootloader_PART1
    .const :> bootloader_PART0 | bootloader_PART1
    .constdata :> bootloader_PART0 | bootloader_PART1
    rodata :> bootloader_PART0 | bootloader_PART1
    .cinit :> bootloader_PART0 | bootloader_PART1
    .pinit :> bootloader_PART0 | bootloader_PART1
    init_array :> bootloader_PART0 | bootloader_PART1
    .EMB_TEXT :> bootloader_PART0 | bootloader_PART1
    应用程序:>应用程序
    .ccfg :> CCFG (高电平)
    
    .data :> RAM_PART0 | RAM_PART1
    .bss :> RAM_PART0 | RAM_PART1
    sysmem :> RAM_PART0 | RAM_PART1
    堆栈 :> RAM_PART1 (高电平)
    .nonretenvar:> RAM_PART0 | RAM_PART1
    } 

    它不是编译。

    我收到错误:

    程序将不能放入可用的内存中。 “.text”大小为0x5e40的定位失败。 可用存储器范围:
    Bootloader_PART0大小:0x1000未使用:0x9e6最大孔:0x9e6
    Bootloader_PART1大小:0x5900未使用:0x5900最大孔:0x5900

    我认为这意味着我需要0x5e40序列可用空间、我拥有的最大空间为0x5900。

    是否有办法让链接器将0x5e40分成两个部分?

    编辑:

    编译引导加载程序工程时出现上述错误。

    下面是编译应用程序项目时出现的错误。 在这种情况下、RAM 会出现问题。

    我有两个部件、总空间为0x628 (0x38 + 0x5F0)。 但链接器正在尝试使用0x93b 放置一个"片段"。

    在我向 RAM_RTOS_obj (rwx)声明和保留空间之前、工程正在 RAM 中进行 fing。 我想知道链接器是否会忽略该空间、因为我不会在段中明确地将任何内容放在该空间中:

    //未将任何内容归于 RAM_RTOS_obj
    .data :> RAM_PART0 | RAM_PART1
    .bss :> RAM_PART0 | RAM_PART1
    .sysmem :> RAM_PART0 | RAM_PART1
    .STACK :> RAM_PART1 (高电平)
    .nonretenvar:> RAM_PART0 | RAM_PART1 

    "./source files/low level/inc/CC1310_LAUNCHXL.cmd"、第102行:错误#10099-D:程序不能放入可用内存中。 对齐方式对".data"大小为0x93b 的运行放置失败。 可用存储器范围:

    RAM_PART0大小:0x100未使用:0x38最大孔:0x38
    RAM_PART1大小:0x4a00未使用:0x5f0最大孔:0x5f0

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尝试在.text、.const、.data 和.bss 放置位置中使用">"运算符。

    .text :>> bootloader_PART0 | bootloader_PART1

    这会通知链接器、这些段可以拆分成更小的部分。

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

    尝试在.text、.const、.data 和.bss 放置位置中使用'>'运算符。

    .text:>> bootloader_PART0 | bootloader_PART1

    这会通知链接器、这些段可以拆分成更小的部分。

    Alan [/引述]

    尊敬的 Alan:

    感谢您的快速回答。

    现在、误差发生了一点变化:

    "./source files/low level/inc/CC1310_LAUNCHXL.cmd"、第102行:错误#10099-D:程序不能放入可用内存中。 对齐方式对".data"大小为0xa26的运行放置失败。 可用存储器范围:
    RAM_PART0大小:0x100未使用:0x0最大空洞:0x0
    RAM_PART1大小:0x4a00未使用:0x0最大孔:0x0

    链接器现在似乎正在使用第一部分中的所有可用空间。 但我无法理解为什么它不能将其余部分放在第二部分中。 .data 的大小为0xa26、第二个器件的大小为0x4a00。

    请查看存储器范围:

    #define RAM_base 0x20000000
    #define RAM_SIZE 0x5000
    
    #define RAM_PART0_ADDR0x20000000// Fist 部件从0x20000000变为0x20000100
    #define RAM_PART0_SIZE(0x20000100 - 0x20000000)//我们无法超过0x20000100,因为其中
    
    有#define RAM_RTOS_OBJ_ADDR_ADDR_0x20000100- 0x20000100 RTOS 大小0x20000100 /
    define RTOS 填充0x20000100
    
    #define RAM_PART1_ADDR0x20000600 //第二个部分一直到 RAM 结束
    #define RAM_PART1_SIZE(((RAM_base + RAM_SIZE)- 0x20000600) 



    编辑:
    出现问题是因为内存不足(下图)。
    在我保留 RAM_RTOS_obj 空间之前、工程正在编译并使用97%的 RAM。
    缺点是保留空间是空的。 链接器是否甚至使用它?

    EDIT2:

    为了编译它、我减小了一些缓冲区大小(在最终产品中无法减小)、并编译了应用程序。

    结果如下。

    我的问题是:为什么 TI-RTOS 对象放置在应用领域? 我真的需要他们使用的空间、他们的保留空间是空的。

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

    [引用用户="Alan DeMars"]

    我的问题是:为什么 TI-RTOS 对象放置在应用领域? 我真的需要他们使用的空间、他们的保留空间是空的。

    [/报价]

    尊敬的 Alan:

    请、您能就该问题提供反馈吗?

    提前感谢您!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ROM 中的 BIOS 实际上只使用0x20000100开始的0x104字节的 RAM。 您可以相应地减小 RAM_RTOS_OBJ_SIZE 的长度。 该 RAM 区域包含 ROM 代码引用的模块状态变量。

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

    [引用 USER="Alan DeMars">ROM 中的 BIOS 实际只使用0x104字节的 RAM、起始地址为0x20000100。 您可以相应地减小 RAM_RTOS_OBJ_SIZE 的长度。 该 RAM 区域包含 ROM 代码引用的模块状态变量。

    Alan

    [/报价]

    尊敬的 Alan:

    感谢您的反馈。

    我不知道我是否不理解您的意思、但它仍然不能解释为什么该部分是空的(正如您在我的打印中看到的)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想我也会感到困惑。 当您根据 ROM 中的 BIOS 构建应用程序时、构建流程(链接器命令)将强制将 BIOS 所需的 RAM 对象放置在0x20000100和0x20000204之间的区域中。 如果您的应用程序不是根据 ROM 中的 BIOS 构建的、则该 RAM 区域可供应用程序使用。

    如果您在两个应用程序之间来回切换、其中一个应用程序是根据 ROM 中的 BIOS 构建的、另一个应用程序不是、 不是根据 ROM 中的 BIOS 构建的应用程序不得破坏根据 ROM 中的 BIOS 构建的应用程序所使用的 RAM 内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引述 user="Alan 的说法]我猜我也很困惑。 当您根据 ROM 中的 BIOS 构建应用程序时、构建流程(链接器命令)将强制将 BIOS 所需的 RAM 对象放置在0x20000100和0x20000204之间的区域中。 如果您的应用程序不是根据 ROM 中的 BIOS 构建的、则该 RAM 区域可供应用程序使用。

    如果您在两个应用程序之间来回切换、其中一个应用程序是根据 ROM 中的 BIOS 构建的、另一个应用程序不是、 不是根据 ROM 中的 BIOS 构建的应用程序不能破坏根据 ROM 中的 BIOS 构建的应用程序所使用的 RAM 内容。[/引用]

    我认为我们不是相互理解的。

    让我回顾一些步骤。

    1.你让我“保留”一个闪存和一个无法写入的 RAM 区域。

    2.我保留了以下空间。 这些区域被命名为:flash_rtos_obj 和 RAM_rtos_obj、

    #define BOOTLOADER_PART0_ADDR0x0000//第一个部分从0x0000到0x1000
    #define BOOTLOADER_PART0_SIZE0x1000//我们不能超过0x1000,因为其中有 RTOS 填充
    
    #define FLASH_RTOS_OBJ_ADDR0x1000// RTOS 填充从0x1000存储到0x1700
    #define FLASH_RTOS_ART1_ADDR0x1700
    
    #define RTOS 填充/第二个 RTOS 填充器#define ARTART1_ADDR_SIZE 0x700 第7页
    #define BOOTLOADER_PART1_SIZE(0x7000 - 0x1700)
    
    #define application_ADDR0x7000//应用程序从第7页开始直到第31页
    #define application_size(0x1F000 - 0x7000)
    
    #define CCFG_ADDR0x1F000// CCFG 存储在最后一页的末尾(关键字在各节中使用的高位)
    #define CCFG_RAM_base #define0x1000
    
    0x20000000
    #define RAM_SIZE 0x5000
    
    #define RAM_PART0_ADDR0x20000000// Fist 部件从0x20000000变为0x20000100
    #define RAM_PART0_SIZE(0x20000100 - 0x20000000)//我们无法超过0x20000100,因为其中
    
    有#define RAM_RTOS_OBJ_ADDR_ADDR_0x20000100- 0x20000100 RTOS 大小0x20000100 /
    define RTOS 填充0x20000100
    
    #define RAM_PART1_ADDR0x20000600 //第二个部分一直到 RAM 的末尾
    #define RAM_PART1_SIZE((RAM_base + RAM_SIZE)- 0x20000600)
    
    //系统内存映射*
    
    / MEMORY
    {
    bootloader_PART0 (RX):origin = bootloader_PART0_ADDR,length = bootloader_PART0_size
    FLASH_RTOS_obj (RW):origin = FLASH_RTOS_OBJ_ADDR,length = FLASH_RTOS_OBJ_SIZE
    bootloader_PART1 (RX):origin = bootloader_PART1_ADDR,length = bootloader_PART1_size
    应用程序(RX):origin = application_ADDR,length = application_size
    CCFG (RX):origin = CCFG_ADDR,length = CCFG_SIZE
    
    RAM_PART0 (RX):origin = RAM_PART0_ADDR,length = RAM_PART0_SIZE
    RAM_RTOS_obj (rwx):origin = RAM_RTOS_OBJ_ADDR,length = RAM_RTOS_OBJ_SIZE
    RAM_PART1 (RX):origin = RAM_PART1_ADDR,length = RAM_PART1_SIZE
    } 

    3.我编译了代码并查看了内存使用情况。 链接器未使用"保留"空间。


    4.我检查了 TI-RTOS 配置、如下所示:
    /*========================= ROM 配置======================== //
    *
    *要在闪存中使用 BIOS,请注释掉下面的代码块。
    //
    //*
    var ROM = xdc.useModule('ti.sysbios.rom.ROM');
    if (Program.cpu.deviceName.match(/CC26/)){
    rom.romName = rom.CC2650;
    }
    否则(Program.cpu.deviceName.match(/CC13/)){
    ROM.romName = ROM.CC1350;
    }
    */ 

    请告诉我、是否有任何信息不能理解该问题。

    现在、我不关心跳转、我只想让所有内容都位于内存中的正确位置。



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是正确的、除了 RAM_PART1_ADDR 可以设置为0x20000204、并且用于计算 RAM_RTOS_OBJ_SIZE 的数学方法应为(0x20000204 - 0x20000100)

    Alan