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/CC2652P:关于 BIM 跳转。

Guru**** 2589280 points
Other Parts Discussed in Thread: Z-STACK

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/949288/ccs-cc2652p-about-bim-jump

器件型号:CC2652P
Thread 中讨论的其他器件:Z-stack

工具/软件:Code Composer Studio

大家好、TI 团队

我基于 BIM 创建了项目、并将 CCFG 中的 SET_CCFG_IMAGE_VALLED_CONF_IMAGE_VALID 值设置为0x0、将跳转地址设置为0x8000。然后、应用程序基于 Ti154STACK_SENSOR_2_4G 创建、应用程序的起始地址设置为0x8000。但是、将代码下载到闪存后、BIM 可以跳转至应用程序、 但应用程序无法正常运行。如果应用程序项目是基于 OAD 项目创建的、并且起始地址设置为0x8000、 BIM 可以跳转到应用程序并正常运行。如果我在不更改起始地址和跳转地址的例程中使用项目、则应用程序和应用程序都可以正常运行。为什么?

这是 BIM .cmd 内容:

#define FLASH_base 0x00000000
#define GPRAM_base 0x11000000
#define RAM_base 0x20000000
#define ROM_base 0x10000000

#define FLASH_SIZE 0x00058000
#define RAM_SIZE 0x00014000

/*********
* RAM
*/
/*保留 RAM 是 ROM 代码使用的 RAM 的那一部分。
*对于安全 BIM、ROM 中的 ECC 库在
RAM 的开头使用0x80字节的* RAM 空间。 尽管
非安全 BIM 不使用 ROM 中的 ECC 库*、但为了使链接
器*命令文件在两个变体之间保持简单统一、
此处通常为两个变体定义*保留段。
* ROM 代码实际使用略小于0x300字节;保留
RAM 的此*部分不被 BIM 应用程序更改
*/
#define RESERVE_RAM_SIZE (0x300)

/*
为 BIM 变量定义
*/
#define RAM_START (RAM_base + RESERVE_RAM_SIZE)



#define RAM_END (RAM_START + RAM_SIZE - RESERVE_RAM_SIZE - 1)

当堆栈映像不存在时、/*应用程序被赋予完整的 RAM 范围(减去 ROM 保留的偏移量)。 */
#define RAM_BIM_SIZE (RAM_END - RAM_START + 1)

/*********
*闪存
*/

#define FLASH_START FLASH_base

#define PAGE_SIZE 0x2000

//*
Bim 控制第31页中的 CCFG 以及在此处链接其应用。
*任何剩余空间都可以由另一个映像声明。
//
#define FLASH_BIM_START 0x0 //FLASH_SIZE - PAGE_SIZE
#define FLASH_BIM_END CERT_START - 1 //FLASH_CCFG_START - 1
#define FLASH_BIM_SIZE ((FLASH_BIM_END)-(FLASH_BIM_START)+ 1)

#define FLASH_CCFG_START (CCFG_CC0008
)
+ CCFAG_START)+ 1 (#define CCFAG_FLASH_CCFG_START)+ CCFAG_SIZE (#define CCFAG_CCFAG_END)- 1 (CCFG_FAST_CC0001)

#define FLASH_FNPTR_START FLASH_CCFG_START - 8 //在 CCFG 和函数指针之间添加4个字节的缓冲区0x0001ffa0
#define FLASH_FNPTR_END FLASH_FNPTR_START + 3 // 4个字节函数指针0x0001ffa3
#define FLASH_FNPTR_SIZE 4 //(FLASH_FNPTR_FNPTR_START

)+ 3 //(FLASH_FNPTR_FNPTR_FNPTR_START)–固定区域1 +存储)+ FNPTR_FNPT
//区域长度为 CERT_ELECT_t
#define CERT_END FLASH_FNPTR_START -1
#define CERT_SIZE 0x4C //对于版本1 ECDSA-P256
#define CERT_START CERT_END - CERT_SIZE + 1/*********


* Stack
*/

/*创建指向栈顶的全局常量*/
/* CCS:在 Project Properties */
__stack_top =__stack +__stack_size;

/*********下更改栈大小
*主参数
*/

*允许 main()获取 args */
/*--args 0x8 */

