在IAR环境下,lpc2478 用户程序的地址及中断向量设置
来源:互联网 发布:济南编程培训学校 编辑:程序博客网 时间:2024/05/21 19:48
几千行的程序都写完了 从ADS转到IAR下的时候 头疼了三天程序都没跑起来 在失望之余 猛然看到了这个帖子 内牛满面啊!!!
摘要:
当系统中,只有一个程序时,可以直接从起始地址开始运行;但当系统中有两个程序时,例如带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); 来设置,它的中断向量表只能是几个固定的位置:
这里我们可以将中断向量表映射到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了。
结语:
对于不是在起始地址运行的程序,除了修改分散加载文件中的起始地址外,还需要注意中断向量表,否则系统将不能正常的工作。
- 在IAR环境下,lpc2478 用户程序的地址及中断向量设置
- 在IAR环境下,lpc2478 用户程序的地址及中断向量设置
- lpc 用户程序的地址及中断向量设置
- LPC2478 向量中断控制器(VIC)
- IAR的中断程序
- IAR环境下中断控制
- STM8中断的设置(ST Visual Develop和IAR环境下)
- 关于uClinux在LPC2478下的移植
- 在裸机上在bios中断向量表中,汇编设置增加中断服务程序(向量地址设置三种方式)
- 中断向量的设置
- keil环境下stm32f030R8 APP程序中断向量的重映射
- LPC2478的外部中断使用
- IAR环境下中断函数无反应
- IAR环境下中断函数无反应
- s5pv210 的中断向量表及中断在Linux下虚拟地址和物理地址的定义
- TI z-stack 在IAR环境下的错误处理
- IAR环境下ucosii在STM32上的移植
- EFM32在使用IAR开发环境配置ICf文件以及指定程序存储地址空间
- Ie8兼容性问题web.config设置
- Ie8兼容性问题web.config设置
- 停止编程
- 提取sybase数据库结构
- 在.NET中 DAL+IDAL+Model+BLL+Web
- 在IAR环境下,lpc2478 用户程序的地址及中断向量设置
- Silverlight 2.5D RPG游戏技巧与特效处理:(二十一)自定义路径动画
- MySQL myisam和innodb区别
- ★ Visual Studio 2008 每日小窍门 【持续发布ing~】 Tips:042
- 原型设计工具Balsamiq Mockups
- 简洁、明晰!数据库设计三大范式应用实例剖析
- MAT
- 零售业100个创意促销方案
- Sleep Sort