zoukankan      html  css  js  c++  java
  • IAR RAM的操作

     SARM空间是AVR单片机最重要的部分,所有的操作必须依赖该部分来完成。变量在SARM空间的存储模式有tiny,small,large 三种,也就是对应于__tiny, __near,__far三中存储属性。一旦选择为哪种存储模式,对应的数据默认属性也就确定了,但可以采用__tiny, __near,__far关键字来更改。


    对于程序中的局部变量,编译器会自动处理的,我们也不可能加什么储存属性,但IAR提供了强大的外部变量定义。

    IAR编译器内部使用了部分工作寄存器,留给用户的只有R4-R15供12个寄存器供用户使用,要使用工作寄存器必须在工程选项里打开锁定选项。
    例:
    定义两个变量使用工作寄存器R14,R15。

    #include<iom8.h>  
    __regvar __no_init char g @ 15;
    __regvar __no_init char P @ 14;
    void main(void)
    {
    g++;
    P++;
    }



    在工程选项里c/c++ complier>code里打开要使用的寄存器R14-R15。

    编译结果就如下,看看是不是直接使用了寄存器做为数据应用

    // 4 void main(void)  
    main:
    CFI Block cfiBlock0 Using cfiCommon0
    CFI Function main
    // 5 { g++;
    REQUIRE ?Register_R14_is_global_regvar
    REQUIRE ?Register_R15_is_global_regvar
    INC R15
    // 6 P++; }
    INC R14
    RET



    注意:定义在寄存器里变量不能带有初始值。最好不要使用超过9个寄存器变量,不然可能引起潜在的危险,因为建立库的时候没有锁定任何寄存器。

    定义变量的绝对地址.没有特性的变量是随机分配的,要给变量分配地址必须加以特性修饰注意在定义地址的时候千万不要和片内寄存器地址重合了。

    定义没有存储特性的绝对地址变量必须加__no_init 或者const对象特性
    __no_init char t @ 0x65;//定义在I/O地址以外
    const char t @ 0x65;//定义只读变量的地址
    例:

    #include<iom8.h>  
    __no_init char u @ 0x65 ;
    void main(void)
    {
    u++;
    }


    对应汇编:

    void main(void)  
    \ main:
    {u++;}
    \ 00000000 E6E5 LDI R30, 101
    \ 00000002 E0F0 LDI R31, 0
    \ 00000004 8100 LD R16, Z
    \ 00000006 9503 INC R16
    \ 00000008 8300 ST Z, R16
    \ 0000000A 9508 RET


    带存储特性的关键字定义变量的绝对地址__io,__ext_io定义变量在i/o空间

    #include<iom8.h>  
    __io char u @ 0x65 ;
    void main(void)
    {
    u++;
    }


    对应汇编:

    void main(void)  
    \ main:
    {u++;}
    \ 00000000 91000065 LDS R16, 101
    \ 00000004 9503 INC R16
    \ 00000006 93000065 STS 101, R16
    \ 0000000A 9508 RET


     

  • 相关阅读:
    HNOI2008玩具装箱
    CEOI2004锯木厂选址
    APIO2010特别行动队
    【HNOI2011】数学作业
    【JLOI2015】城池攻占
    魔法猪学院
    Kruskal重构树(货车运输)
    旋转卡壳求凸包直径
    Graham凸包算法简介
    poj-3169Layout
  • 原文地址:https://www.cnblogs.com/pang123hui/p/2309828.html
Copyright © 2011-2022 走看看