• IAR将常量放置在指定的的code区域


    Reference:IAR Technial Note 27787

    How to place a constant at specific address in code memory

    EW targets: PIC
    EW component: C/C++ compiler
    Keywords: "@" / #pragma locate, constant
    Last update: April 20, 2000
    1) Why can I not use #pragma locate and/or the"@" syntax for constant variables?

    Regarding the "@" and the #pragma locate syntax for located variables - located variables can not be initialized when defining them, thus it is not very useful for const variables. This is true up to and including v2.00A of ICCPIC (Spring 2000), the special case of constant and located variables may be handled better in future versions.

    2) How can I put a constant, i.e., a RETLW #, at a specific location in code memory?

    To place a RETLW constant in code memory at a specified address, you could use #pragma constseg and define a segment of your own as the example below. Note that there is a problem with pragma constseg in ICCPIC version 1.23, this is fixed in version 2.00A. As a workaround for version 1.23A, you can use the assembler example below.

    3) How can I put a constant, i.e., a plain number, at a specific location in code memory?

    This is useful only for chips with table read. Suggested way is to use assembly, as the example below.

    Examples of how to define constants in code memory:

    -- Assembler file

        PUBLIC    myasmconst1
        PUBLIC    myasmconst2
        RSEG myacseg1:CODE(1)
    myasmconst1
        DB  0x34,0x56
        RSEG myacseg2:CODE(1)
    myasmconst2
        RETLW 0x78
        END
    

    -- C-file

    extern unsigned int __rtable myasmconst1;
    extern const unsigned char myasmconst2;
    #pragma constseg=myccseg
    const unsigned char mycconst=0x12;
    #pragma constseg=default
    
    void main(void)
    {
      int i;
     
      i=myasmconst1+myasmconst2+mycconst;
    
    }
    

    -- Corresponding lines to add to copy of linker xcl-file (example for 17c756)

    -Z(CODE)myccseg=1FFFA-1FFFB
    -Z(CODE)myacseg1=1FFFC-1FFFD
    -Z(CODE)myacseg2=1FFFE-1FFFF

    ---------------------------------------------------------------------------------
    要想在指定的Code区域定义常量,需要在汇编、c、xcl文件三方面修改。

    ---------------------------------------------------------------------------------

    CONTROLLING DATA AND FUNCTION PLACEMENT
    The @operator, alternatively the #pragma locationdirective, can be used for placing
    global and static variables at absolute addresses. The syntax can also be used for placing
    variables or functions in named segments. The variables must be declared either
    __no_initor const. If declared const, it is legal for them to have initializers. The
    named segment can either be a predefinedsegment, or a user-defined segment.
    Note:Take care when explicitly placing a variable or function in a predefined segment
    other than the one used by default. This is possible and useful in some situations, but
    incorrect placement can result in anythingfrom error messages during compilation and
    linking to a malfunctioning(错误的) application. Carefully consider the circumstances(情况); there
    might be strict requirements on the declaration and use of the function or variable.
    C++ static member variables can be placed atan absolute address or in named segments,
    just like any other static variable.
    Data placement at an absolute location
    To place a variable at an absolute address, the argument to the operator @and the
    #pragma locationdirective should be a literal number(字面常量数), representing(符号地址? ) the actual
    address.
    Example

    __no_init char alpha @ 0x80; /* OK */
    __no_init __bit bool beta @ 0x60; /* OK */
    #pragma location=0x90
    __code const int gamma; /* OK */
    __xdata_rom const int delta @ 0xA0 = 3; /* OK */
    int epsilon @ 0xB0; /* Error, neither */
                    /* "__no_init" */
                /* nor"const".*/
    


    Note:A variable placed at an absolute location should be defined in an include file, to
    be included in every module that uses the variable. An unused definition in a module
    will be ignored.

    Example

    __no_init int alpha @ "MYSEGMENT"; /* OK */
    #pragma location="MYSEGMENT"
    __xdata_rom const int beta; /* OK */
    __code const int gamma @ "MYSEGMENT" = 3;/* OK */
    int delta @ "MYSEGMENT"; /* Error, neither */
    /* "__no_init" nor "const" */

    Function placement into named segments 

    It is possible to place functions into named segments using either the @operator or the
    #pragma locationdirective. When placing functionsinto segments, the segment is
    specified as a string literal.
    Example

    void f() @ "MYSEGMENT";
    void g() @ "MYSEGMENT"
    {
    }
    #pragma location="MYSEGMENT"
    void h();
  • 相关阅读:
    leftpad填充函数;
    overfllow的解析
    append与after
    数组扁平话的N种解法;
    关于webapi调用wcf并发假死的分析
    C#金额数字转换中文繁体
    关于ios的IDFA
    Windows下为MySQL做定时备份
    [System.OutOfMemoryException] {函数求值已禁用,因为出现内存不足异常。
    mvc 捕获404和500 等
  • 原文地址:https://www.cnblogs.com/liutogo/p/3877893.html
Copyright © 2020-2023  润新知