zoukankan      html  css  js  c++  java
  • 【转】DATA_SECTION 和CODE_SECTION 的区别

    请问#pragma DATA_ALIGN有什么作用?

    下面是我在EDMA的一个例程中摘录的几句话:#pragma DATA_ALIGN(ping,128);#pragma DATA_ALIGN(pong,128);#pragma DATA_ALIGN(outbuff,128);我一直不明白#pragma DATA_ALIGN有什么作用。我在书上看是这样介绍的:“#pragma DATA_ALIGN(symbol,constant); DATA_ALIGN指令排列symbol到constant定义的边界上”请问这样有什么作用?这个constant应该怎么选择呢?
     
    设定变量的地址对齐方式。
    比如:
    int abc;
    #pragma DATA_ALIGN(abc, 128)
    那么编译时一定会把abc变量的地址安排在128字节对齐的位置上,也即abc地址的低7位一定为0,
    又比如
    char efd;
    #prgma DATA_ALIGN(efd, 8)
    那么编译时一定会把efd变量的地址安排在8字节对齐的位置上,也即efd地址的低3位一定为0。
    pragma DATA_ALIGN是非常有用的,也经常使用的。
     

    (一)#pragma DATA_SECTION 利用CCS进行DSP编程时,如果不指定变量的存储位置,那么编译器会自动给变量分配存储位置,但是,有些时候,需要将某个变量存放到某个特定的位置,这个时候就可以利用#pragma DATA_SECTION指令了。

    第一步,利用#pragma DATA_SECTION指令将变量xxxCmdBuf关联到SECTIONS“ramdata”;

    #pragma DATA_SECTION(xxxCmdBuf,"ramdata"); uint16_t xxxCmdBuf[4];12

    第二步,修改CMD文件使得“ramdata”映射到指定的地址空间。

    MEMORY { PAGE 0 :   /* Program Memory */ ......

    PAGE 1 :   /* Data Memory */ ...... RAML_XXXCMD     : origin = 0x00BFF0, length = 0x000004     } ......

    SECTIONS { ...... ramdata         : > RAML_XXXCMD,   PAGE = 1 ...... }1234567891011121314151617

    只需完成上述简单的两步就可以将某个变量指定到特定的位置,一些博文指出采用这种方法时,需要先利用#pragma DATA_SECTION开辟一个空间,然后在定义该空间的大小,即第一步中的两行代码是有先后顺序的。

    TI 的技术文档《Programming TMS320x28xx and 28xxx Peripherals in C/C++》(SPRAA85D–November 2005–Revised January 2013)对该方法也有相应的描述,如下所示。    

    (二)#pragma CODE_SECTION 利用#pragma CODE_SECTION指令可以将程序从Flash搬到RAM中运行,从而提高程序执行速率,该方法需要完成以下四步。

    第一步,利用#pragma CODE_SECTION指令关联程序和SECTIONS;

    #pragma CODE_SECTION(mainISR,"ramfuncs");1

    第二步,为链接创建相关变量;

    // Used for running BackGround in flash, and ISR in RAM extern uint16_t *RamfuncsLoadStart, *RamfuncsLoadEnd, *RamfuncsRunStart;12

    第三步,复制时间关键代码以及Flash设置代码到RAM;

    // Copy time critical code and Flash setup code to RAM // The RamfuncsLoadStart, RamfuncsLoadEnd, and // RamfuncsRunStart symbols are created by the linker. // Refer to the linker files. memCopy((uint16_t *)&RamfuncsLoadStart,(uint16_t *)&RamfuncsLoadEnd,(uint16_t *)&RamfuncsRunStart);1234

    第四步,修改CMD文件。

    SECTIONS { /* Allocate program areas: */ ...... ramfuncs       : LOAD = FLASHD,                  RUN = RAML0_1,                                                     LOAD_START(_RamfuncsLoadStart),                  LOAD_END(_RamfuncsLoadEnd),                  RUN_START(_RamfuncsRunStart),                  PAGE = 0 1234567891011

    上面代码中, LOAD = FLASHD, //指定了要加载程序在Flash里的地址段 RUN = RAML0_1, //指定了在RAM里运行程序的RAM地址段 LOAD_START(_RamfuncsLoadStart), // 所要加载程序在Flash里的初始地址 LOAD_END(_RamfuncsLoadEnd), // 所要加载程序在Flash里的结束地址 RUN_START(_RamfuncsRunStart), // 程序运行的起始地址 --------------------- 作者:Ronnie_Hu 来源:CSDN 原文:https://blog.csdn.net/Ronnie_Hu/article/details/74075090 版权声明:本文为博主原创文章,转载请附上博文链接!

     
  • 相关阅读:
    hdu 2019 数列有序!
    hdu 2023 求平均成绩
    HDU 5805 NanoApe Loves Sequence (思维题) BestCoder Round #86 1002
    51nod 1264 线段相交
    Gym 100801A Alex Origami Squares (求正方形边长)
    HDU 5512 Pagodas (gcd)
    HDU 5510 Bazinga (字符串匹配)
    UVALive 7269 Snake Carpet (构造)
    UVALive 7270 Osu! Master (阅读理解题)
    UVALive 7267 Mysterious Antiques in Sackler Museum (判断长方形)
  • 原文地址:https://www.cnblogs.com/zhangbing12304/p/10975350.html
Copyright © 2011-2022 走看看