在线时间15 小时
UID421178
注册时间2013-3-15
NXP金币0
该用户从未签到
金牌会员
 
- 积分
- 2167
- 最后登录
- 1970-1-1
|
发表于 2013-3-25 11:06:50
|
显示全部楼层
RE:Kinetis系列 在CodeWarrior环境下函数绝对地址(正解)
CodeWarrior项目中要将函数放在特定位置,需要在链接配置文件(.lcf)定义特定存储空间,指定其起始地址和存储空间大小。然后在链接配置文件(.lcf)中定义存储区块section。
例如在下面的链接配置文件(.lcf)中定义了m_paraconfig存储空间,并且在m_paraconfig存储空间中定义了.paraconfig 的存储区块。
MEMORY {
interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x000001BC
code (RX) : ORIGIN = 0x00000410, LENGTH = 0x0003FBF0
data (RW) : ORIGIN = 0x1FFF8000, LENGTH = 0x00010000
cfmprotrom (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010
m_paraconfig (RX) : ORIGIN = 0x10000000, LENGTH = 0x00008000
}
SECTIONS {
.paraconfig :
{
*(.paraconfig)
. = ALIGN (0x4);
} > m_paraconfig
...
}
代码中使用#progma 为编译器指定所调用存储区块section,使用__declspec()函数设定函数放置在这个区域中。
例如:
#pragma define_section mySectionInROM ".romsymbols" far_abs RX
__declspec(section "mySectionInROM") void funcInROM(int flag); //Fcn Prototype
void funcInROM(int flag){
if (flag > 0)
{
printf("Option 1 selected \n\r");
printf("Executing funcInROM() \n\r");
printf("This function is executed from section myROM \n\r");
}
}
可以参看应用手册AN4498获得更多信息。
http://cache.freescale.com/files/soft_dev_tools/doc/app_note/AN4498.pdf
下面的代码是Kinetis串行bootloader的客户代码引导程序(AN2295):
//-----------------------------------------------------------------------------
// FUNCTION: JumpToUserApplication
// SCOPE: Bootloader application system function
// DESCRIPTION: The function startup user application
//
// PARAMETERS: pointer on user vector table
//
// RETURNS: function never go back
//-----------------------------------------------------------------------------
static void JumpToUserApplication(LWord userStartup)
{
/* set up stack pointer */
asm("LDR r13, [r0]");
/* jump to application reset vector */
asm("ADD r0,r0,#0x04 ");
asm("LDR r0, [r0]");
asm("BX r0");
}
调用方法:
// Jump to user application
JumpToUserApplication(RELOCATED_VECTORS);
可以看到,bootloader需要加载客户代码中断服务向量表,Kinetis中断服务向量表的vector 0为初始栈指针,vector 1为PC指针。
所以需要将中断服务向量表地址+0x4获得PC指针,然后再跳转运行客户代码。
假设函数绝对地址在0x0001F000处,那么它是否对应flash映像地址就是在该处?如果我需要给PC赋值访问该函数,PC值应该是多少?
您的问题与Bootloader运行还是有些区别,0x0001F000应该是函数入口地址,位于Flash内存区域。要给PC指针赋值,那应该是放上0x0001F000地址即可。
祝顺利。 |
|