解决&Load$$ER_RAM$$Base赋值语句的崩溃

本文解决了一个在调试TinyHal.CPP的BootEntry函数时遇到的问题,即在给LOAD_IMAGE_Start变量赋值时出现总线错误。通过调整scatterfile_tools_mdk.xml文件中ER_RAM_RO字段的Base值从0x00000000改为0x20000000,成功解决了该问题。
AI助手已提取文章相关产品:

//=====================================================================
//TITLE:
// 解决&Load$$ER_RAM$$Base赋值语句的崩溃
//AUTHOR:
// norains
//DATE:
// Monday 27-September-2010
//Environment:
// KEIL MDK 4.0
// .NET Micro Framework 4.1
//=====================================================================

也许大家将一切参数都规规矩矩设置完毕,满怀希望开始调试NativeSample时,突然发现在调试TinyHal.CPP的BootEntry函数时卡壳了。具体点来说,就是在调试到LOAD_IMAGE_Start = (UINT32)&Load$$ER_RAM$$Base;这个语句的时候,会出现总线错误,如图:

这时候可能大家的第一反应是Heap或Stack的设置有误。但实际上,无论你怎么设置Heap或Stack,这个错误还是依然存在的。所以基本可以确定,问题不出在Heap和Stack的设置。如果大家还有心的话,修改TinyHal.cpp的代码,比如在BootEntry增添如下语句:

int i = 0; i = 1;

会发现一切都是正常的。那么为什么偏偏给LOAD_IMAGE_Start赋值的时候就出错了呢?是不是LOAD_IMAGE_Start有什么蹊跷?我们可以再次执行debug,设置断点,然后在symbols窗口查看LOAD_IMAGE_Start的地址,如图:

  看到什么了么?没错!LOAD_IMAGE_Start的地址是0x0000 0040,而这个根本就不是内存的地址!那么0x0000 0040此时会是什么地址呢?如果是以Flash模式启动,Flash的地址就印射到0x0000 0000,那么这时候的0x0000 0040指向的就是Flash!现在直接往Flash写数值,肯定会引发BUS ERROR!

找到问题的根源,一切就好办了。打开scatterfile_tools_mdk.xml文件,发现ER_RAM_RO字段的设置如下:

<ExecRegion Name="ER_RAM_RO" Base="0x00000000" Options="ABSOLUTE" Size="">

