摘要
采用具有精简、开源、模块化等特点的RISC-V架构设计的微控制器功耗低,非常适用于嵌入式应用开发。随着嵌入式技术在物联网、人工智能、无人驾驶等方面的应用,微控制器功能多样性的需求不断增长,运算能力不断提升,RISC-V微控制器需要扩展运算功能满足运算实时性、运算精度、指令并行度等运算性能。由于受知识产权的限制,不能沿用商业软件工具,在向用户提供以RISC-V微控制器为核心的软硬件开发平台时,需要相应的编译工具链。因此,利用RISC-V灵活的可扩展性和GCC工具链开放的结构优势,快速自主研发一套高效的定制编译工具链,最大化RISC-V徼控制器在嵌入式交叉开发环境下的性能具有实际意义和应用前景。本文主要针对RISC-V微控制器面向计算密集型应用的运算能力与嵌入式交叉开发的需要,研究并设计了一套包括32位riscv-none-embed-gcc(编译器)、riscv-none-embed-as(汇编器)和riscv-none-embed-ld(链接器)的带乘加指令扩展的RISC-V微控制器的GCC工具链。 首先分析GCC工具链中编译器(gcc)、汇编器(as)、链接器(ld)的基本结构与RISC-V架构指令和数据特点,提出gcc后端移植机制和汇编代码生成流程,移植gcc编译器和BFD库,设计汇编和链接移植接口,生成32位riscv-none-embed-gcc、riscv-none-embed-as和riscv-none-embed-ld的可执行程序,利用objdump反汇编工具、DejaGnu专业测试工具和readelf工具分别测试与验证了riscv-none-embed-gcc的编译和错误报告功能,riscv-none-embed-as识别正常指令并报错异常指令的功能,riscv-none-embed-ld解析未定义符号和重定位分配正确的地址功能,快速完成了RISC-V微控制器的GCC工具链设计。 然后,设计定点乘加指令的汇编格式,提出扩展运算类型转换规则的基本方法,完成指令扩展器对不规则乘加指令的映射,设计带混合数据类型的C测试用例测试扩展乘加指令后的编译器,验证了编译器正确输出与汇编器正确识别madd与mixmadd指令,实现了riscv-none-embed-gcc后端与riscv-none-embed-as对规则和不规则定点乘加指令的支持,完成了支持定点乘加指令的GCC工具链的设计。 最后,针对RTL中间代码生成过程中CPU计算代价高的问题,采用强度削弱的窥孔优化方法,设计了移位化简的指令匹配模板,优化了数据密集型应用中的移位操作,完成了支持定点乘加指令的riscv-none-embed-gcc窥孔优化,利用objdump工具测试了编译四种数据密集型程序后的目标文件体积,验证了窥孔优化效果,利用SPECCPU2017专业测试集对riscv-none-embed-gcc整体性能进行了评估。测试结果表明,窥孔优化后的目标文件体积平均缩小约11%,扩展乘加指令的riscv-none-embed编译器对数据密集型程序的编译性能提升比约为20%,对图像处理等计算密集型程序编译性能提升比约为50%。本文设计的GCC工具链辅助硬件设计的测试和上层应用的开发,编译出的目标代码体积小,有效节省了微控制器存储空间,可应用于可穿戴设备、家用网关等小体积、低功耗领域及适合于图像处理、超级计算机等计算密集型和电子商务系统等数据密集型应用。