在Intel Cyclone V上为绝对初学者构建裸机应用

在像SocKit这样的开发板上使用双核ARM Cortex A9设置Linux并不是火箭科学。 开发板的制造商支持即用型映像,适合在SD卡或其他媒体上安装。 但是,如果您渴望接触裸机,达到不受OS内核限制的惊人的代码速度,该怎么办? 可以,但不是那么容易和明显。 在这篇简短的文章中,我将向您分步说明如何在Cyclone V SoC上构建并运行您的第一个裸机应用程序,该应用程序使用SoC的HPS子系统的ARM Cortex A9内核。

您需要使用Intel(Altera)Cyclone V SoC的开发板。 我使用了SoCKit板:



我一直在做Debian Jessie中这篇文章中描述的所有事情。 您可以使用其他具有相应更改的Linux系统或Windows。

并且您需要DS-5 IDE。 而且,不幸的是,免费版不允许您编译裸机代码。 您需要完整版。

1.准备

尽管您拥有完整版的DS-5,但仍需要安装免费的DS-5 Altera版。 这两个版本都必须以sudo模式安装在不同的目录中,例如:对于DS-5 Altera版,为/ home / user / intelFPGA ,对于完整版DS-5,/ home / user / DS-5。 在安装过程中,您应该手动输入路径。

2. IDE运行

2.1。 首先,运行脚本/home/user/intelFPGA/16.1/embedded/embedded_command_shell.sh ,然后将目录更改为/ home / user / DS-5 / bin并运行IDE:

$ ./eclipse & 


该脚本设置环境变量。 要在系统启动时设置变量,应将以下行添加到文件/home/user/.profile中

 QUARTUS_ROOTDIR=/home/user/intelFPGA/16.1/qprogrammer export PATH=$PATH:/usr/local/gcc-arm-none-eabi-5_4-2016q3/bin/:/home/user/intelFPGA/16.1/embedded/host_tools/mentor/gnu/arm/baremetal/bin/ 


如有必要,为水獭必需的变量添加类似的行,例如QSYS_ROOTDIR。

另外,您需要安装并运行Quartus Prime。 让我们考虑一下,Quartus的安装目录是/home/user/intelFPGA/16.1/quartus/

运行位于/home/user/intelFPGA/16.1/quartus/bin/quartus的 Quartus Prime,它是JTAG程序员实用程序,位于/home/user/intelFPGA/16.1/qprogrammer/bin/quartus_pgmw

3.连接SoCkit

3.1。 将SoCkit板连接到计算机。 将microUSB电缆连接到名为“ USB Blaster(JTAG)”和“ USB to UART”的开发板端口。

3.2。 打开板并输入:

 $ ls /dev/bus/usb/001 001 002 003 


最后一个数字(003)是JTAG接口。 设置写权限:

  $ sudo chmod 666 /dev/bus/usb/001/003 


每次打开电路板时都必须这样做。

3.3。 TTY终端的设置

您可以使用以下命令:
 screen /dev/ttyUSB0 115200 


4.构建预加载器(u-boot-spl)

4.1。 下载文件sockit_ghrd_16.0.tar.gz并解压缩。 例如,将其解压缩到/ home / user / ghrd-16 / sockit_ghrd

4.2。 运行Quartus Prime并打开文件/home/user/ghrd-16/sockit_ghrd/soc_system.qpf。

4.3。 运行Qsys(工具/ Qsys)。 打开文件/home/user/ghrd-16/sockit_ghrd/soc_system.qsys。 生成/生成HDL并退出Qsys。

4.4。 在Quartus Prime中运行Assembler。

4.5。 运行bsp编辑器: /home/user/intelFPGA/16.1/embedded/host_tools/altera/preloadergen/bsp-editor 。 创建一个新项目:File / New HPS BSP。 在“ 加载器 设置目录 ”字段中,写入“ / home / user / ghrd-16 / sockit_ghrd / hps_isw_handoff / soc_system_hps_0”。

4.6。 设置预加载器。 转到标签高级。 关闭Watchdog_enable 。 如果要通过JTAG查看调试消息,可以打开Semihosting 。 在此之后按生成并退出。

