(原创)在IAR环境下,lpc2478 用户程序的地址及中断向量设置(IAR)(地址)(中断向量)(bootloader)...

摘要:

   当系统中,只有一个程序时,可以直接从起始地址开始运行;但当系统中有两个程序时,例如带bootloader的系统,则应用程序的运行需要通过bootloader跳转,和bootloader相比,应用程序的地址和中断向量表地址都发生改变,如何告诉编译器来分配bootloader和应用程序在flash中的地址以及如何告诉CPU中断表向表的位置,是本文讨论的主要内容。

简介:

1、如何设置bootloader和user app的程序地址

    首先我们来看看IAR下LPC2478的分散加载文件:LPC2478_Flash.icf

 
  
/* -Specials- */
define symbol __ICFEDIT_intvec_start__
= 0x00000000 ;//中断向量表的起始地址
/* -Memory Regions- */
define symbol __ICFEDIT_region_ROM_start__
= 0x00000044 ; //程序ROM起始地址
define symbol __ICFEDIT_region_ROM_end__
= 0x0007FFFF ;
define symbol __ICFEDIT_region_RAM_start__
= 0x40000000 ; //数据RAM的起始地址
define symbol __ICFEDIT_region_RAM_end__
= 0x4000FFFF ;


/* -Sizes- */
define symbol __ICFEDIT_size_cstack__
= 0x100 ;
define symbol __ICFEDIT_size_svcstack__
= 0x100 ;
define symbol __ICFEDIT_size_irqstack__
= 0x100 ;
define symbol __ICFEDIT_size_fiqstack__
= 0x40 ;
define symbol __ICFEDIT_size_undstack__
= 0x40 ;
define symbol __ICFEDIT_size_abtstack__
= 0x40 ;
define symbol __ICFEDIT_size_heap__
= 0x1000 ;
/* *** End of ICF editor section. ###ICF### */

    从上面可以看出,中断向量表是放在起始地址0处的,它占64个字节,从0x44开始存放用户程序,保证用户程序不占用中断向量表的空间;这是bootloader的设置。

  理解了地址设置的方法,user app的地址就好办了:

  比如说,bootloader在0x0~0x4000,那么用户程序为了保证不覆盖bootloader,则应该从0x4000开始,我们作如下设置

 
  
/* ###ICF### Section handled by ICF editor, don't touch! *** */
/* -Editor annotation file- */
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */
/* -Specials- */
define symbol __ICFEDIT_intvec_start__
= 0x00004000 ; //中断向量表的起始地址
/* -Memory Regions- */
define symbol __ICFEDIT_region_ROM_start__
= 0x00004044 ;//程序ROM起始地址
define symbol __ICFEDIT_region_ROM_end__
= 0x0007FFFF ;
define symbol __ICFEDIT_region_RAM_start__
= 0x40000040 ;//数据RAM的起始地址 为什么要空出0x40,后面再解释
define symbol __ICFEDIT_region_RAM_end__
= 0x4000FFFF ;


/* -Sizes- */
define symbol __ICFEDIT_size_cstack__
= 0x100 ;
define symbol __ICFEDIT_size_svcstack__
= 0x100 ;
define symbol __ICFEDIT_size_irqstack__
= 0x100 ;
define symbol __ICFEDIT_size_fiqstack__
= 0x40 ;
define symbol __ICFEDIT_size_undstack__
= 0x40 ;
define symbol __ICFEDIT_size_abtstack__
= 0x40 ;
define symbol __ICFEDIT_size_heap__
= 0x1000 ;
/* *** End of ICF editor section. ###ICF### */

  地址是设置好了,我们分别编译bootloader和user app,并下载到目标系统中去运行,程序真的跑起来了,说明地址设置是正确的,可是一用中断,程序就死掉了,这是怎么回事呢。

  原来,user app中的中断向量表在0x4000,CPU中断不会跳转到这里来,而是跳转到0x0,0x0是bootloader的中断向量表,当然会出错,那么如何设置user app的中断向量表呢。

2、如何设置bootloader和user app的中断向量表

    在lpc系列AR7的中断向量表,它不像STM32(cortex-m3)那样可以通过 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); 来设置,它的中断向量表只能是几个固定的位置:

2011041413560017.jpg 

这里我们可以将中断向量表映射到RAM中(RAM起始地址0x40000000~0x400000040),然后在0x4000处将中断向量表复制到RAM里,那么这样就能正常中断了,在user app初始化时,加入如下代码:

 
  
// 将向量表复制到内存
// 注意在分散加载文件中将内存:0x40000000~0x40000000+16*4.保留.
if ( 1 )
{
memcpy((BYTE
* ) 0x40000000 , (BYTE * ) 0x4000 , 16 * 4 );
MEMMAP
= 0x02 ; // 中断向量表设置在RAM中
}

为了保证RAM址0x40000000~0x400000040不被程序占用,在ICF文件中的  define symbol __ICFEDIT_region_RAM_start__ = 0x40000040; 而不是0x40000000了。

结语:

   对于不是在起始地址运行的程序,除了修改分散加载文件中的起始地址外,还需要注意中断向量表,否则系统将不能正常的工作。


转载于:https://www.cnblogs.com/liu_xf/archive/2011/04/14/2015941.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值