Menu Close

RISC-V C语言编程1(2)新建C语言工程

1.新建C语言工程

相关参考文章:

RISC-V教学教案

 

之前的文章RISC-V C语言编程1(1)FII-RISC-V CPU简介和C语言编译流程中介绍了C语言的编译流程,本文将在Freedom Studio的环境下新建一个C语言工程。

Freedom Studio被用作开发平台。 它由SiFive公司研发,基于行业标准Eclipse IDE,并且RISCV硬件板兼容。 此外,它还预先构建了RISCV GCC工具链(toolchain)和仿真器(emulator)。

按照下面显示的步骤在Freedom Studio中创建一个新的C项目。

首先,点击File > New > C Project,然后会弹出一个窗口,如图2所示。将项目名称设置为test。 对于Project type,选择Empty Project,然后在Toolchains中选择RISC-V Cross GCC。 其他设置保持默认选项。 点击两次Next,然后点击Finish完成设置。

 

%title插图%num

图1 创建C语言工程

 

%title插图%num

图2 C工程设置

 

%title插图%num

图3结束C工程设置

如图4所示,右键单击新创建的C工程,选择Properties,图5中的窗口将弹出。

 

%title插图%num

图4 工程Properties

图5中有很多需要注意的项。 要进入常规设置界面,在左边的C/C++ Build选项下点击Settings。相应的设置会出现在右侧。

首先,点击Target Processor. 由于FII RISCV是基于整数的32位指令集,因此为Architecture选择RV32I(-march = rv32i *)注意不要勾选下面的Multiple extensionAtomic extension。 对于Integer ABI,选择ILP32(-mabi = ilp32 *)。 ABI(application binary interface,应用程序二进制接口)是一种定义数据结构和计算例程的格式。 ILP32表示C项目中的int类型,long类型和指针类型均为32位。 small data limit一栏,填4。

 

%title插图%num

图5 Target Processor设置

在图6中,对于Optimization设置,选择Optimization LevelOptimize for debug (-Og)。勾选 Disable builtin (-fno-builtin) 以禁用所有标准C库函数的替换和内联操作。 其他复选框保持默认选项。

 

%title插图%num

图6 Optimization设置

在图7中,单击Warnings,然后勾选 Enable all common warnings (-Wall)。 此选项将提供常见的警告信息。 这非常实用,因为修正常见的警告会防止严重错误的发生。

单击Debugging,进入调试设置,如图8所示。将Debug level设置为Default (-g)

 

%title插图%num

图7 Warnings 设置

%title插图%num

 

图8 Debugging设置

GNU RISC-V Cross Linker下点击General,并选中Do not use standard start files (-nostartfiles),如图9所示。自定义的启动文件将被使用,稍后将对其进行介绍。

%title插图%num

 

图9 Linker General设置

GNU RISC-V Cross C Linker下的 Miscellaneous 设置中,如图10所示,选中Use newlib-nano(–specs = nano.specs),并将Other linker flags设置为-t -nostdinc –entry _start -Wl, -m,elf32lriscv -Wl,-EL,-b,elf32-littleriscv -Wl,–check-sections -Wl,–wrap = printf。 有关选项的详细说明,请参见表1。 其他选项可以在gcc.gnu.org上查询。

 

%title插图%num

图10 Miscellaneous设置

 

选项

描述

–specs=nano.specs 添加newlib-nano,nano是专为小型嵌入式应用程序而设计的库
-t 打开trace文件
-nostdinc 不在标准系统目录中搜索头文件
–entry _start 将起始地址设置为startup.s
-Wl 将选项传递给链接器
-m 设置仿真
Elf32lriscv 以RISCV32I格式输出文件
-El 链接小端(little-endian)对象
-b 指定后续输入文件的目标
Elf32-littleriscv 输出文件为小端(little-endian)格式
–check-sections 检查section地址是否重叠
–wrap=printf 对printf使用包装函数

表1 linker选项描述

在图11中,在GNU RISC-V Cross Create Flash Image下的General设置中选择Raw binary。 此选项输出原始二进制文件,可用于FLASH编程。

 

%title插图%num

图11 Flash Image设置

接下来,开始使用来自RISCV_Hello(该工程可在文章末尾下载)的一些现有文件配置新的C项目。RISCV_Hello主要做了一个打印输出,代码如下:

#include <stdio.h> 
#include “fii_types.h” 
#include “platform.h” 
#define  NOP_DELAY  0x100 

void delay_cnt (int cnt) 
{     
    unsigned int  i;     
    for(i = 0; i < cnt ; i ++ )         
        asm(“nop”);     
        return; 
}; 

int main(void) 
{     
    while ( 1 )     
    {         
        printf(“Hello FII Risc-V !\r\n”);         
        delay_cnt(NOP_DELAY);     
    } 
}

 


RISCV_Hello工程下选择bsp,inc,entry.S,main.S,startup.S,sys.ldstest_dbg.cfg文件,在弹出菜单上右键单击 Copy,然后右键单击 test 工程,选择Paste以粘贴所有复制的文件。

该过程如图12,图13所示。

%title插图%num

 

图12从RISCV_Hello中复制文件

 

%title插图%num

 

图13 复制文件到test工程

将文件添加到test工程后,右键单击,然后像以前一样选择Properties。 在图14中,单击GNU RISC-V Cross C Compiler下的Includes设置。 在Include paths中,单击Add图标,然后会弹出一个窗口。 在Directory column中,填$ {workspace_loc:/ $ {ProjName} / inc}或点击选择Workspace,然后选择test工程下的inc,如图15所示。单击OK完成。

 

%title插图%num

图14 添加头文件

 

%title插图%num

图15 选择增加文件路径

在图16中,单击GNU RISC-V Cross C LinkerGeneral设置,在右侧的Script files中,单击Add图标将路径添加到链接器脚本。 将$ {workspace_loc:/ $ {ProjName} /sys.lds}填到File,或单击Workspace,然后找到test工程下的sys.lds,如图17所示。然后单击Apply and Close完成设置。

 

%title插图%num

图16 添加linker script路径

%title插图%num

 

图17 选择增加文件路径

完成上述所有步骤之后,进行Clean ProjectBuild ProjectRefresh,如图18所示。

 

Clean, build, and refresh the project

图18 Clean Project,Build Project和Refresh

%title插图%num

 

图19 Debug

 

右键单击test工程,然后选择Debug As > Debug Configurations,如图19所示。图20显示了Debug Configuration弹出窗口。 在GDB OpenOCD Debugging下,单击左上角图标New launch configuration以添加test Debug。 通常在构建项目,Refresh后,Main选项卡下的C/C++ Application 行将自动填充相应的* .elf文件。 如果不是,单击空白下的Search Project以搜索* .elf文件。 否则,使用 Browse按钮在调试文件夹下找到* .elf文件(绝对路径)。

 

%title插图%num

图20 Debug configurations(调试配置)

图21显示了Debugger设置。 在 Config options选项中填-f test_dbg.cfg,并在Commands中填写set mem inaccessible-by-default off。 然后单击Debug开始调试。 “set mem inaccessible-by-default off”使GDB将未由内存范围明确描述的内存视为RAM [4]。

 

%title插图%num

图21 Debugger设置

 

Posted in RISC-V, RISC-V 教材教案, 应用开发, 开发板使用, 教材与教案, 文章

3 Comments

发表回复

相关链接