4.7。 可以更改启动消息。 例如,在文件软件/ spl_bsp / uboot-socfpga / board / altera / socfpga / socfpga_cyclone5.c中,在另一个上更改字符串“ BOARD:Altera SOCFPGA Cyclone V Board ”:
 /* * Print Board information */ int checkboard(void) { #ifdef CONFIG_SOCFPGA_VIRTUAL_TARGET puts("BOARD : Altera VTDEV5XS1 Virtual Board\n"); #else //puts("BOARD : Altera SOCFPGA Cyclone V Board\n"); puts("ARM preloader build by 32-bit.me\n"); #endif return 0; } 


4.8。 环境变量SOCEDS_DEST_ROOT必须设置为/home/user/intelFPGA/16.1/embedded
 export SOCEDS_DEST_ROOT=/home/user/intelFPGA/16.1/embedded 

现在转到目录
 /home/user/ghrd-16/sockit_ghrd/software/spl_bsp 
并做。 Make可能会因错误“ make:mkpimage:找不到命令”而失败,但是它应该在路径/ home / user / ghrd-16 / sockit_ghrd / software / spl_bsp / uboot-socfpga / spl中构建u-boot-spl文件/ u-boot-spl

4.9。 测试预加载器

4.9.1。 您不需要运行预加载器的FPGA映像(扩展名为“ .sof”)。 运行DS-5,然后打开“运行/调试配置”。

4.9.2。 在“ 连接 ”字段中,应设置CV SoCKit 1-1选项。 如果不是,请按“浏览”按钮并设置此选项。 如果出现错误,请执行3.1-3.2。

4.9.3。 在“文件”选项卡上的“要下载的主机上的应用程序”字段中设置文件u-boot-spl :/ home / user / ghrd-16 / sockit_ghrd / software / spl_bsp / uboot-socfpga / spl / u-boot-spl 。 设置标志“加载符号”。 保持“文件”字段为空。

4.9.4。 关闭在“调试”选项卡上启动的调试脚本。

4.9.5。 运行终端实用程序(例如screen ),然后按“调试”按钮。 预加载器已加载到内存中,调试器已准备好启动。 按下“继续”按钮(或F8),然后看到以下消息:

 U-Boot SPL 2013.01.01 (Jun 24 2017 - 19:49:33) ARM preloader build by 32-bit.me CLOCK: EOSC1 clock 25000 KHz CLOCK: EOSC2 clock 25000 KHz CLOCK: F2S_SDR_REF clock 0 KHz CLOCK: F2S_PER_REF clock 0 KHz CLOCK: MPU clock 925 MHz CLOCK: DDR clock 400 MHz CLOCK: UART clock 100000 KHz CLOCK: MMC clock 50000 KHz CLOCK: QSPI clock 370000 KHz RESET: COLD SDRAM: Initializing MMR registers SDRAM: Calibrating PHY SEQ.C: Preparing to start memory calibration SEQ.C: CALIBRATION PASSED SDRAM: 1024 MiB ALTERA DWMMC: 0 Card did not respond to voltage select! spl: mmc init failed: err - -17 ### ERROR ### Please RESET the board ### 


这意味着预加载器已成功启动。

4.9.6。 调试会话后,按“从目标断开连接”和“删除连接”按钮。

5.为裸机模式编写一个Hello World。

5.1。 下载项目ArrowSocKit_BareMetal_GNU.zip。 像2.1。中那样设置环境变量,运行DS-5,从存档中导入项目(将File / Import / Existing Project导入到Workspace中选择archile文件 )。 解压缩后的项目出现在目录/ home / user / DS-5-Workspace / BareMetalBoot-GNU中。

5.2。 您可以尝试使用make构建项目,但尚不能构建。 要生成项目,请执行以下操作。

5.3。 将目录/home/user/intelFPGA/16.1/embedded/ip/altera/hps/altera_hps/hwlib复制到/ home / user / DS-5-Workspace /中 。 这是文件夹srcinclude ,每个文件夹中都有soc_cv_avsoc_a10目录。 您可以删除名为soc_a10的目录。 然后从/home/user/intelFPGA/16.1/embedded/host_tools/mentor/gnu/arm/baremetal/arm-altera-eabi/lib复制文件libcs​​3.a,libcs​​3arm.a,libcs​​3unhosted.a 到项目目录(/ home / user / DS-5-Workspace / BareMetalBoot-GNU)。 将文件arm-names.inc从/home/user/intelFPGA/16.1/embedded/host_tools/mentor/gnu/arm/baremetal/arm-altera-eabi/lib/cortex-a9/复制到/ home / user / DS- 5个工作区/ BareMetalBoot-GNU /

5.4。 在Makefile中,将“ CROSS_COMPILE:= arm-none-eabi-”更改为“ CROSS_COMPILE:= arm-altera-eabi-”。 还要更改hlib的路径:HWLIBS_ROOT:= / home / user / DS-5-Workspace / hwlib

5.5。 现在运行make 。 并阅读所有错误消息。 如果make找不到某些符号,则应在目录hwlib / src / soc_cv_av和hwlib / include / soc_cv_av中找到它,并在hwlib / src和hwlib / include中进行相应的复制。 找到所有配置文件后,make失败,并显示错误“ mkimage:not found”,但这并不重要,因为我们只需要test.axf文件。

5.6。 运行应用程序

5.6.1。 要运行应用程序,必须加载FPGA映像(.sof文件),该映像是在我们构建预加载器时生成的。 像在2.1中一样运行程序员。 底部“硬件设置”的右侧必须有文本“ CV SoCKit [1-1]”。 如果没有,则应设置JTAG端口的写许可权(请参见上文),然后单击“硬件设置”按钮。

5.6.2。 单击“自动检测”,然后从列表中选择一个任意选项。 您将看到两个设备的配置:一个是您选择的设备(例如5CSEBA6),第二个是SOCVHPS。 删除第一个设备:选择它,然后按Delete键。 按“添加文件”并打开图像文件(/home/user/ghrd-16/sockit_ghrd/output_files/soc_system.sof)。 SOCVHPS的右侧出现了一个新设备。 用鼠标将其移到链中的第一位。 之后,按开始并上传图像。

5.6.3。 在DS-5中,在“文件”选项卡上打开“调试配置”。 在“要下载的主机上的应用程序”行上设置文件u-boot-spl 。 删除“加载符号”上的标记。 在“文件”行中设置文件“ test.axf”。 在“调试器”选项卡上,检查“运行目标初始化调试器脚本”,并在项目目录中设置脚本文件“ debug-unhosted.ds”。 在文件中,编辑预加载器的路径:
# Load the SPL preloader into memory.
#
loadfile "/home/user/ghrd-16/sockit_ghrd/software/spl_bsp/uboot-socfpga/spl/u-boot-spl" 0x0


运行TTY终端屏幕 ,然后按Debug。 然后,预加载器将启动,应用程序将被上载,并且调试器将在程序的起点设置。 按下“继续”按钮。 在终端的窗口中,您将看到预加载器的输出,如上所示,然后是以下内容:

 Disabled interrupts because preloader enabled ECC interrupts. Global Timer value at startup = 0x000000005A10B609 CPU frequency is 925000000 hertz. DDR frequency is 400000000 hertz. MPU peripheral frequency is 231250000 hertz. MB ZERO remapped to SDRAM. L3 interconnect remapped as inaccessible and SDRAM. Interrupt controller system API initialized. MMU initialized and enabled. L1 and L2 cache system initialized and enabled. GIC interrupts enabled. PIT started. PIT interrupt registered and enabled. GPIOs initialized. UART0 initialized. L3 interconnect remapped as accessible and SDRAM. Bridges initialized. Boot completed. Boot milestones: New buffer !ESTONE : GT TICKCOUNT : INCREMENTAL : CUMULATIVE initial GT : 0x000000005A10B609 : 0.000us : 0.000us frequency capture : 0x000000005A119D58 : 256.065us : 256.065us initial remapping : 0x000000005A11C936 : 48.562us : 304.627us interrupt sys init : 0x000000005A139FED : 521.094us : 825.721us mmu init : 0x000000005A62D774 : 22449.985us : 23275.706us cache init : 0x000000005A65CF96 : 841.488us : 24117.194us interrupts enabled : 0x000000005A65D0D7 : 1.388us : 24118.582us pit start : 0x000000005A65DD2E : 13.661us : 24132.242us pit enabled : 0x000000005A65DF67 : 2.461us : 24134.703us gpio init : 0x000000005A65FC12 : 31.736us : 24166.439us uart0 init : 0x000000005A66084D : 13.539us : 24179.978us fpga config : 0x0000000000000000 : 79769704095969360.000us : 79769704095993552.000us last remapping : 0x000000005A660981 : 6558428.303us : 24181.310us bridge init : 0x000000005A6611B6 : 9.085us : 24190.396us complete : 0x000000005A661222 : 0.467us : 24190.863us Hello world, 32bit-me! 


恭喜你! 您刚刚在Cortex-A9内核上运行了第一个裸机应用程序。

Source: https://habr.com/ru/post/zh-CN463717/


All Articles