/*********
系统内存映射
/
MEMORY
{/*
FLASH_BIM
(RX):origin = FLASH_BIM_START,length = FLASH_BIM_SIZE
FLASH_CCFG (RX):origin = FLASH_CCFG_START,length = FLASH_CCFG_SIZE
FLASH_FNPTR (RX):origin = FLASH_FNPT_START,length = FLASH_CERT_RAM_START (r):*+



+++ origin = RAM_START、length = RAM_BIM_SIZE
}

/*************
*内存部分分配
/
SECTIONS
{
.intvecs :> FLASH_BIM_START
.text :> FLASH_BIM
.const :> FLASH_BIM
.constdata :> FLASH_BIM
.rodata :> FLASH_BIM
.cinit :> FLASH_BIM
.pinit :> FLASH_BIM
.init_array :> FLASH_BIM
.EMB
:> FLASH_BIM .inct :> FLASH_BIT_CERT :> FLASH_BIT_FLASH .NOT.BIM .text :> FLASH

> FLASH_CCFG (高)

.vtable:> SRAM
.vtable_ram:> SRAM
VTABLE _ram:> SRAM
.data:> SRAM
.bss:> SRAM
.sysmem:> SRAM
.stack:> SRAM (高)
.nonretenvar:> SRAM
} 

这是应用程序.cmd 内容:

#ifndef NVOCMP_NVPAGES
#define NVOCMP_NVPAGES 2
#endif

#define FLASH_base 0x00000000

#define FLASH_NV_BASE (0x56000 -(NVOCMP_NVPAGES * 0x2000)
#define FLASH_NV_SIZE (NVOCMP_NVPAGES * 0x2000)
#define FLASH_LAST_BASE 0x56000
#define FLASH_LAST_SIZE 0x2000
#define RAM_base 0x20000000
#define RAM_SIZE 0x14000

#define entry_start (0x8000)
#define entry_size 0x40
#define entry_end (entry_start + entry_size - 1)

#define FLASH_START (entry_end + 1)
#define FLASH_END (FLASH_NV_BASE)//(FLASH_base + FLASH_SIZE - RESERVE_FLASH_SIZE - 1)

//#define FLASH_START_BASE 0x8000
//#define FLASH_SIZE (0x56000 -(NVOCMP_NVPAGES * 0x2000)- FLASH_START_BASE)
/*系统存储器映射*/

存储器
{
Entry (RX):origin = entry_start、length = entry_size
/*存储在内部闪存中并从内部闪存执行的应用程序*/
闪存(RX):origin = flash_start,length =(flash_end - flash_start)//flash_size
/* FLASH NV */
FLASH_NV (Rwx):origin = FLASH_NV_BASE,length = FLASH_NV_SIZE
/*最后一个闪存页*/
FLASH_LAST (RX):origin = FLASH_LAST_BASE,length = FLASH_LAST_SIZE
/*应用程序使用内部 RAM 进行数据*/
SRAM (rwx):origin = RAM_base,length = RAM_SIZE
}

//内存

中的段分配*/ SECTIONS
{
//.intvecs :> FLASH_START_base
Group > entry
{
.Vecresets load_start (prgEntryAddr)
.intvecs
EntrySection //load_start (prgEntryAddr)}

//
FLASH_LAST_TEXT
{
mac_user_config.obj (.text)
nvoctp.obj (.text)
macTask.obj (.text)
HMAC_ROM_init.obj (.const)
OSAL_port.obj (.text)
} > FLASH_LAST
*/

.text :>> FLASH_LAST | FLASH

CONFIG_CONST{mac_user_config.obj (.const)}> FLASH

.const :>闪存
.constdata :>闪存
rodata :>闪存
.cinit :>闪存
.pinit :>闪存
init_array :>闪存
.EMB_TEXT :> FLASH

//.ccfg :> flash_last (HIGH)
.ccfg :type=NoLoad > FLASH_LAST (高电平)

Group (组)> SRAM
{
.data
.bss
.vtable
.vtable_ram
VTABLE RAM
sysmem
.nonretenvar
} LOAD_END (heapStart)

堆栈 :> SRAM (高电平) load_start (heapEnd)
}

谢谢!

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

    您好!

    如果您查看 15.4-Stack 用户指南中的 BIM 概述 、您会发现它的运行与 OAD 映像头密切相关、OAD 映像头也嵌入了通过 OAD 映像工具计算出的 CRC。  您是否在项目中包含了 crc.c/h 和 oad_image_header.h 文件并相应地将目录包含在项目中?  您是否还替换了 oad_app.cfg 配置文件?  也许、参考《Z-Stack 用户指南 》将客户端功能添加到应用 部分将有助于满足您的15.4-Stack 需求。

    此致、
    Ryan