TI中文支持网
TI专业的中文技术问题搜集分享网站

从boot 到 app的启动问题

大家好,遇到一个理解不了的问题,还请各位高手帮忙看看

我的是2812处理器,使用的都是片上的资源,我的代码分为两个部分,一部分是boot,另一部分是app,单板启动的时候,首先根据硬件XMP/NMC的配置选择微计算机模式启动,根据GPIO4=1,所以程序跳转到0x3f7ff6运行,而此处放的代码从map文件中看是:

codestart* 0 003f7ff6 00000002 003f7ff6 00000002 DSP281x_CodeStartBranch.obj (codestart)

这段代码的内容是:

.sect "codestart"

code_start:
.if WD_DISABLE == 1
LB wd_disable ;Branch to watchdog disable code
.else
LB _CheckUserCode ;Branch to start of boot.asm in RTS library
.endif

最后会执行CheckUserCode()函数:

#pragma CODE_SECTION(CheckUserCode,"flashfuncs");
void CheckUserCode(void)
{
if( fcs16(PPPINITFCS16, USER_CODE_START, USER_CODE_LENGTH, CRC_LITTLE_ENDIAN) == PPPGOODFCS16 )
{
//goto the User Project Code Start
asm(" LB 0x3F3FFC");
}
{
//goto the Safe project Code Start
SafeModeInitiator = BOOTED_DIRECTLY_TO_SAFE_MODE;
asm(" LB 0x3F7F7E");
}
}

然后根据crc校验去决定 接下来执行boot代码还是跳转到app程序运行。

这是我的板子代码的启动过程,我的问题是如果app程序有改变的时候,是不是crc校验的值就变了呢?那么是否需要更新此校验码?但是奇怪的是我每次改动app后,并没有更新此校验值,但是还是可以跳转到app运行,为什么?

Eric Ma:

你指的是带仿真器调试的时候还是单机跑的时候?

如果是仿真器调试,CCS会自动跳到main,跳过boot的过程。如果是单机跑的情况仍可以跳转到main,那你就需要单步看一下这个代码是怎么执行,让调试的入口地址改到code_start。

ERIC

大家好,遇到一个理解不了的问题,还请各位高手帮忙看看

我的是2812处理器,使用的都是片上的资源,我的代码分为两个部分,一部分是boot,另一部分是app,单板启动的时候,首先根据硬件XMP/NMC的配置选择微计算机模式启动,根据GPIO4=1,所以程序跳转到0x3f7ff6运行,而此处放的代码从map文件中看是:

codestart* 0 003f7ff6 00000002 003f7ff6 00000002 DSP281x_CodeStartBranch.obj (codestart)

这段代码的内容是:

.sect "codestart"

code_start:
.if WD_DISABLE == 1
LB wd_disable ;Branch to watchdog disable code
.else
LB _CheckUserCode ;Branch to start of boot.asm in RTS library
.endif

最后会执行CheckUserCode()函数:

#pragma CODE_SECTION(CheckUserCode,"flashfuncs");
void CheckUserCode(void)
{
if( fcs16(PPPINITFCS16, USER_CODE_START, USER_CODE_LENGTH, CRC_LITTLE_ENDIAN) == PPPGOODFCS16 )
{
//goto the User Project Code Start
asm(" LB 0x3F3FFC");
}
{
//goto the Safe project Code Start
SafeModeInitiator = BOOTED_DIRECTLY_TO_SAFE_MODE;
asm(" LB 0x3F7F7E");
}
}

然后根据crc校验去决定 接下来执行boot代码还是跳转到app程序运行。

这是我的板子代码的启动过程,我的问题是如果app程序有改变的时候,是不是crc校验的值就变了呢?那么是否需要更新此校验码?但是奇怪的是我每次改动app后,并没有更新此校验值,但是还是可以跳转到app运行,为什么?

jinfeng li:

回复 Eric Ma:

谢谢您的回复,单机跑的时候也能跑到app代码执行,请问把调试入口改到code_start如何操作?多谢!

