Chinaunix首页 | 论坛 | 博客
  • 博客访问: 617379
  • 博文数量: 486
  • 博客积分: 10125
  • 博客等级: 上将
  • 技术积分: 5842
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-27 18:34
文章分类

全部博文(486)

文章存档

2011年(52)

2010年(107)

2009年(289)

2008年(38)

我的朋友

分类:

2009-08-13 17:02:30

标签: 无标签

在niosii上跑uClinux

概述

NIOSIIaltera公司针对FPGA推出的一个CPU软核,它可以综合到任何一款alteraFPGA中。用户可以基于sopc builder搭建自己的系统。一个基于NIOSII的系统如图:点击看大图

除了sopc builder提供的一些外设以外,用户可以按照avalon总线标准来实现自己的模块,而且可以很容易的集成到系统里面去。 

niosii有三个不同的版本:niosii-eniosii-sniosii-f 

Niosii-e针对低成本应用,内部没有流水线结构,不带指令/数据CACHE,所以实现所需要的逻辑较小(600-700 LEs)。 

Niosii-s有五级流水结构,带指令cachesize根据用户配置),实现需要1200-1400 LEs

Niosii-f有六级流水结构,带指令和数据cache,实现需要1400-1800 LEs 

建立niosii系统

在建立系统之前检查一下软硬件配置:

1、使用最新版本的QuartusNios软件,低版本软件可能存在bug。我之前用QuartusII 5.1试了好几次都没有完全把uClinux跑起来,在boot开始以后就挂死了,百思不得其解,后来换成QuartusII 6.1以后,重新编译了一下逻辑就把跑起来了。郁闷了我好久……

2uClinux需要在linux环境下编译(基于cygwin也可以编译,不过我说的这个过程是在linux上的),所以你必须有一个linux操作系统。有几种办法:A,装一个linux版本的QuartusII,所有的操作都在linux下完成。B,用两台计算机,一台用windows,跑quartus等软件,另一台装linuxC,在windows下装个虚拟机vmware,在虚拟机上装linux,通过虚拟机来编译uClinux,然后把image文件导入到windows下调试。我就是使用虚拟机的方法,但是要求你的PC内存比较大才行,否则系统会很慢。

3、你板子上FPGA的容量要能装的下一个系统,外部的SDRAM容量至少要8M byte。我用的是一个EP1C6FPGA8M byteSDRAM。不需要FLASH

以上条件都满足了,就可以开始了。

首先,建立一个工程,然后建立一个小系统,配置如下:

点击看大图 

最小系统至少要包括:

一个niosii cpu,一个sdram控制器,cfi_flash控制器(在单板上不需要flash),全功能的timer,用于通信的jtag uartserial uart

可以根据单板的硬件资源来适当配置逻辑,比如加入一些ledkey等等。

linux里面中断0是自动识别的,所以在硬件系统里面不要使用0号中断。

 生成好系统以后,在Quartus里面把引脚连好,包括设置好用于SDRAM PLL

 点击看大图

 系统编译好以后,先用NIOSII IDE写个程序来测试一下SDRAM和系统是不是可以运行。如果程序能正确运行的话,就可以进入下一步了。 

建立uClinux的交叉编译环境

要把uClinux放到niosii中运行首先必须把uClinux代码编译成niosii的指令。这个编译的过程需要相应的程序来完成。下载软件包。 

进入linux操作系统,打开一个shell界面,执行如下操作:

把下载的nios2gcc.tar.bz2软件包放到home下,如/home/duckfly/

然后切换到root 

su

#输入root密码

tar jxf /home/duckfly/nios2gcc.tar.bz2 -C /
exit

niosii的交叉编译工具链就会安装到/opt/nios目录下,我们需要把这个目录加入到path变量中去,让shell能自动寻找。

打开home下载.bash_profile文件,这个文件是隐藏文件,需要用ls –a才能看见。 

ls -a

vi .bash_profile

#PATH变量修改为:PATH=$PATH:/opt/nios2/bin:$HOME/bin

 点击看大图 

source .bash_profile

# 让修改的环境变量生效

 

nios2-linux-gcc –v

# 查看是否安装好了,打印出版本信息

点击看大图 

编译uClinux

交叉编译环境安装好以后,就可以编译uClinux了。

