altera nios ii 多区启动

一,参考资料

1.altera Remote Update IP core user guide.(RU IP)该文档说明如何在多个sof文件中选取一个sof,配置进fpga中,不涉及后续的nios软件启动

2.altera embeded deign handbook.5.2节阐述如何在sof以及配置好的情况下,启动单个elf应用程序(以app.elf为例).5.3节说明在某个sof配置完成的情况下,有选择地从多个elf启动某一个,或者在多个elf之间跳转.

单elf方法与多elf方法最大的区别在于,单elf的BootLoader和app.elf是捆绑在一起的,它们在make target -> build ->generate_mem_ini过程中生成.hex文件.该方法无法单独指定app.elf在flash中的地址,eclipse软件自动把他排在自动生成的BootLoader文件的后面.

多elf方法由于要指定多个elf到不同的flash地址中去(如果不想把多个elf.hex放在onchip ram浪费ram资源的话),因此多了一个程序bootcopier.elf,注意bootcopier并不是BootLoader,多elf方法的BootLoader程序仍然是在generate_mem_ini过程中自动产生的.bootcopier.elf的地位和app.elf的地位相同,只不过功能比较特殊而已.多elf方法通过generate_mem_ini把BootLoader和bootcopier的elf打包成hex文件,并把这个hex文件写到qsys指定的reset地址上去.fpga上电完成后,内部有一个固件,先从reset位置执行BootLoader,并把bootcopier运行起来.()bootcopier的程序代码我们自己可修改),bootcopier再到程序内部定义的app.elf的存储地址,把app.elf搬运到onchipram或者ddr上去

笔者目前实用的方法是用RU IP加多elf方法,实现多sof+elf启动:用多elf方法,在某个sof上只启动单个elf.然后做多套sof+elf,通过RU IP选取不同的sof,再引导不同的elf启动.

生成sof1的qsys需要添加RU IP,并用verilog实现tcl脚本配置的功能,以实现sof的跳转,生成sof2的 quartus qsys不需要加RU IP

二 步骤

1.搭建硬件工程.qsys中需例化两个onchipram, ram1存放和运行BootLoader和bootcopier的hex文件,ram2用于运行app.elf(也可运行在ddr上).qsys中需例化epcq控制器(altera serial flash controller II)

2.nios ii CPU的reset vector设置为ram1.BootLoader和bootcopier的hex文件如何写进ram1?打:把nios ii SBT generate_mem_ini操作产生的几个hex文件中的ram1.hex以及.qip.spd加入quartus工程中,全编译即可(全编译较慢,可processing -> uodate memory initialization file更新ram1初始化文件,然后在左下方的task栏中,只重新生成sof文件即可).ram1在上电配置时,就会初始化为hex的内容.

3.qsys搭建好以后,产生.sopcinfo文件后就可以在nios SBT(eclipse)内新建bootcopier工程.问:app.elf从何处搬运?答:bootcopier.c文件中,指定app.elf存放的flash地址.问:搬到何处去?答:app(如hello_world工程)软件工程中,bsp editor linker script中指定,app.elf运行在何处.可运行在ram2或者ddr中去,运行在何处,bootcopier就会搬运到ram2或者ddr控制器的系统地址去.问:搬运多少数据?答:搬运到何处以及搬运多少,最终会写在app.elf的头部,bootcopier搬运的时候,会先解析elf头部信息.bootcopier工程的bsp link script设置运行在ram1上,因为bootcopier是运行在ram1上的.

bootcopier在新建eclipse工程时,有模板的(可能是参考资料里demo提供的代码).生成后需要修改advanced_boot_copier.c主要把CopyFromFlash函数的epcs_read_buffer注释掉,换成memcpy(dest,src,num);另外修改代码里app程序镜像文件(elf->hex)在flash中存放发绝对地址(如0x3300000或者0x7300000),将代码中的boot_image直接指定为1,不让程序检查应用程序镜像头.bsp linker script中,heap text stcak等均设置为onchipram1.

修改设置好以后,编译程序,选定左侧的工程文件夹,右键->make target ->build->gegrate)mem_ini生成ram1.hex

4.将ram1.hex以及memini.qip .spd加入quartus工程里,设置工程,device ->device and pin setting->configration中设置configuration scheme为ASx4,configuration devide选epcql1024,AS clock source选25M晶振,未使用管脚设输入三态等.全编译

5.等待全编译过程,再新建一个app应用工程,点灯,hello world等,bsp linker script设置ram2

6.Windows下,打开nios command shell,运行demo例程中提供的make_flash_image_script.sh脚本(可能需要修改一下,针对不同的shell环境),将app.elf转换成app.hex

7.sof1编译完成后,该sof携带了ram1的初始化信息.现在需将sof和app.hex合并生成jic文件(file->convert programing file).加jic时,.hex选相对地址(eg:0x300_0000),那么,hex在flash的绝对地址是0x330_0000,bootcopier程序中写的就是该绝对地址,大小端选big endian,sof勾选压缩选项,地址选auto(注意,多套sof+hex时,第一个sof以外的sof的地址要手动确定比如sof1地址是auto,hex1地址是0x330_0000,sof2地址可写0x400_0000,hex2地址选0x730_0000)

8.烧录,断电,重启,从flash启动,即可自动配置sof1,运行app elf,第一套sof+hex就完全运行起来了.触发RU IP跳转条件(例如按键,或者来自逻辑的某个寄存器值),就可以跳转到sof2+hex2

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值