Keil MDK下如何设置非零初始化变量 及变量指定位置- Arm CompilerV5 和 V6区别

一、Arm CompilerV5

1.定义变量时,使用编译器扩展属性__attribute__((section(“name”), zero_init))来将变量放入指定段中。其中section(“name”)选择一个指定的段,zero_init告诉编译器将变量放入ZI段。

uint32_t phy_link_init_flag __attribute__((section("NO_INIT"), zero_init));

在分散加载文件中,定义名为NO_INIT的段。注意该段所在的可执行域要具有UNINIT属性。

LR_IROM1 0x00000000 0x00080000  {    ; load region size_region 从0扇区开始
  ER_IROM1 0x00000000 0x00080000  {  ; load address = execution address 
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x10000000 0x0000F000  {  ; RW data
   .ANY (+RW +ZI)
  }
  
  RW_IRAM2 0x1000F000 UNINIT 0x00001000  {
   .ANY (NO_INIT)
  }
}

二、Arm CompilerV6

1.定义变量时,使用编译器扩展属性__attribute__((section(“name”)))来将变量放入指定段中。其中section(“name”)选择一个指定的段。

uint32_t phy_link_init_flag __attribute__((section(".bss.NO_INIT")));

2.在分散加载文件中,定义名为.bss.NO_INIT的段,其中前缀.bss是必须的,并且只能为小写。这个前缀表明该数据段具有ZI属性。注意该段所在的可执行域要具有UNINIT属性

LR_IROM1 0x00000000 0x00080000  {    ; load region size_region 从0扇区开始
  ER_IROM1 0x00000000 0x00080000  {  ; load address = execution address 
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x10000000 0x0000F000  {  ; RW data
   .ANY (+RW +ZI)
  }
  
  RW_IRAM2 0x1000F000 UNINIT 0x00001000  {
   .ANY (.bss.NO_INIT)
  }
}

3. Arm® Compiler 6 如何将数据放入指定位置

Arm® Compiler 5 支持at(address)扩展指令,但是在Arm® Compiler 6 中是不支持的,第3节给出了解决方案,使用__attribute__((section(“.ARM.__at_address”)))来代替at(address)扩展指令,本节描述如何实施。

定义变量,使用编译器扩展属性使用:

int my_peripheral __attribute__((section(".ARM.__at_0x10000000"))) = 0;

在分散加载文件中,定义名为.ARM.__at_0x10000000的段:

LR_1 0x040000          ; load region starts at 0x40000   
{                      ; start of execution region descriptions      
    ER_RO 0x040000     ; load address = execution address
    {
        *(+RO +RW)     ; all RO sections (must include section with initial entry point)
    }
}

LR_2 0x01000000
{
    ER_ZI +0 UNINIT
    {
        *(.bss)
    }
}
    
LR_3 0x10000000
{
    ER_PERIPHERAL 0x10000000 UNINIT
    {
        *(.ARM.__at_0x10000000)
    }
}

参考链接:添加链接描述

相关推荐

  1. Windows环境JDK安装环境变量配置指南

    2024-04-22 15:02:07       30 阅读
  2. c语言中,一些全局变量局部变量的定义区别

    2024-04-22 15:02:07       36 阅读
  3. C++ 变量的声明初始化方式

    2024-04-22 15:02:07       31 阅读
  4. golang变量初始化顺序

    2024-04-22 15:02:07       31 阅读
  5. 【Kotlin】变量代码块的初始化顺序

    2024-04-22 15:02:07       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 15:02:07       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 15:02:07       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 15:02:07       82 阅读
  4. Python语言-面向对象

    2024-04-22 15:02:07       91 阅读

热门阅读

  1. 分布式与集群区别

    2024-04-22 15:02:07       34 阅读
  2. arm-day8

    2024-04-22 15:02:07       31 阅读
  3. spdlog 日志库部分源码说明

    2024-04-22 15:02:07       38 阅读
  4. 软件测试 -- 自动化测试(Selenium)

    2024-04-22 15:02:07       38 阅读
  5. 2023-2024年人形机器人行业报告合集(精选397份)

    2024-04-22 15:02:07       33 阅读
  6. pcb的几种常见认证

    2024-04-22 15:02:07       33 阅读
  7. uniapp 页面跳转通信上下级页面互传

    2024-04-22 15:02:07       33 阅读
  8. 一文了解什么是RESTful风格

    2024-04-22 15:02:07       32 阅读
  9. SQL Server详细使用教程

    2024-04-22 15:02:07       39 阅读
  10. js实现快速拖拽(定时器版本)

    2024-04-22 15:02:07       34 阅读
  11. Flink CDC 整库 / 多表同步至 Kafka 方案(附源码)

    2024-04-22 15:02:07       31 阅读
  12. 从事数据分析相关工作技术总结

    2024-04-22 15:02:07       28 阅读