首先到 下载一个uClinux的代码包。

然后下载 软件包,这是把uClinux移植到niosii CPU上的补丁。

linux下使用如下命令: 

# 使用普通用户登陆
cd ~

# 解压uClinux代码
tar jxf ~/download/uClinux-dist-20070130.tar.bz2

# 进入uClinux根目录
cd uClinux-dist

# 打补丁,这一步只能做一次,否则会引起错误
zcat  ~/download/ | patch -p0

# 还是停在uClinux-dist目录,不要切换目录

# 配置uClinux 内核

make menuconfig

# 选择Vendor/Product Slection

 点击看大图

# 配置VendorProduct

点击看大图 

# 回到主界面,选择Kernel/Library/Default Selection

# 配置LibraryKernel参数为默认值

 点击看大图 

# 选择

# 保存配置

点击看大图 

# 把在QuatusII下生成的系统的ptf文件拷贝到一个目录,比如/home/duckfly/sys.ptf

# 根据系统硬件配置uClinux

make vendor_hwselect SYSPTF="/home/duckfly/"sys.ptf

# 根据硬件配置选择相应的选项

# 建立romfs目录,第一次make可能会报错,忽略。必须在第一次编译内核之前运行
make romfs

# 编译内核,第一次编译内核时可能报错,如果出错,那么重新再make一次
make 

# 如果错误,重新再make一次
make

# 重新生成image文件
make linux image

# 到这里,uClinuximage文件就产生了,把它拷贝到windows下面下载并运行

  

下载硬件

Quatus里面把编译好的系统下载到FPGA里面去

点击看大图 

下载uClinux image文件

FPGA配置完以后,就可以下载软件了。

打开NIOSII的命令行

点击看大图 

点击看大图 

# 进入到zImage文件所在的目录,下载软件

nios2-download –g zImage

 点击看大图 

# 下载完成以后,打开nios2-terminal,接口串口发送的信息

nios2-terminal

# JTAG串口上打印如下信息

 

Uncompressing Linux... Ok, booting the kernel.

Linux version 2.6.19-uc1 (duckfly@localhost.localdomain) (gcc version 3.4.6) #22 PREEMPT Sun Jun 17 16:22:49 CST 2007

uClinux/Nios II

Altera Nios II support (C) 2004 Microtronix Datacom Ltd.

Built 1 zonelists.  Total pages: 2032

Kernel command line: duckfly

PID hash table entries: 32 (order: 5, 128 bytes)

Dentry cache hash table entries: 1024 (order: 0, 4096 bytes)

Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)

Memory available: 6892k/8192k RAM, 0k/0k ROM (871k kernel code, 336k data)

Mount-cache hash table entries: 512

io scheduler noop registered

io scheduler deadline registered (default)

NIOS serial driver version 0.0

ttyS0 (irq = 2) is a builtin NIOS UART

Freeing unused kernel memory: 260k freed (0xe2000 - 0x122000)

Shell invoked to run file: /etc/rc

Command: hostname uClinux

Command: mount -t proc proc /proc

Command: mount -t sysfs sysfs /sys

Command: mount -t usbfs none /proc/bus/usb

mount failed: No such file or directory

Command: mkdir /var/tmp

Command: mkdir /var/log

Command: mkdir /var/run

Command: mkdir /var/lock

Command: mkdir /var/empty

Command: ifconfig lo 127.0.0.1

ifconfig: Bad command or file name

Command: route add -net 127.0.0.0 netmask 255.0.0.0 lo

route: Bad command or file name

Command: cat /etc/motd

Welcome to

           ____ _  _
         /  __| ||_|                
    _   _| |  | | _ ____  _   _  _  _
   | | | | |  | || |  _ \| | | |\ \/ /
   | |_| | |__| || | | | | |_| |/    \
   |  ___\____|_||_|_| |_|\____|\_/\_/
   | |
   |_|

 

For further information check:

Execution Finished, Exiting

Sash command shell (version 1.1.1)

/>

 

 

# 可以使用linux下的一些命令如:

/> ls

bin   dev   etc   home  lib   mnt   proc  usr   var   sys   tmp   init  sbin

