#pragma DATA_SECTION 和 #pragma CODE_SECTION的使用

嵌入式C语言--pragma ghs section的运用 具体来说,VC链接器在链接的过程中,会将各编译单元中的section按照name的从小到大顺序排列,name的比较规则遵循strcmp的字符串比较逻辑。gcc/g++编译器会自动生成分区的起始和结束边界,只需要extern引入边界变量即可,具体生成的边界变量名可能因编译器版本的区别有差异,需要自行通过链接器查看确认。但是,可通过使用 #pragma ghs section,使链接器能够删除本来可能会保留的函数或变量,因为它与使用的函数或变量位于相同的节中。此编译指示指定要用于后续函数或对象的节名称。 阅读详情

友情链接:CCS CMD文件 

今天读DSP的图像采集程序,遇到了一点陌生的东西:

ti的帮助文档里是这么讲的:

The DATA_SECTION pragma allocates space for the symbol in asection called section name. 
The syntax for the pragma in C is:

#pragma DATA_SECTION (symbol, "section name");

我个人的理解是:

定义一个数据段: 
         段名为:    "sectionname"
         段的内容在: symbol 里 
在CCS编程中,如果我们不指定变量的存放位置,编译器会自动的给变量分配一个位置,但是如果有的时候需要把变量放在一个特定的空间内,我们应该如何操作呢,CCS提供了如下的两个指令
#pragma CODE_SECTION
#pragma DATA_SECTION
其中data_section是针对数据空间的,code_section是针对程序空间的,具体的使用办法是
#pragma DATA_SECTION(bufferB, ”my_sect”)
char bufferB[512];
在.cmd文件中建立对应的section就可以使用了。

注意:在使用#pragmaDATA_SECTION时,应该先开辟一个空间,即:#pragma DATA_SECTION(bufferB,”my_sect”),然后再定义该空间的大小:char bufferB[512];

#pragma,是一个编译控制指令,可以在编译时动态地调整编译选项,这种指令在不同的编译系统中是不同的.

#pragma DATA_ALIGN( symbol,constant)

指令的作用是:排列排列symbol到constant指点的列边界上.

#pragma DATA_ALIGN(rxdata_stream,   128)
就是让rxdata_stream地址的末尾7位是0(二进制地址),就是128字节对齐。
对齐的目的,一般是位了CACHE读写外存。
如果一个CACHE的line是128字节。这样,如果数据128字节对齐,那么取一个128字节的数据,只使用一个CACHE行就够了。

char efd;
#prgma DATA_ALIGN(efd, 8)
编译时一定会把efd变量的地址安排在8字节对齐的位置上,也即efd地址的低3位一定为0。


由于在基于DSP的嵌入式系统开发中,存储资源特别是片内高速存储资源有限,在算法系统集成时Memory的管理对于提高整个系统的优化是非常重要的,这一方面影响数据的读取、搬移速度;另一方面还影响Cache的命中率,下面分程序和数据两方面分析。

 
    程序区:最大原则是将经常调度使用的算法模块放片内。为做到这点,TI的CCS中提供了#pragma CODE_SECTION,可以把需要单独控制存放的函数段从.text段中独立出来,从而在.cmd文件中对这些函数段进行单独物理地址映射。还可以使用程序动态的方式,将需要运行的代码段先调度进片内memory,如H.264/AVC中CAVLC和CABAC两个算法模块具有互斥性,因此可以将这两个算法模块放在片外而且对应于片内同一块运行区,在运行其中某一个算法模块之前,先将其调入片内,从而充分利用片内有限的高速存储区。程序区的管理考虑到一级程序Cache(L1P)的命中率,最好将具有先后执行顺序的函数按地址先后顺序配置在程序空间中,同时对代码比较大的处理函数将其拆分成小函数

 
  数据区:在视频标准编解码中,由于数据块都很大,如一帧D14:2:0的图像有622k大小,而且在编解码中都需要开3~5帧甚至更多的缓冲帧,因此数据基本上无法在片内存放。为此在系统的Memory优化管理中,需要开C64系列DSP的二级Cache(对于TMS320DM642用于视频编解码中二级Cache开64k的情况比较多)。同时最好将放片外的被Cache所映射的视频缓冲区的数据以128byte对齐,这是因为C64系列的DSP的二级Cache的每行大小为128 byte,以128byte对齐有利于Cache的刷新和一致性维护。

