资源预览内容
第1页 / 共32页
第2页 / 共32页
第3页 / 共32页
第4页 / 共32页
第5页 / 共32页
第6页 / 共32页
第7页 / 共32页
第8页 / 共32页
第9页 / 共32页
第10页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第十讲 C的性能优化BIT/TI1第十讲 C的性能优化建议的程序开发流程C程序C程序优化用线性汇编改 写关键代码段BIT/TI2第十讲 C的性能优化学习内容一、C代码的性能优化 变量声明两种变量访问方式 C编译选项 Intrinsics 字访问 二、混合语言编程编写C可调用的汇编程序 建立C环境 建立汇编环境 编写线性汇编函数 三、实验BIT/TI3第十讲 C的性能优化一、C代码的性能优化1. 变量声明BIT/TI4第十讲 C的性能优化对局部变量的访问 在堆栈内分配存储空间 用堆栈首地址作首基地址,用指针*+B15(disp)来访问 堆栈分配在默认段.stackBIT/TI5第十讲 C的性能优化全局变量/静态变量两种访问方式1.默认的访问方式Near变量int n; main() .n +=. 编译后的汇编输出和访问方式.bss _n, 4, 4 ldw.d1*+DP(_n), A02.Far变量far int n; main() .n += . 编译后的汇编输出和访问方式_n.usect .far,2,2 mvk_n, A1 mvkh_n, A1 ldw.d1 *+A1, A0在.bss内分配地址 一条指令访问在.far内分配地址 三条指令访问BIT/TI6Near变量的生成和使用C语言汇编语言LDW .D2 *+B15(12), Reg相对偏移地址BIT/TI7第十讲 C的性能优化为什么要使用Far变量? 程序中使用的全局变量和静态变量超过 了32K字节 需要把变量存放在.bss以外的数据段*+DP(offset)DP的偏移地址 限制在15位BIT/TI8第十讲 C的性能优化Far变量的生成 使用关键字Far定义,在.far段内分配地址 用#pragma DATA_SECTION ( )定义新 的数据段far short m; short far n; #pragmaDATA_SECTION (y, “myVariables”); inty32;关键字far新的数据段作用相当于伪指令.usectBIT/TI9第十讲 C的性能优化Near/Far变量例子编译 输出声明C变量名加下划线BIT/TI10第十讲 C的性能优化变量声明总结 局部变量在堆栈段.stack分配地址,用一条指令 访问。 采用near形式声明全局变量,变量分配在数据 段.bss,用一条指令访问。 采用far形式声明全局变量,变量分配在数据段 .far或用户自定义数据段,用三条指令访问,应 尽量避免采用。BIT/TI11第十讲 C的性能优化一、C代码的性能优化2. C编译选项BIT/TI12第十讲 C的性能优化C优化器选项优化器选项有软件流水功能BIT/TI13第十讲 C的性能优化与优化有关的其它编译选项 建议使用 -pm与-o3合用,进行程序级优化 -mt程序中没有数据aliasing -x2函数内联 不要使用 -ml大模式(使得.bss段内的变量都按far方式访问) -g符号调试 -s, -ss, -os C编译器生成的汇编文件内,C语句作为注释出现Aliasing 两个指针指向同一个变量, 或一个指针修改后指向 另外一个变量BIT/TI14第十讲 C的性能优化一、C代码的性能优化3. IntrinsicsIntrinsics:直接与C62xx汇编指令相对 应的特殊内联函数,没有函数调用开支 。BIT/TI15第十讲 C的性能优化常用Intrinsics列表加法、减法、乘法 位域操作、long转换 为int对应汇编指令 .tripBIT/TI16第十讲 C的性能优化几种编程方式的比较C代码使用Intrinsics的C代码嵌入汇编汇编代码y = a * b;y = _mpy (a, b);asm (“MPY A0, A1, A2”);MPY A0, A1, A2, ; a, b, y代码效率低容易破坏C环境编程工作量大BIT/TI17第十讲 C的性能优化Intrinsics的特点 函数参数使用C变量名(不是寄存器),与 C环境兼容 不增加C的编程工作量 代码效率与汇编相同BIT/TI18第十讲 C的性能优化一、C代码的性能优化4. 字访问BIT/TI19第十讲 C的性能优化字访问优化方法1. 利用32位字访问16位数据(三种方法)1) 联合Union2) 强制类型转换3) 把数据直接定义为32位字2. 利用Intrinsics完成数值运算(_mpy, _mpyh, _add2, _sub2BIT/TI20第十讲 C的性能优化1) 字访问联合Union必须按照word 数据定界BIT/TI21第十讲 C的性能优化2) 字访问强制类型转换16位访问32位访问BIT/TI22第十讲 C的性能优化3) 字访问把数据直接定义为32位字BIT/TI23第十讲 C的性能优化字访问小结 用union方式需要对调用函数和被调用函 数进行修改 用强制类型转换,只需要修改被调用函 数 直接定义为32字,影响程序可读性BIT/TI24第十讲 C的性能优化二、混合语言编程C与线性汇编的混合编程BIT/TI25第十讲 C的性能优化编写可被C调用的线性汇编函数1. 建立C环境 2. 建立汇编环境 3. 编写线性汇编函数 入口代码 算法 出口代码BIT/TI26第十讲 C的性能优化1. 建立C环境1) 在C程序前声明线性汇编函数 2) 调用汇编函数1)声明2)调用BIT/TI27第十讲 C的性能优化2. 建立汇编环境1) 汇编函数的入口地址声明为全局变量 汇编函数的入口地址C函数名前加下划线 2) 定义函数入口地址1)声明2)定义BIT/TI28第十讲 C的性能优化3. 编写线性汇编函数入口 代码出口 代码BIT/TI29第十讲 C的性能优化线性汇编的寄存器保护问题汇编优化器自动完成BIT/TI30第十讲 C的性能优化实验1 实验目的: 学习和掌握利用intrinsics进行字长优化 实验内容 改写C语言点积函数,用强制类型转换法实现字优化。BIT/TI31第十讲 C的性能优化实验2 实验目的: 掌握线性汇编语言和C语言混合编程的方法 实验内容 用线性汇编改写C的点积函数。BIT/TI32第十讲 C的性能优化
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号