Rvfive 发表于 2021-9-27 10:16:13

RISC-V MCU开发 (四):编译配置

   在嵌入式开发中,当我们完成了工程创建、代码编辑等操作之后,就可以开始进行工程编译。 对于使用内置工程模板创建或外部导入的项目,MounRiver® Studio(MRS)会根据对应芯片内核自动配置好目标工具链(riscv-none-embed-gcc或arm-none-eabi-gcc),同时,目标平台、优化等级、调试等级以及文件引用等编译配置也会自动设置完毕。
   MRS最新V1.51版本安装包获取方式:www.mounriver.com 。

【工程属性页】在资源管理器窗口选中要编译的工程,点击工具栏上的工程属性配置按钮,或者点击右键菜单中的”Properties”进入编译选项属性页面。file:///C:/Users/LIUFEN~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg 【目标处理器】用于指定目标指令架构、扩展函数等参数。
[*]Architecture是指令集架构,rv32i是RISC-V 基础整数指令集

[*] RVM表示支持乘除法扩展,RVA表示支持原子扩展,RVF表示单精度浮点数扩展,RVD为双精度浮点数扩展,RVC为压缩指令扩展。

[*]IntegerABI 为RISC-V应用程序整数二进制接口,Floating point ABI为RISC-V应用程序浮点数二进制接口,RISC-V 编译器支持多个 ABI,具体取决于 F 和 D 扩展是否存在。RV32 的 ABI 分别名为 ilp32,ilp32f 和 ilp32d。ilp32 表示 C 语言的整型(int),长整型(long)和指针(pointer) 都是 32 位,可选后缀表示如何传递浮点参数。在 ilp32 中,浮点参数在整数寄存器中传递; 在 ilp32f中,单精度浮点参数在浮点寄存器中传递;在 ilp32d中,双精度浮点参数也在浮点寄存器中传递。自然,如果想在浮点寄存中传递浮点参数,需要相应的浮点ISA 添加 F 或 D 扩展。因此要编译 RV32I 的代码(GCC 选项-march=rv32i),必须使用 ilp32ABI(GCC选项-mabi=ilp32)。反过来,调用约定并不要求浮点指令一定要使用浮点寄存器,因此RV32IFD与 ilp32,ilp32f和 ilp32d都兼容。

[*] Tuning 由微架构优化给定处理器的输出,默认是rocket。

[*] Code model主要有两种模式:
       -mcmodel=medlow:程序及其静态定义的符号必须位于单个2 GiB地址范围内,并且必须位于绝对地址-2 GiB和+2 GiB之间。程序可以静态或动态链接。这是默认
                                    的代码模型。       -mcmodel=medany:程序及其静态定义的符号可以任何单个2 GiB地址范围内。程序可以静态或动态地连接。
[*] Align 中-mstrict-align-mno-strict-align 取决于处理器是否支持内存的非对齐访问。

[*]Small data limit 在某些目标上将小于n字节的全局和静态变量放进一个特殊的段。


【优化等级】主要是配置GCC的优化选项,想要添加其他优化选项可以写在下方other optimization flags中。

file:///C:/Users/LIUFEN~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg
[*] -O0:无优化(默认)

[*]-O、-O1:使用能减少目标文件大小以及执行时间并且不会使编译时间明显增加的优化.在编译大型程序的时候会显著增加编译时内存的使用.

[*] -O2: 包含-O1的优化并增加了不需要在目标文件大小和执行速度上进行折衷的优化.编译器不执行循环展开以及函数内联.此选项将增加编译时间和目标文件的执行性能.

[*]-Os:专门优化目标文件大小,执行所有的不增加目标文件大小的-O2优化选项.并且执行专门减小目标文件大小的优化选项.

[*] -O3: 打开所有-O2的优化选项并且增加部分参数。

【警告等级】用于设置GCC的警告参数选项。


file:///C:/Users/LIUFEN~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg -fsyntax-only:检查代码中的语法错误,但除此之外不要做任何事情。 -fmax-errors=n:将错误消息的最大数量限制为n ,此时GCC会缓存,而不是尝试继续处理源代码。 如果n为0(默认值),则生成的错误消息数量不受限制。 如果还指定了-Wfatal-errors ,则重大错误优先于此选项。
[*] -w:禁止所有警告消息。

[*] -Werror:使所有的警告进入错误

[*] -pedantic:允许发出ANSI/ISO C标准所列出的所有警告

[*] -pedantic-errors:允许发出ANSI/ISO C标准所列出的错误

[*] -Wfatal-errors:遇到第一个错误就停止,减少查找错误时间

【调试等级】红框中的-g设置GDB调试信息,注意生成静态库时将红框中调为None,否则生成的库会包含调试信息,导致库文件过大。


file:///C:/Users/LIUFEN~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg 【汇编、头文件添加】红框中的位置分别为添加汇编、头文件接口,点击右侧方框上绿色的加号去添加文件路径。

file:///C:/Users/LIUFEN~1/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg 【链接脚本文件添加】红框中的位置分别为添加链接脚本文件接口,点击右侧方框上绿色的加号去添加文件路径。


file:///C:/Users/LIUFEN~1/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg 【库文件添加】-L添加库文件的路径,-l添加库名,注意库名要去掉前缀和后缀,例如libtest.a,只需要填写test。


file:///C:/Users/LIUFEN~1/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg 【链接其他文件】Other objects 可以添加想要参与链接的.o或者.lib文件。


file:///C:/Users/LIUFEN~1/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg 【输出文件格式】右侧红框中可点击下拉框选择编译后输出BIN文件或者HEX文件。


file:///C:/Users/LIUFEN~1/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg 【输出类型】图示位置可选择生成可执行文件或者静态库文件。
file:///C:/Users/LIUFEN~1/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg 以上就是MRS常用的编译配置,编译之后生成的文件会存在工程目录中obj文件中,其中.list和.map文件可用于对程序分析。

孔明 发表于 2021-9-27 12:36:50

编译设置在Windows下不好搞,Linux反而好操作

Rvfive 发表于 2021-9-27 17:00:35

孔明 发表于 2021-9-27 12:36
编译设置在Windows下不好搞,Linux反而好操作

但是像我们这种之前KEIL用得多的,还是习惯在Windows下搞嵌入式

草帽王子 发表于 2021-9-27 23:20:22

Rvfive 发表于 2021-9-27 17:00
但是像我们这种之前KEIL用得多的,还是习惯在Windows下搞嵌入式

大神厉害:handshake:handshake

孔明 发表于 2021-9-29 15:05:03

Rvfive 发表于 2021-9-27 17:00
但是像我们这种之前KEIL用得多的,还是习惯在Windows下搞嵌入式

时代变了,我们都认为今后开发人员会逐步像Linux和云端编译靠拢,Windows基本上到头了,太不灵活了,越用越傻,固件越来越大,很多测试都没法进行,我们目前很多固件需要专业测试框架下运行,毫无例外都是Linux下。

孔明 发表于 2021-9-29 15:07:07

Rvfive 发表于 2021-9-27 17:00
但是像我们这种之前KEIL用得多的,还是习惯在Windows下搞嵌入式

Keil被ARM收了,定然不会兼容RISC-V这个眼中钉,我个人认为RISC-V这个不该走ARM+Keil这条闭源老路,应该独辟蹊径
页: [1]
查看完整版本: RISC-V MCU开发 (四):编译配置