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 版权声明:本文为博主原创文章,转载请附上博文链接!

     
  • 相关阅读:
    P1019 单词接龙
    最小生成树模板题POJ
    区间DP
    牛客多校第三场-A-PACM Team-多维背包的01变种
    洛谷P1004 方格取数-四维DP
    牛客多校第二场A run(基础DP)
    P1494 [国家集训队]小Z的袜子(莫队)
    洛谷:过河卒
    Codeforces Round #486 (Div. 3)-B. Substrings Sort
    判断的值是否为空
  • 原文地址:https://www.cnblogs.com/zhangbing12304/p/10975350.html
Copyright © 2011-2022 走看看