- 1、本文档共32页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
BIT/TI 第十讲 C的性能优化 第十讲 C的性能优化 建议的程序开发流程 学习内容 一、C代码的性能优化 变量声明-两种变量访问方式 C编译选项 Intrinsics 字访问 二、混合语言编程-编写C可调用的汇编程序 建立C环境 建立汇编环境 编写线性汇编函数 三、实验 一、C代码的性能优化 1. 变量声明 对局部变量的访问 全局变量/静态变量-两种访问方式 Near变量的生成和使用 为什么要使用Far变量? 程序中使用的全局变量和静态变量超过了32K字节 需要把变量存放在.bss以外的数据段 Far变量的生成 使用关键字Far定义,在.far段内分配地址 用#pragma DATA_SECTION ( )定义新的数据段 Near/Far变量-例子 变量声明总结 局部变量在堆栈段.stack分配地址,用一条指令访问。 采用near形式声明全局变量,变量分配在数据段.bss,用一条指令访问。 采用far形式声明全局变量,变量分配在数据段.far或用户自定义数据段,用三条指令访问,应尽量避免采用。 一、C代码的性能优化 2. C编译选项 C优化器选项 与优化有关的其它编译选项 建议使用 -pm 与-o3合用,进行程序级优化 -mt 程序中没有数据aliasing -x2 函数内联 不要使用 -ml 大模式(使得.bss段内的变量都按far方式访问) -g 符号调试 -s, -ss, -os C编译器生成的汇编文件内,C语句作为注释出现 一、C代码的性能优化 3. Intrinsics Intrinsics:直接与C62xx汇编指令相对应的特殊内联函数,没有函数调用开支。 常用Intrinsics列表 几种编程方式的比较 Intrinsics的特点 函数参数使用C变量名(不是寄存器),与C环境兼容 不增加C的编程工作量 代码效率与汇编相同 一、C代码的性能优化 4. 字访问 字访问优化方法 1. 利用32位字访问16位数据(三种方法) 1) 联合Union 2) 强制类型转换 3) 把数据直接定义为32位字 2. 利用Intrinsics完成数值运算(_mpy, _mpyh, _add2, _sub2〕 1) 字访问-联合Union 2) 字访问-强制类型转换 3) 字访问-把数据直接定义为32位字 字访问小结 用union方式需要对调用函数和被调用函数进行修改 用强制类型转换,只需要修改被调用函数 直接定义为32字,影响程序可读性 二、混合语言编程 -C与线性汇编的混合编程 编写可被C调用的线性汇编函数 1. 建立C环境 2. 建立汇编环境 3. 编写线性汇编函数 入口代码 算法 出口代码 1. 建立C环境 1) 在C程序前声明线性汇编函数 2) 调用汇编函数 2. 建立汇编环境 1) 汇编函数的入口地址声明为全局变量 汇编函数的入口地址-C函数名前加下划线 2) 定义函数入口地址 3. 编写线性汇编函数 线性汇编的寄存器保护问题 实验1 实验目的: 学习和掌握利用intrinsics进行字长优化 实验内容 改写C语言点积函数,用强制类型转换法实现字优化。 实验2 实验目的: 掌握线性汇编语言和C语言混合编程的方法 实验内容 用线性汇编改写C的点积函数。 由于C是C6000编程的首选语言,因此如何对C代码的性能进行优化,是我们非常关心的问题。这部分内容放在最后介绍,主要是因为有些优化方法需要前面的内容做铺垫。 这里的性能优化是指代码执行速度的优化 我们知道,对于C变量,按照变量作用的范围可分为全局变量和局部变量。而需要非常重视的是,变量的声明方式不同,由此带来的访问方式是不同的。不同的访问形式有效率上的差异,因此需要仔细研究。 了解C编译器对变量的访问方式,尤其是全局变量和静态变量(局部变量用对方指针访问,稍后介绍),是非常重要的。这是因为不同的方法效率不同,直接音响到程序的执行速度。 前面介绍了变量的MVK/MVKH/LD访问方式。这里介绍另一种方式。 Near 变量的生成和使用 如果不用far特别说明,C编译器会默认地将全局和静态变量分配在.bss段,并使用页指针B14(DP)-基地址+offset的方法来访问。 所有全局变量和静态变量都分配在.bss段内 .bss的开始地址被称为基地址或页指针,用DP来表示,在C6000 C编译器即B14 所有全局变量和静态变量都定义为near,其标号表示在.bss段内的偏移地址(在其它地方,标号一般表示一个绝对地址)-对堆栈的访问也是用这种方法实现的(只不过基地址SP用B15表示)。 如A/D变换后的数据存在FIFO,就必须与片内的.bss分开存放。 Pragma是在C语言里表示汇编指令的方法(directive) 对用户定义的数据段,必须在连接器命令文件内说明
文档评论(0)