The DATA_SECTION pragma allocates space for the symbol in a section called section name. 
The syntax for the pragma in C is:

#pragma DATA_SECTION (symbol, "section name");

The syntax for the pragma in C++ is:

#pragma DATA_SECTION ( "section name");
The DATA_SECTION pragma is useful if you have data objects that you want to link into an area separate from the .bss section.
This directive is illustrated in the following example.
Using the DATA_SECTION Pragma
a)    C source file
#pragma DATA_SECTION(bufferB, "my_sect")
char bufferA[512];
char bufferB[512];
// 执行完此三条语句之后,数组bufferB被分配到段名为 "my_sect"的自定义段中

b)    C++ source file
char bufferA[512];
#pragma DATA_SECTION("my_sect")
char bufferB[512];

c)    Assembly source file
 .global _bufferA     .bss     _bufferA,512,4      .global _bufferB _bufferB: .usect   "my_sect",512,4
          

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

The CODE_SECTION pragma allocates space for the func in a section named section name. The CODE_SECTION pragma is useful if you have code objects that you want to link into an area separate from the .text section.
The syntax of the pragma in C is:

#pragma CODE_SECTION (func, section name)

The syntax of the pragma in C++ is:

#pragma CODE_SECTION (section name)

The following example demonstrates the use of the CODE_SECTION pragma.

Using the CODE_SECTION Pragma

a)     C source file

char bufferA[80];
char bufferB[80];

#pragma CODE_SECTION(funcA, codeA)

char funcA(int i);
char funcB(int i);

void main()
{
char c;
c = funcA(1);
c = funcB(2);
}

char funcA (int i)
{
return bufferA;
}

char funcB (int j)
{
return bufferB[j];
}

b)     Assembly source file

.sect    ".text"         .global _main;
***************************************************************
;* FNAME: _main                          FR SIZE:    2            *
;*                                                              *
;* FUNCTION ENVIRONMENT                                         *
;*                                                              *
;* FUNCTION PROPERTIES                                          *
;*                             0 Parameter,   1 Auto,   0 SOE      *
;***************************************************************