起始地址为0x0000 0000,这是不正确的,因为内存地址是以0x2000 0000为起始的。如果大家不明白这地址的来源,可以查看我这篇文章:《详解STM32F10x在.Net Micro Framework的Processor Properties的取值》(http://blog.youkuaiyun.com/norains/archive/2010/09/20/5896807.aspx)。现在只要将Base的数值更改为0x2000 0000即可,如:

<ExecRegion Name="ER_RAM_RO" Base="0x20000000" Options="ABSOLUTE" Size="">

这时候再开始调试,发现已经能够顺利执行LOAD_IMAGE_Start变量的赋值,如图:

  

您可能感兴趣的与本文相关内容

#! armclang -E --target=arm-arm-none-eabi -mcpu=cortex-m33 -xc ; command above MUST be in first line (no comment above!) /* ;-------- <<< Use Configuration Wizard in Context Menu >>> ------------------- */ /*--------------------- Flash Configuration ---------------------------------- ; <h> Flash Configuration ; <o0> Flash Base Address <0x0-0xFFFFFFFF:8> ; <o1> Flash Size (in Bytes) <0x0-0xFFFFFFFF:8> ; </h> *----------------------------------------------------------------------------*/ ;; SRAM1 ;#define __ROM_BASE 0x1FFFC000 ;#define __ROM_SIZE 0x0004000 // 16k ; SRAM2 ;#define __ROM_BASE 0x20000000 ;#define __ROM_SIZE 0x00004000 // 16k ; Flash #define __ROM_BASE 0x01000000 #define __ROM_SIZE 0x00010000 // 64kb /*--------------------- Embedded RAM Configuration --------------------------- ; <h> RAM Configuration ; <o0> RAM Base Address <0x0-0xFFFFFFFF:8> ; <o1> RAM Size (in Bytes) <0x0-0xFFFFFFFF:8> ; </h> *----------------------------------------------------------------------------*/ #define __RAM_BASE 0x1FFFC000 #define __RAM_SIZE 0x00006000 #define __RAM1_BASE 0x20002000 #define __RAM1_SIZE 0x00002000 /*--------------------- Stack / Heap Configuration --------------------------- ; <h> Stack / Heap Configuration ; <o0> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ; <o1> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; </h> *----------------------------------------------------------------------------*/ #define __STACK_SIZE 0x00000800 #define __HEAP_SIZE 0x00000000 /*---------------------------------------------------------------------------- User Stack & Heap boundery definition *----------------------------------------------------------------------------*/ #define __STACK_TOP (__RAM_BASE + __RAM_SIZE) /* starts at end of RAM */ #define __HEAP_BASE (AlignExpr(+0, 8)) /* starts after RW_RAM section, 8 byte aligned */ /*---------------------------------------------------------------------------- Scatter File Definitions definition *----------------------------------------------------------------------------*/ #define __RO_BASE __ROM_BASE #define __RO_SIZE __ROM_SIZE #define __RW_BASE (__RAM_BASE ) #define __RW_SIZE (__RAM_SIZE - __STACK_SIZE - __HEAP_SIZE) LR_ROM __RO_BASE __RO_SIZE { ; load region size_region ER_ROM __RO_BASE __RO_SIZE { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) ; *(Veneer$$CMSE) ; uncomment for secure applications .ANY (+RO) .ANY (+XO) } RW_RAM __RW_BASE __RW_SIZE { ; RW data OISV4AlgoLib.lib(+RO +XO) } RW_RAM1 __RAM1_BASE __RAM1_SIZE { ; RW data .ANY (+RW +ZI) *(.ARM.__at_0x20002000) *(.ARM.__at_0x20003000) } #if __HEAP_SIZE > 0 ARM_LIB_HEAP __HEAP_BASE EMPTY __HEAP_SIZE { ; Reserve empty region for heap } #endif ARM_LIB_STACK __STACK_TOP EMPTY -__STACK_SIZE { ; Reserve empty region for stack } } 我的这个sct文件为什么编译出来还是显示OISV4AlgoLib.lib还是被分配在flash了 Exec Addr Load Addr Size Type Attr Idx E Section Name Object 0x01000000 0x01000000 0x000000c8 Data RO 7 RESET startup_armcm33.o 0x010000c8 0x010000c8 0x00000000 Code RO 710 * .ARM.Collect$$$$00000000 mc_w.l(entry.o) 0x010000c8 0x010000c8 0x00000004 Code RO 746 .ARM.Collect$$$$00000003 mc_w.l(entry4.o) 0x010000cc 0x010000cc 0x00000004 Code RO 749 .ARM.Collect$$$$00000004 mc_w.l(entry5.o) 0x010000d0 0x010000d0 0x00000000 Code RO 751 .ARM.Collect$$$$00000008 mc_w.l(entry7b.o) 0x010000d0 0x010000d0 0x00000000 Code RO 753 .ARM.Collect$$$$0000000A mc_w.l(entry8b.o) 0x010000d0 0x010000d0 0x00000008 Code RO 754 .ARM.Collect$$$$0000000B mc_w.l(entry9a.o) 0x010000d8 0x010000d8 0x00000000 Code RO 756 .ARM.Collect$$$$0000000D mc_w.l(entry10a.o) 0x010000d8 0x010000d8 0x00000000 Code RO 758 .ARM.Collect$$$$0000000F mc_w.l(entry11a.o) 0x010000d8 0x010000d8 0x00000004 Code RO 747 .ARM.Collect$$$$00002714 mc_w.l(entry4.o) 0x010000dc 0x010000dc 0x00000024 Code RO 713 .text mc_w.l(memcpya.o) 0x01000100 0x01000100 0x00000024 Code RO 715 .text mc_w.l(memseta.o) 0x01000124 0x01000124 0x0000001a Code RO 717 .text mc_w.l(memcmp.o) 0x0100013e 0x0100013e 0x00000036 Code RO 721 .text mf_w.l(dcmple.o) 0x01000174 0x01000174 0x00000036 Code RO 723 .text mf_w.l(dcmpgt.o) 0x010001aa 0x010001aa 0x00000026 Code RO 725 .text mf_w.l(f2d.o) 0x010001d0 0x010001d0 0x00000000 Code RO 767 .text mc_w.l(iusefp.o) 0x010001d0 0x010001d0 0x00000024 Code RO 768 .text mc_w.l(init.o) 0x010001f4 0x010001f4 0x00000056 Code RO 778 .text mc_w.l(__dczerorl2.o) 0x0100024a 0x0100024a 0x00000002 PAD 0x0100024c 0x0100024c 0x000000b4 Code RO 42 .text.ADC_Handler awdevhardanalogproc.o 0x01000300 0x01000300 0x00000002 Code RO 190 .text.AwAdjustPllFreqSub awdevhardsystemproc.o 0x01000302 0x01000302 0x00000002 PAD 0x01000304 0x01000304 0x00000086 Code RO 222 .text.AwAlgoAcclSignalProcessScheme awalgoshakedetect.o 0x0100038a 0x0100038a 0x00000002 PAD 0x0100038c 0x0100038c 0x00000070 Code RO 524 .text.AwAlgoAngleCompPhaseFilterIIR OISV4AlgoLib.lib(awalgoshakefilterscheme.o) 0x010003fc 0x010003fc 0x00000004 PAD 0x01000400 0x01000400 0x000001c8 Code RO 220 .text.AwAlgoAnomalyDetectAndRecoveryScheme awalgoshakedetect.o 0x010005c8 0x010005c8 0x00000054 Code RO 670 .text.AwAlgoAverageFilterFIR OISV4AlgoLib.lib(awalgosynthfilterscheme.o) 0x0100061c 0x0100061c 0x0000004c Code RO 676 .text.AwAlgoBiquadFilterIIR OISV4AlgoLib.lib(awalgosynthfilterscheme.o) 0x01000668 0x01000668 0x00000060 Code RO 520 .text.AwAlgoCompPhaseDcFilterIIR OISV4AlgoLib.lib(awalgoshakefilterscheme.o) 0x010006c8 0x010006c8 0x00000054 Code RO 678 .text.AwAlgoCompPhaseFilterIIR OISV4AlgoLib.lib(awalgosynthfilterscheme.o) 0x0100071c 0x0100071c 0x00000068 Code RO 587 .text.AwAlgoCompSchemeAFDrift OISV4AlgoLib.lib(awalgocompscheme.o) 0x01000784 0x01000784 0x00000068 Code RO 585 .text.AwAlgoCompSchemeCrosstalk OISV4AlgoLib.lib(awalgocompscheme.o) 0x010007ec 0x010007ec 0x00000058 Code RO 583 .text.AwAlgoCompSchemeExcitation OISV4AlgoLib.lib(awalgocompscheme.o) 0x01000844 0x01000844 0x00000014 Code RO 591 .text.AwAlgoCompSchemeNatureCenter OISV4AlgoLib.lib(awalgocompscheme.o) 0x01000858 0x01000858 0x00000094 Code RO 589 .text.AwAlgoCompSchemeTemperature OISV4AlgoLib.lib(awalgocompscheme.o) 0x010008ec 0x010008ec 0x00000080 Code RO 623 .text.AwAlgoFraSignalGenerate OISV4AlgoLib.lib(awalgosignalgeneratescheme.o) 0x0100096c 0x0100096c 0x000000fc Code RO 606 .text.AwAlgoFraSignalGenerateAndTest OISV4AlgoLib.lib(awalgofracalculatescheme.o) 0x01000a68 0x01000a68 0x00000260 Code RO 216 .text.AwAlgoGetGyroScopeRawDataAndSendNextFrameScheme awalgoshakedetect.o 0x01000cc8 0x01000cc8 0x00000050 Code RO 680 .text.AwAlgoGroupFilterIIR OISV4AlgoLib.lib(awalgosynthfilterscheme.o) 0x01000d18 0x01000d18 0x0000005c Code RO 522 .text.AwAlgoGyroDriftRemoveFilterIIR OISV4AlgoLib.lib(awalgoshakefilterscheme.o) 0x01000d74 0x01000d74 0x0000006c Code RO 518 .text.AwAlgoHighPassDcFilterIIR OISV4AlgoLib.lib(awalgoshakefilterscheme.o) 0x01000de0 0x01000de0 0x00000104 Code RO 226 .text.AwAlgoKalmanAngleSchemeCalcScheme awalgoshakedetect.o 0x01000ee4 0x01000ee4 0x00000004 PAD 0x01000ee8 0x01000ee8 0x00000324 Code RO 496 .text.AwAlgoKalmanFilter OISV4AlgoLib.lib(awalgokalmanscheme.o) 0x0100120c 0x0100120c 0x000000a4 Code RO 641 .text.AwAlgoLinearCovertCurve OISV4AlgoLib.lib(awalgolinearcovertscheme.o) 0x010012b0 0x010012b0 0x0000002c Code RO 643 .text.AwAlgoLinearCovertRemap OISV4AlgoLib.lib(awalgolinearcovertscheme.o) 0x010012dc 0x010012dc 0x00000530 Code RO 553 .text.AwAlgoLoopControlAlgo OISV4AlgoLib.lib(awalgoloopcontrol.o) 0x0100180c 0x0100180c 0x000000ac Code RO 536 .text.AwAlgoPantiltModeCheck OISV4AlgoLib.lib(awalgostatemodescheme.o) 0x010018b8 0x010018b8 0x000000dc Code RO 653 .text.AwAlgoPidControlAccurate OISV4AlgoLib.lib(awalgopidcontrolscheme.o) 0x01001994 0x01001994 0x0000026c Code RO 228 .text.AwAlgoRadDistanceCovertScheme awalgoshakedetect.o
11-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值