大家好,遇到一个理解不了的问题,还请各位高手帮忙看看

我的是2812处理器,使用的都是片上的资源,我的代码分为两个部分,一部分是boot,另一部分是app,单板启动的时候,首先根据硬件XMP/NMC的配置选择微计算机模式启动,根据GPIO4=1,所以程序跳转到0x3f7ff6运行,而此处放的代码从map文件中看是:

codestart* 0 003f7ff6 00000002 003f7ff6 00000002 DSP281x_CodeStartBranch.obj (codestart)

这段代码的内容是:

.sect "codestart"

code_start:
.if WD_DISABLE == 1
LB wd_disable ;Branch to watchdog disable code
.else
LB _CheckUserCode ;Branch to start of boot.asm in RTS library
.endif

最后会执行CheckUserCode()函数:

#pragma CODE_SECTION(CheckUserCode,"flashfuncs");
void CheckUserCode(void)
{
if( fcs16(PPPINITFCS16, USER_CODE_START, USER_CODE_LENGTH, CRC_LITTLE_ENDIAN) == PPPGOODFCS16 )
{
//goto the User Project Code Start
asm(" LB 0x3F3FFC");
}
{
//goto the Safe project Code Start
SafeModeInitiator = BOOTED_DIRECTLY_TO_SAFE_MODE;
asm(" LB 0x3F7F7E");
}
}

然后根据crc校验去决定 接下来执行boot代码还是跳转到app程序运行。

这是我的板子代码的启动过程,我的问题是如果app程序有改变的时候,是不是crc校验的值就变了呢?那么是否需要更新此校验码?但是奇怪的是我每次改动app后,并没有更新此校验值,但是还是可以跳转到app运行,为什么?

jinfeng li:

回复 jinfeng li:

补充一下,我用的是ccs3.3 ,调试器是seed-xds560plus。多谢!

大家好,遇到一个理解不了的问题,还请各位高手帮忙看看

我的是2812处理器,使用的都是片上的资源,我的代码分为两个部分,一部分是boot,另一部分是app,单板启动的时候,首先根据硬件XMP/NMC的配置选择微计算机模式启动,根据GPIO4=1,所以程序跳转到0x3f7ff6运行,而此处放的代码从map文件中看是:

codestart* 0 003f7ff6 00000002 003f7ff6 00000002 DSP281x_CodeStartBranch.obj (codestart)

这段代码的内容是:

.sect "codestart"

code_start:
.if WD_DISABLE == 1
LB wd_disable ;Branch to watchdog disable code
.else
LB _CheckUserCode ;Branch to start of boot.asm in RTS library
.endif

最后会执行CheckUserCode()函数:

#pragma CODE_SECTION(CheckUserCode,"flashfuncs");
void CheckUserCode(void)
{
if( fcs16(PPPINITFCS16, USER_CODE_START, USER_CODE_LENGTH, CRC_LITTLE_ENDIAN) == PPPGOODFCS16 )
{
//goto the User Project Code Start
asm(" LB 0x3F3FFC");
}
{
//goto the Safe project Code Start
SafeModeInitiator = BOOTED_DIRECTLY_TO_SAFE_MODE;
asm(" LB 0x3F7F7E");
}
}

然后根据crc校验去决定 接下来执行boot代码还是跳转到app程序运行。

这是我的板子代码的启动过程,我的问题是如果app程序有改变的时候,是不是crc校验的值就变了呢?那么是否需要更新此校验码?但是奇怪的是我每次改动app后,并没有更新此校验值,但是还是可以跳转到app运行,为什么?

jinfeng li:

回复 jinfeng li:

各位大神,

我发现每一次修改代码后编译出来的bin文件的crc16都是相同的,

ccs编译出来的首先是coff文件,然后调用了coff2bin.exe把coff文件转换为了bin文件用于在线烧写flash.

请问为什么bin文件的crc校验每次修改,并重新生成后都相同?

多谢!

赞(0)
未经允许不得转载:TI中文支持网 » 从boot 到 app的启动问题
分享到: 更多 (0)