/> ps

  PID  Uid     VmSize Stat Command

    1 root            SW  /init duckfly

    2 root            SWN [ksoftirqd/0]

    3 root            SW< [events/0]

    4 root            SW< [khelper]

    5 root            SW< [kthread]

    6 root            SW< [kblockd/0]

    7 root            SW  [pdflush]

    8 root            SW  [pdflush]

    9 root            SW< [kswapd0]

   10 root            SW< [aio/0]

   15 root            SW  -/bin/sh

   17 root            RW  ps

/> cd tmp

/tmp> ls

module  test

/tmp> cd test

/tmp/test> ls

led     string  led2

 

系统分类: CPLD/FPGA   |   用户分类: 无分类   |   来源: 原创   |   【推荐给朋友】   |   

    阅读(5949)    回复(51)  

投一票您将和博主都有获奖机会!

最新评论

  • 路在脚下

    2007/7/11 21:41:41

    呵呵,太幸运了,能这么早发现您的这篇文章,对我真的很有帮助,谢谢啦

  • magic-lee

    2007/7/31 8:23:27

    最近正好想玩玩这个,能找到你真是太幸运了

  • duckfly

    2007/7/25 22:57:25

    从你的截图上来看,应该是没有安装gcc,你在Linux的安装光盘上把gcc编译器装上就可以了.

  • windlfs

    2007/7/25 9:11:26

    高手,可否留个在线联系方式?按照这个步骤,出了点问题啊!

  • windlfs

    2007/7/25 9:21:08

  • Frank

    2007/8/28 18:00:50

    [root@localhost uClinux-dist]# make dep
    make ARCH= CROSS_COMPILE= -C linux-2.6.x dep
    make[1]: Entering directory `/mnt/hgfs/CrazyBoy/uClinux-dist/linux-2.6.x'
    Makefile:493: /mnt/hgfs/CrazyBoy/uClinux-dist/linux-2.6.x/arch//Makefile: 没有那个文件或 目录
    make[1]: *** 没有规则可以创建目标“/mnt/hgfs/CrazyBoy/uClinux-dist/linux-2.6.x/arch//Makefile”。 停止。
    make[1]: Leaving directory `/mnt/hgfs/CrazyBoy/uClinux-dist/linux-2.6.x'
    make: *** [dep] 错误 2
    [root@localhost uClinux-dist]#

     

    [root@localhost uClinux-dist]# make vendor_hwselect SYSPTF="/home/crazyboy/"sys.ptf
    make ARCH= -C vendors vendor_hwselect
    make[1]: Entering directory `/mnt/hgfs/CrazyBoy/uClinux-dist/vendors'
    Makefile:19: “-include” 没有文件名
    make -C /mnt/hgfs/CrazyBoy/uClinux-dist/vendors///. dir_v=/mnt/hgfs/CrazyBoy/uClinux-dist/vendors///. -f /mnt/hgfs/CrazyBoy/uClinux-dist/vendors/vendors-common.mak vendor_hwselect
    make[2]: Entering directory `/mnt/hgfs/CrazyBoy/uClinux-dist/vendors'
    /mnt/hgfs/CrazyBoy/uClinux-dist/vendors///./Makefile:19: “-include” 没有文件名
    /mnt/hgfs/CrazyBoy/uClinux-dist/vendors/vendors-common.mak:9: *** 目标文件“romfs.post”含有 : 和 :: 两种条目。 停止。
    make[2]: Leaving directory `/mnt/hgfs/CrazyBoy/uClinux-dist/vendors'
    make[1]: *** [vendor_hwselect] 错误 2
    make[1]: Leaving directory `/mnt/hgfs/CrazyBoy/uClinux-dist/vendors'
    make: *** [vendor_hwselect] 错误 2
    [root@localhost uClinux-dist]#

     

    quartus 产生的ptf 在 /home/crazyboy/下,名字是sys.ptf

     

    能不能帮我分析一下看看什么问题

     

  • lee

    2007/12/18 17:00:25

    新手上路,有幸看到你的帖子,准备回去按照上面的步骤走下。。。

    先谢谢啦

  • lee

    2007/12/27 10:18:08

    我 想请教一个问题,我安装了nios2gcc.tar.bz2,修改了path,为什么在输入nios2-linux-uclibc-gcc -v,总是提示我:bash: nios2-linux-uclibc-gcc: command not found,这是什么原因?我是在windows系统下使用cygwin环境。希望高手给与指教。谢谢

  • duckfly

    2008/1/3 21:16:41

    没有试过在cygwin下用这个流程,好像用于cygwin的软件必须专门针对cygwin重新编译,估计这个包就算找到了,也不一定能执行 吧.windows下有个专门的安装包好像叫nios2linux,用于在niosii ide下使用uclinux.你可以到google上查查.同一台电脑上用uclinux,最好用虚拟机编译uclinux

  • zhshi

    2008/1/24 3:18:01

    按你的方法试了,但make romfs总是通不过,请高手指点

  • duckfly

    2008/1/25 22:03:07

    make romfs报错没有问题阿,继续往下走就可以了。

  • lee

    2008/2/25 10:37:42

    谢谢啦,我现在改用虚拟机了

  • l

    2008/2/29 14:57:58

    请问斑竹有没有用nios2linux-1.4做过?

  • duckfly

    2008/3/2 16:25:03

    你说的是windows环境下的nios2linux吗?曾经试着编译过,但是没有成功

  • taozi

    2008/3/19 15:45:09

       

    我也出现了这种情况,不知是什么原因?请高手指点一下了?

  • xiaohu

    2008/3/22 17:35:27

    非常感谢!

  • duckfly

    2008/3/30 0:21:08

    从你的截图来看,是没有安装gcc,你从安装光盘上把GCC装上即可。

  • taozi

    2008/4/3 9:55:20

    谢谢,装上gcc就好了

  • lee

    2008/4/7 16:27:28

    make的时候产生了错误,如下: Can't run cmd gzip -f -9 >> boa collect2 : ld returned 4 exit status make[4] : ***[boa] Error 1 make[4] : Leaving directory "/home/lee/uClinux-dist/user/boa/src" make[3] : ***[all] Error 2 make[3] : Leaving directory "/home/lee/uClinux-dist/user/boa" make[2] : ***[boa] Error 2 make[2] : Leaving directory "/home/lee/uClinux-dist/user" make[1] : ***[all] Error 2 make[1] : Leaving directory "/home/lee/uClinux-dist/user" make : ***[subdirs] Error 1 make了好几遍,都是这个问题过不去。 在 make romfs 的时候,总是出现: cp : stat boa 失败:没有那个文件或目录 麻烦您帮我指点下。。。

  • lee

    2008/4/7 16:32:29

    我晕,连发了3遍,windows居然提示我没有引导成功。。。

  • lee

    2008/4/7 16:36:19

    博主,偶这个不是有意连发4遍的,被windows欺骗了。。。你自己调整下哈。。。

  • sf2046

    2008/4/15 22:43:56

    那个Quartus II编译的程序有没有啊,能不能发个让我看看

    我的邮箱:,谢谢

  • sf2046

    2008/4/15 22:53:50

    不好意思,我也被windows欺骗了

  • hqu2007lyy

    2008/4/17 21:18:40

     为什么在make romfs与make都没错,但到sopc下载zImage文件时即"nios2-download -g zImage"总是出现" verify failed between........"

  • hqu2007lyy

    2008/4/17 21:20:24

     为什么在make romfs与make都没错,但到sopc下载zImage文件时即"nios2-download -g zImage"总是出现" verify failed between........"

  • hqu2007lyy

    2008/4/17 21:21:54

     为什么在make romfs与make都没错,但到sopc下载zImage文件时即"nios2-download -g zImage"总是出现" verify failed between........"

  • bojue

    2008/5/9 0:48:42

    我在解压 时就是说我的文件不是gzip文件,我忽略了可在后面make的时候就一直出错,我想是我的文件坏了,可我在网上搜了好几个都不行,版主能给我发一个吗?我的邮箱是:    我的QQ是20545625

    谢谢!!!~~~

  • duckfly

    2008/5/11 1:04:53

    Hello,bojue 不需要用gzip解压,直接用这个命令打补丁就行了: # 打补丁,这一步只能做一次,否则会引起错误 zcat ~/download/uClinux-dist-20070130-nios2-02.diff.gz | patch -p0

  • duckfly

    2008/5/11 1:08:25

    To : hqu2007lyy 我也曾遇到过这个问题,先检查一下QUARTUS软件版本是否最新,下载线不要太长,一般都是环境引起的...

  • sf2046

    2008/5/13 21:57:13

    博主能不能让我看一下你用quartus编译的程序,图看不清楚啊,我的qq:393317023,谢谢了

  • freedom

    2008/5/21 18:05:26

    版主你好,我按照你的方法尝试对内核进行编译,可是在打patch那里出现了一些问题。 在开始打补丁之后总是会提示 can't find file to patch at line **(数字来的,很多处,不连续) 我在网上其它的帖子里看到的说是patch和内核版本不同,可是我是按照你给的地址下载的两个文件,难道是地址上给的文件有一个更新过了? 我是个linux新手,希望版主帮忙看下,感激不尽,^_^

  • sf2046

    2008/5/29 9:44:22

    为什么下载完成后在Uncompressing Linux...的地方就挂起了

  • duckfly

    2008/5/30 23:51:23

    Re sf2046: 你试一下把NIOSII和QUARTUS更新到最新版本.我以前也遇到这个问题,发现是版本太低,可能早期的版本里面有bug吧.更新以后重新编译就过了.

  • sf2046

    2008/6/2 22:52:32

    quartus和nios2都是6.0的版本,还低吗?

  • gewanyong

    2008/6/8 15:41:05

    我按你的步骤,在MAKE时总是报错,在linux-2.6.x/scripts/mod/sumversion.c中有一个变量MAX_PATH未定 义,我把这个变量(宏)用100代替了,可以通过了,但到最后好像是链接阶段又报错,但如果忽略错误继续执行make linux image也可以产生zImage,只是在下载后在打印第一条消息时就没任何输出了.请博主指点一下.(我是在Fedora 9下编译的,用quartus II 7.2)

  • duckfly

    2008/6/14 0:28:52

    re sf2046: 我用的是QUARTUS 6.1的版本,没有问题.

  • duckfly

    2008/6/14 0:30:51

    Re gewanyong: 你在内核配置的时候是不是选择了一些模块?可以检查一下你选择的程序,把不需要的程序取消掉,先把最小系统跑起来.

  • gewanyong

    2008/6/15 0:17:57

    感谢博主的回答,我是完全按照你的步骤来的,用的是默认选项,没有选择其它的程序也没有另外配置内核,编译总是通不过,换了两三个内核版本,错误基本上都 一样。下面是make时输出的错误信息,请你帮我分析一下: queue.o read.o request.o response.o signals.o timestamp.o util.o -lcrypt request.o(.text+0x990): In function `process_header_end': /root/nios_linux/uClinux-dist/user/boa/src/request.c:560: warning: the use of `tmpnam' is dangerous, better use `mkstemp' boa.elf2flt(.text+0xd64): In function `auth_authorize': /root/nios_linux/uClinux-dist/user/boa/src/auth.c:358: undefined reference to `bzero' boa.elf2flt(.text+0x2584): In function `embedparse': /root/nios_linux/uClinux-dist/user/boa/src/config.c:325: undefined reference to `bzero' collect2: ld returned 1 exit status make[4]: *** [boa] 错误 1 make[4]: Leaving directory `/root/nios_linux/uClinux-dist/user/boa/src' make[3]: *** [all] 错误 2 make[3]: Leaving directory `/root/nios_linux/uClinux-dist/user/boa' make[2]: *** [boa] 错误 2 make[2]: Leaving directory `/root/nios_linux/uClinux-dist/user' make[1]: *** [all] 错误 2 make[1]: Leaving directory `/root/nios_linux/uClinux-dist/user' make: *** [subdirs] 错误 1

  • gewanyong

    2008/6/15 15:41:34

    我找到问题的原因了,是编译器找不到中 的几个函数:bzero,index,rindex,只要遇到调用这几个函数就会报错,我手动修改了几个调用这几个函数的源文件,用相同功能的函数 memset,strchr,strrchr代替,重新make就不再提示错误了,但调用这些函数的文件太多,手动修改太烦了,能不能有其它的方法解决? 比如说在Makefile中增加或修改变量,让编译器可以搜索到定义这几个函数的头文件。

  • gewanyong

    2008/6/18 11:51:44

    问题解决了,谢谢duckfly,我解决问题的频骤在这里写下了http://brother.abc.blog.163.com/blog /static/59394469200851811429862/

  • vivivicky

    2008/7/22 10:57:37

    我按你步骤做了,可是

  • vivivicky

    2008/7/22 11:00:53

    我按你步骤做了,可是 为什么在make romfs与make都没错,但到sopc下载zImage文件时即"nios2-download -g zImage"总是出现" verify failed between........"

  • vivivicky

    2008/7/22 11:03:27

    我按你步骤做了,可是 为什么在make romfs与make都没错,但到sopc下载zImage文件时即"nios2-download -g zImage"总是出现" verify failed between........"

  • fengliuleo

    2008/8/15 20:23:49

    博主,我在make vendor_hwselect SYSPTF=/home/leo/uClinux/System-files/sls_neek_bsp_hw_sopc.ptf时候出现了下面的错 误” make[3]: Entering directory `/home/leo/uClinux/uClinux-dist/linux-2.6.x' RUNNING hwselect ERROR: Could not open SYSTEM ptf file. make[3]: Leaving directory `/home/leo/uClinux/uClinux-dist/linux-2.6.x' make[2]: Leaving directory `/home/leo/uClinux/uClinux-dist/vendors/Altera/nios2nommu' make[1]: Leaving directory `/home/leo/uClinux/uClinux-dist/vendors' root@leo-desktop:/home/leo/uClinux/uClinux-dist# root@leo-desktop:/home/leo/uClinux/uClinux-dist# “ 烦请楼主帮忙

  • fengliuleo

    2008/8/15 20:24:35

    博主,我在make vendor_hwselect SYSPTF=/home/leo/uClinux/uc.ptf时候出现了下面的错误” make[3]: Entering directory `/home/leo/uClinux/uClinux-dist/linux-2.6.x' RUNNING hwselect ERROR: Could not open SYSTEM ptf file. make[3]: Leaving directory `/home/leo/uClinux/uClinux-dist/linux-2.6.x' make[2]: Leaving directory `/home/leo/uClinux/uClinux-dist/vendors/Altera/nios2nommu' make[1]: Leaving directory `/home/leo/uClinux/uClinux-dist/vendors' root@leo-desktop:/home/leo/uClinux/uClinux-dist# root@leo-desktop:/home/leo/uClinux/uClinux-dist# “ 烦请楼主帮忙

  • fengliuleo

    2008/8/15 20:24:56

    博主,我在make vendor_hwselect SYSPTF=/home/leo/uClinux/uc.ptf时候出现了下面的错误” make[3]: Entering directory `/home/leo/uClinux/uClinux-dist/linux-2.6.x' RUNNING hwselect ERROR: Could not open SYSTEM ptf file. make[3]: Leaving directory `/home/leo/uClinux/uClinux-dist/linux-2.6.x' 烦请楼主帮忙

  • fengliuleo

    2008/8/15 20:25:18

    博主,我在make vendor_hwselect SYSPTF=/home/leo/uClinux/uc.ptf时候出现了下面的错误” make[3]: Entering directory `/home/leo/uClinux/uClinux-dist/linux-2.6.x' RUNNING hwselect ERROR: Could not open SYSTEM ptf file. 烦请楼主帮忙

  • fengliuleo

    2008/8/15 20:25:42

    博主,我在make vendor_hwselect SYSPTF=/home/leo/uClinux/uc.ptf时候出现了下面的错误 make[3]: Entering directory `/home/leo/uClinux/uClinux-dist/linux-2.6.x' RUNNING hwselect ERROR: Could not open SYSTEM ptf file. 烦请楼主帮忙

  • fengliuleo

    2008/8/15 20:35:10

    博主,我在make vendor_hwselect SYSPTF=/home/leo/uClinux/uc.ptf时候出现了下面的错误RUNNING hwselect ERROR: Could not open SYSTEM ptf file.烦请楼主帮忙

  • duckfly

    2008/8/17 15:15:31

    re fengliuleo: 你看看你的ptf文件是不是放在/home/leo/uClinux/uc.ptf,还要看以下这个文件的权限是不是可读写的。

  • weiwgml

    2009/7/17 13:19:37

    不错,值得参考

阅读(3313) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~