如何设置BootLoader和UserApp的程序地址

发布时间:2018-07-01 07:27:46   来源:文档文库   
字号:
************************************************* * 如何设置bootloader和user app的程序地址 * ************************************************* 当系统中,只有一个程序时,可以直接从起始地址开始运行; 但当系统中有两个程序时,例如, 带bootloader的系统,则应用程序的运行需要通过bootloader跳转, 和bootloader相比,应用程序的地址和中断向量表地址都发生改变, 如何告诉编译器来分配bootloader和应用程序在flash中的地址, 以及如何告诉CPU中断表向表的位置,是本文讨论的主要内容。 (一)如何设置bootloader和user app的程序地址 首先我们来看看IAR下LPC2478的分散加载文件:LPC2478_Flash.icf ------------------------------------------------------------------------------------- /*-Specials-*/ define symbol__ICFEDIT_intvec_start__ = 0x00000000;//中断向量表的起始地址 /*-MemoryRegions-*/ 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 ofICF editor section. ###ICF###*/ ------------------------------------------------------------------------------------- 从上面可以看出,中断向量表是放在起始地址0处的,它占64个字节,从0x44开始存放用户程序, 保证用户程序不占用中断向量表的空间;这是bootloader的设置。 理解了地址设置的方法,user app的地址就好办了, 比如说,bootloader在0x0~0x4000,那么用户程序为了保证不覆盖bootloader, 则应该从0x4000开始,我们作如下设置 ------------------------------------------------------------------------------------- /*###ICF###Section handled by ICF editor, don't touch! ****/ /*-Editorannotation file-*/ /*IcfEditorFile="$TOOLKIT_DIR$/config/ide/IcfEditor/a_v1_0.xml" */ /*-Specials-*/ define symbol__ICFEDIT_intvec_start__ = 0x00004000; //中断向量表的起始地址 /*-MemoryRegions-*/ 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_siz e_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 ofICF editor section. ###ICF###*/ ------------------------------------------------------------------------------------- 地址是设置好了,我们分别编译bootloader和user app,并下载到目标系统中去运行,程序真的跑起来了, 说明地址设置是正确的,可是一用中断,程序就死掉了,这是怎么回事呢。 原来,user app中的中断向量表在0x4000,CPU中断不会跳转到这里来,而是跳转到0x0, 0x0是bootloader的中断向量表,当然会出错,那么如何设置user app的中断向量表呢。 (二)如何设置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了。 结语: 对于不是在起始地址运行的程序,除了修改分散加载文件中的起始地址外,还需要注意中断向量表, 否则系统将不能正常的工作。

本文来源:https://www.2haoxitong.net/k/doc/38de0e9f0740be1e640e9a79.html

《如何设置BootLoader和UserApp的程序地址.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式