• EFM32在使用IAR开发环境配置ICf文件以及指定程序存储地址空间


    EFM32在IAR开发环境下指定代码,数据的存储空间

    为了便于后续的项目升级,管理,需要对代码,数据的存储空间加以设定,也在网上找下相关的资料,笔者水平有限,

    如下内容不一定完全正确,如有错误之后,还望帮忙纠正.首先,有必要了解一下IAR开发环境的ILINK,IAR的版本要

    在IAR5.xx以后,本人是在IAR6.21版本之上调试,目前我也将版本更新到6.50了,推荐使用IAR更新版本的.

    下载地址:http://pan.baidu.com/share/link?shareid=328871&uk=3842212607

    破解补丁下载地址:http://download.csdn.net/detail/fzhiping2435118a/6644531

    安装好IAR开发环境之后,我们可以打开IAR的帮助文档,查看关于ILINK的使用说明.打开help的下拉菜单,打开C/C++ Development Guide选项。

    第一部分有详细讲述关于ILINK

    其实,刚开始我们建立工程的时候也有使用到这个,可能没有引起关注,在Project->Options选项中,我们可以根据

    实际MCU的memory和堆栈的大小在这里进行配置.我们打开这个*.icf文件看看具体的内容.*号是通配符,名称可以用

    户自定义更改,下面是EFM32TG110F32时使用的ICF文件:EFM32TG110F32.icf这里其实主要定义了ROM,RAM和

    堆栈的起始地址,结束地址.

    /*###ICF### Section handledby ICF editor, don't touch! ****/

    /*-Editor annotation file-*/

    /*IcfEditorFile="$TOOLKIT_DIR$configideIcfEditorcortex_v1_0.xml" */

    /*-Specials-*/

    define symbol__ICFEDIT_intvec_start__ = 0x00000000;

    /*-Memory Regions-*/

    define symbol__ICFEDIT_region_ROM_start__ = 0x00000000;

    define symbol__ICFEDIT_region_ROM_end__   =(0x00000000+0x00020000-1);

    define symbol__ICFEDIT_region_RAM_start__ = 0x20000000;

    define symbol__ICFEDIT_region_RAM_end__   =(0x20000000+0x00004000-1);

    /*-Sizes-*/

    define symbol__ICFEDIT_size_cstack__ = 0x400;

    define symbol__ICFEDIT_size_heap__   = 0x800;

    /**** End of ICF editorsection. ###ICF###*/

     

    define memory mem with size =4G;

    define region ROM_region   = mem:[from__ICFEDIT_region_ROM_start__   to__ICFEDIT_region_ROM_end__];

    define region RAM_region   = mem:[from__ICFEDIT_region_RAM_start__   to__ICFEDIT_region_RAM_end__];

     

    define block CSTACK    with alignment = 8, size =__ICFEDIT_size_cstack__   { };

    define block HEAP      with alignment = 8, size =__ICFEDIT_size_heap__     { };

     

    initialize by copy {readwrite };

    do not initialize  { section .noinit };

     

    keep { section .intvec };

    place at addressmem:__ICFEDIT_intvec_start__ { readonly section .intvec };

     

    place in ROM_region   { readonly };

    place in RAM_region   { readwrite,

                            block CSTACK,

                            block HEAP };

     

    我们可以在C程序当中的代码前使用,获取当前代码的位置.

    #pragma location = ".xxx"       这里没有结束分号,xxx为自定义的变量.

     

    然后就可以在icf文件中加上:

    define symbol__ICFEDIT_region_DATRAM_start__ = 0x20000500;

    place at addressmem:__ICFEDIT_region_DATRAM_start__ {section .xxx };

     

     

    __ICFEDIT_region_DATRAM_start__是符号的名称,用户可自行定义.

    这里的地址也需要根据自己的MCU定义.

     

    这里需要注意的是:如果是定义的ROM的空间里面,那么ROM里面只能是readonly的属性,因此,

    假如一个数组char array[10];那么它必须是char const array[10]; 这样才能正确的指定到具体地址去.

     

    例如:

    C程序:

    #pragma location = ".test"

    Char const array[10];

    Icf文件:

    place in ROM_region   { readonly  .test};/* ROM_region 可以自己定义*/

    修改完成之后,我们可以进入DEBUG模式,打开View菜单下的memory选项,查看具体的地址中的内容是否与你需要的内容一致呢。动手看看吧.

  • 相关阅读:
    Big Number
    Who will be punished
    find your present (2)
    Being a Good Boy in Spring Festival
    day4__列表的初识(列表的创建、增删改查、元组、range)
    day3、基础___(基础数字类型、字符串索引与切片、str常用操作方法)
    day2、基础__(while循环、格式化输出、运算符、初始编码)
    day1: 基础 __ (变量、常量、注释、数据类型、input、 if)
    十八、FTP配置
    十七、交换机配置管理IP和telnet登陆设置
  • 原文地址:https://www.cnblogs.com/riasky/p/3455163.html
Copyright © 2020-2023  润新知