zoukankan      html  css  js  c++  java
  • C语言中__attribute__ ((at())绝对定位的应用

    参考:https://www.cnblogs.com/xyelectric/p/9046048.html   

    C语言中的关键字__attribute__ ,直接用的是绝对定位,在开发中一般用的比较少,但是有的ccm rsm 或者外部sram的使用,就需要这个绝对地址,不然单片机会把变量默认分配到内部sram的。

    #ifdef ARMC_AC6
    uint16_t testValue __attribute__((section(".ARM.__at_0x64000000")));
    #else
    /*绝对定位方式访问SRAM,这种方式必须定义成全局变量*/
    uint8_t testValue __attribute__((at(ADDR_SRAM_EXT)));
    #endif
    

        __attribute__( at(绝对地址) )的作用分两个,一个是绝对定位到Flash,另个一是绝对定位到RAM。

    1、定位到flash中,一般用于固化的信息,如出厂设置的参数,上位机配置的参数,ID卡的ID号,flash标记等等

    const u16 gFlashDefValue[512] __attribute__((at(0x0800F000))) = {0x1111,0x1111,0x1111,0x0111,0x0111,0x0111};//定位在flash中,其他flash补充为00
    const u16 gflashdata__attribute__((at(0x0800F000))) = 0xFFFF;

     

    2、定位到RAM中,一般用于数据量比较大的缓存,如串口的接收缓存,再就是某个位置的特定变量

    u8 USART2_RX_BUF[USART2_REC_LEN] __attribute__ ((at(0X20001000)));//接收缓冲,最大USART_REC_LEN个字节,起始地址为0X20001000.

    注意:

    1、绝对定位不能在函数中定义,局部变量是定义在栈区的,栈区由MDK自动分配、释放,不能定义为绝对地址,只能放在函数外定义。

    2、定义的长度不能超过栈或Flash的大小,否则,造成栈、Flash溢出。

     

  • 相关阅读:
    org.mybatis.spring.mapper.MapperScannerConfigurer$Scanner$1
    LayoutInflater
    发现javax.xml.parsers.SAXParser有bug
    startActivityForResult and onActivityResult
    Sub Thread to update main Thread (UI) 2
    Sub Thread to update main Thread (UI)
    打算听的歌
    会话状态Session
    HttpResponse类
    HttpRequest类
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12382711.html
Copyright © 2011-2022 走看看