_main:

         ADDB       SP,#2
         MOVB       AL,#1                  ; |12|
         LCR        #_funcA                ; |12|
         ; call occurs [#_funcA] ; |12|
         MOV        *-SP[1],AL             ; |12|
         MOVB       AL,#1                  ; |13|
         LCR        #_funcB                ; |13|
         ; call occurs [#_funcB] ; |13|
         MOV        *-SP[1],AL             ; |13|
         SUBB       SP,#2
         LRETR
        ; return occurs

.sect    "codeA"
         .global _funcA
;***************************************************************
;* FNAME: _funcA                         FR SIZE:    1            *
;*                                                              *
;* FUNCTION ENVIRONMENT                                         *
;*                                                              *
;* FUNCTION PROPERTIES                                          *
;*                             0 Parameter,   1 Auto,   0 SOE      *
;***************************************************************

_funcA:
         ADDB       SP,#1
         MOV        *-SP[1],AL             ; |17|
         MOVZ       AR6,*-SP[1]            ; |18|
         ADD        AR6,#_bufferA          ; |18|
         SUBB       SP,#1                  ; |18|
         MOV        AL,*+XAR6[0]           ; |18|
         LRETR
         ;return occurs

          .sect    ".text"
          .global _funcB

;***************************************************************
;* FNAME: _funcB                         FR SIZE:    1            *
;*                                                              *
;* FUNCTION ENVIRONMENT                                         *
;*                                                              *
;* FUNCTION PROPERTIES                                          *
;*                             0 Parameter,   1 Auto,   0 SOE      *
;***************************************************************

_funcB:
         ADDB       SP,#1
         MOV        *-SP[1],AL             ; |22|
         MOVZ       AR6,*-SP[1]            ; |23|
         ADD        AR6,#_bufferB          ; |23|
         SUBB       SP,#1                  ; |23| 
         MOV        AL,*+XAR6[0]           ; |23|
         LRETR
         ;return occurs

// 从红色标记可以看出,在加入#pragma CODE_SECTION(funcA, codeA)语句之后,main()函数和_funcB函数被
// 分配到 ".text" 段中,而_funcA函数被分配到 "codeA" 段中


参考:http://blog.sina.com.cn/s/blog_621c94960100ibqw.html
            http://blog.chinaunix.net/uid-26053577-id-1936473.html
            http://blog.sina.com.cn/s/blog_70c7b3780100zcid.html
C语言中的 `#pragma section` 详解 在 C 语言中, 是一个预处理指令,用于给编译器传递额外的指令或特定的编译选项。 是一个编译器依赖的指令,因此它的效果会受到具体编译器的支持和实现的影响。 是其中一种常见的用法,通常用于在某些编译器中控制程序的内存布局,将不同的代码或数据段放置到特定的内存段中。虽然并不是 C 语言标准的一部分,但它在某些特定的编译器(如 Microsoft Visual C++)中具有广泛的应用。 用于在编译时指定程序中各个段的分配位置。内存段是一个用来存储程序数据(如变量、代码等)的区域。通过 ,你可以在编译时控制哪些数 阅读详情

相关推荐

眼见不一定为实,电阻、电容和电感的实际等效模型

文章目录容抗的概念感抗的概念理想电阻电阻实际等效模型理想电容器电容实际等效模型理想电感电感实际等效模型总结 信号完整性在高速电路中有着至关重要的作用,而很多信号完整性问题需要用「阻抗」的概念来解释和描述。 在高频信号下,很多器件失去了原有的特性,如我们经常听到的“高频时电阻不再是电阻,电容不再是电容”,这是咋回事呢?那就看今天的文章吧! 容抗的概念 电容有两个重要特性,一个是隔直通交,另一个是电容电压不能突变,先来看一下百度百科对容抗的解释。 简单说,虽然交流电能通过电容,但是不同频率的交流电和不同容值的

记得诚 1万+

C8-#pragma在DSP中的讲解与使用方法

#pragma在DSP中的讲解与使用方法

Jam的博客 1398

ST7102驱动移植与调试实战

本文详细介绍了在君正T40平台上移植和调试ST7102 LCD驱动芯片的实战经验。内容涵盖硬件接口配置、时序参数调整、寄存器初始化序列编写及常见问题解决,重点解析了ST7102单芯片集成显示与触控功能的特性,为嵌入式设备显示驱动开发提供实用指南。

k6l7m8n9的博客 1413

#pragma DATA_SECTION、#pragma CODE_SECTION、#pragma DATA_ALIGN和ALIGN

ccs编程中关于变量和程序的存储位置的设置。

qq_41006197的博客 3567

ADS学习笔记 1. 功率放大器设计

基于ADS2023 update2的学习笔记1.功率放大器设计

u014087103的博客 1万+

Python+Selenium实战:5分钟搞定快手评论区数据采集(附完整代码)

本文详细介绍了如何使用Python和Selenium快速采集快手评论区数据,提供完整的代码实现和优化方案。通过动态加载处理和智能等待策略,5分钟内即可构建高效的评论采集工具,适用于用户行为分析和内容挖掘等场景。

weixin_30415113的博客 344

#pragma DATA_SECTION与#pragma CODE_SECTION的使用

2021-3-4

qq_40104597的博客 1246

Camunda流程引擎 Modeler (二)

Camunda Modeler是Camunda官方提供的建模器: 独立安装的建模器([windows、linux、mac]

1312

【电路笔记 TMS320F28335DSP】CCS将数据或代码放置到指定的内存空间 #pragma CODE_SECTION和#pragma DATA_SECTION

CCS将数据或代码放置到指定的内存空间 #pragma CODE_SECTION和#pragma DATA_SECTION

ResumeProject的博客 1061

以阿克曼转向车为例对URDF和XACRO文件进行解读

   最近我在古月学院购买了在Gazebo中实现阿克曼转向车的仿真课程,课程资料的阿克曼小车的XACRO文件在Gazebo里加载的时候报了三个错误,在这之前,我没接触过URDF或XACRO文件,本篇文章就以这个阿克曼小车的XACRO文件为例,对URDF或XACRO文件的格式和内容进行解读,期望经过解读和学习,找到错误原因及所在,并解决这三个错误    先来放一下上面右图所示的模型的完整的XACRO文件: <?xml version="1.0"?> <!-- racecar.urdf.x

慕羽★的博客 3701

【模型实战】MiMo-VL-7B讲解与实战

维度成绩MMMU70.6(图像理解最难测试之一)VideoMME70.8(视频理解标杆)59.4(超越78B参数模型)56.1(超过专用GUI模型)Elo评分开源VLM排名第一(7B~72B)社区热度过去一个月下载超1,600次(RL+SFT)📌一句话概括MiMo-VL 是目前性能最强、推理最稳、体验最佳、生态最全的7B级开源视觉语言模型。

m0_47867638的博客 1199

dsp 中DATA_SECTION用法

DSP中pragma 的用法 ti的帮助文档里是这么讲的: The DATA_SECTION pragma allocates space for the symbol in a section called section name. The syntax for the pragma in C is: #pragma DATA_SECTION (symbol, “section name”);...

xiexiaoyu1996的博客 7050

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

DSP Pragma伪指令——老干妈笔记

CODE_SECTION(func,"section name"); DATA_SECTION(symbol,"section name"); /* CODE_SECTION 用来定义代码段 DATA_SECTION 用来定义数据段 注意:func 和 symbol 必须在函数外声明或定义。同 时, pragma 伪指令也必须在函数外,且位于声明、定义或 引用 func 和 symbol 之前,否则编译器会发出警告信息。 */ CODE_SECTION 作用:在程序空间中,为.

老干妈拌雪梨喂张学友的博客 1690

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

#pragma DATA_SECTION DSP中的使用

在CCS编程中,如果我们不指定变量的存放位置,编译器会自动的给变量分配一个位置。但是,如果有的时候需要把变量放在一个特定的空间内,我们应该如何操作呢?CCS提供了如下的两个指令: #pragma   CODE_SECTION; #pragma DATA_SECTION 。 其中data_section是针对数据空间的,code_section是针对程序空间的。 具体的使用办法是: #p

woxincd的专栏 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

c语言 pragma code,#pragma DATA_SECTION 和 #pragma CODE_SECTION的使用

The DATA_SECTION pragmaallocates space for the symbol in a section called sectionname.The syntax for the pragma in C is:#pragma DATA_SECTION (symbol, "section name");The syntax for the pragma in C++ ...

weixin_35081955的博客 1512

CMD各段定义与分配方法指引

DSP28335—CMD文件中的各个段解释 CMD文件里有两个基本的段:初始化段和非初始化段。初始化段包含代码和常数等必须在DSP上电之后有效的数。故初始化块必须保存在如片内FLASH等非易失性存储器中,非初始化段中含有在程序运行过程中才像变量内写数据进去,所以非初始化段必须链接到易失性存储器中如RAM。 已初始化的段:.text,.cinit,.const,.econst,.pinit和.switch… .text:所有可以执行的代码和常量 .cinit:全局变量和静态变量的C初始化记录,包含未用cons

sinat_37300324的博客 2164

#pragma预处理命令

#pragma可以说是C++中最复杂的预处理指令了,下面是最常用的几个#pragma指令: #pragma comment(lib,"XXX.lib") 表示链接XXX.lib这个库,和在工程设置里写上XXX.lib的效果一样。 #pragma comment(linker,"/ENTRY:main_function") 表示指定链接器选项/ENTRY:main_function #pragma ...

weixin_34216107的博客 1998

DSP下的#program

2014年7月22日 最近调试使用TMS320C6713的片子调试SDRAM,中间经过很多波折,这里就不吐槽了。 想将数据或者代码放到SDRAM上一定要用到#pragma。查阅资料后,感觉百度文库的资料还可以,所以将度娘的资料摘抄过来,以作记录。 1.在CCS编程中,如果我们不指定变量的存放位置,编译器会自动的给变量分配一个位置。但是,如果有的时候需要把变量放在一个特定的空间内,我们...

weixin_30263277的博客 339

#Pragma 用法总结

百科名片 http://baike.baidu.com/view/1451188.htm 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼...

455

#prama的使用

在CCS编程中,如果我们不指定变量的存放位置,编译器会自动的给变量分配一个位置。但是,如果有的时候需要把变量放在一个特定的空间内,我们应该如何操作呢?CCS提供了如下的两个指令: #pragma   CODE_SECTION; #pragma DATA_SECTION 。 其中data_section是针对数据空间的,code_section是针对程序空间的。 具体的使用办法是:

wjght13的博客 888

小侃#pragma

#pragma是一个编译器指令。 ================================================================ #pragma comment(lib, libname)将libname的库添加到工程中,与VC++中Linker->Input->Additional dependencies的功能相同。使用#pragma co

xiahouzuoxin 2221
上一篇: Sublime使用介绍
下一篇: TI DSP
Clef
博客等级 码龄12年 125粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值