在32上移植uclinux_stm32移植uclinux - CSDN
  • 一篇博文讲到了先移植基于stm32f407的u-boot,本文讲到的是最难的移植stm32f407的内核,这个内核源代码我也是网上找到了,看介绍是国外大神所修改而成的,真的万分感谢这位大神可怜,所以也要看到网上的资源其实...

           上一篇博文讲到了先移植基于stm32f407的u-boot,本文讲到的是最难的移植stm32f407的内核,这个内核源代码我也是在网上找到了,看介绍是国外大神所修改而成的,真的万分感谢这位大神可怜,所以也要看到网上的资源其实很多,要善于挖掘,善于搜寻。

           内核代码是我无意中down下来的,我一得到代码的时候开始并没有对在stm32f407上跑uClinux有太多的信心,一是网上还没有在stm32f407跑uClinux的资料(至少我没找到过)网上都对在stm32上跑uClinux都是唱衰的态度,的确stm32跑起uClinux系统,资源是有些匮乏,而stm32f407内部flash只有1M的空间,其中u-boot占了128K,那么内核就存储在0x08020000处,剩下900k的空间使用,还有我的板子还有外部2M 的SRAM,但更要命的是得到的代码是基于stm32f429的uClinux,很多人都在stm32f429上成功运行了,但是却从没在stm32f407有过,但我已经没有退路了,项目需要、领导要求,只能硬着头皮瞎改,其实对于stm32f103改成stm32f429已经好很多了,最起码stm32f429的架构和stm32f407的架构大致相同(内部存储和时钟和gpio等略有不同),于是就按照自己手上的板子来改,期间遇到了不少的问题,也想过放弃,不过好歹坚持了下来,因为着急压力山大所以看了不少书,查了很多资料也学到了很多东西对u-boot和内核代码加深了理解,

           特别感谢的是jserv老师,我走投无路之下给他发了几封邮件,他回答了我两个极为重要的问题,建议把外部的512K换成至少2M的SRAM,不然内核就真的跑不动了,跑到一半就kernel panic….

           然后就是针对stm32f407来修改内核代码,stm32f429用的是串口3,我用的是串口1,改!时钟不对,改!储存地址不同,改!stm32f429不单是有外部的SRAM,空间8M还有NOR flash,财大气粗,资源随便用,不像我的stm32f407只有外部2M的SRAM(领导说硬件就那样,节约成本,无语。。),幸好uClinux代码是用XIP的方式来运行的,就是代码段放在内部flash中就地执行,数据段和bss段其它段就放在sram上运行,这样算算,空间还是足够的。

           其间还出现这样的问题:


    dq的uClinux移植

           卡了我一个星期,当时我就百思不得其解,在创建高速缓存那里就出现内核错误运行不下去了,仔细比对了stm32f103的uClinux源代码,也没发现什么错误,一个多星期没有进展,内核恐慌我也恐慌了,幸好领导知道情况后也不催促我,而是买了一本《ARM Linux内核源代码分析》给我,叫我好好研读,解决问题,于是就看里面构建kmem cache那一篇,linux内核源码过于复杂,看得我头都大了,后来想想这不是办法啊,是不是又是硬件问题?因为原先用的是512k的sram升级到2M,公司的硬件工程师又重新改版了,于是我又用电烙铁把stm32芯片,sram芯片,和他们之间的上拉电阻,又重新焊了一遍,一上电就正常运行到下一步了,唉~之前移植u-boot的sram驱动也是硬件坑我的啊,真不敢相信我不懂点硬件的话会坑到我什么时候。。。

           接着瞎捣鼓着捣鼓着,前后花了将近两个月,就捣鼓出来了成那样:


    dq的uClinux移植

    - 想想还真是运气好。。。


           接下来遇到的问题,应该是少了根文件系统,这个uClinux代码原来是配有根文件系统的,是romfs,但是存储空间不够了。

           uClinux的根文件系统未能挂载起来,因为系统原来配置的根文件系统是romfs,是基于stm32f429的,stm32f429的内部flash存储空间有2M,romfs占用空间为300多kB,这样存放显然是充足的,但是对于stm32f407来说,它的内部flash存储空间为1M,这样存放的话,存储空间是不够的(u-boot占用空间0x08000000-0x08020000,内核占用空间约为0x08020000-0x080BB000,约620多KB,那么只有剩下约250多KB的空间供根文件系统存放),所以根据这个情况,我想是另外搭建占用内存空间更小的initramfs作为uClinux的根文件系统来挂载。

           想想万里长征就剩最后一步了,于是开始恶补根文件系统的知识,待续…..

    展开全文
  • STM32F10x大容量产品上移植uClinux,官方英文版文档
  • 着里边包括uclinux在STM32 上移植的中文步骤和英文步骤。英文的就是st官方网站有的。。
  • 黑金移植uclinux教程

    2020-07-24 23:31:26
    黑金移植uclinux教程,轻松学会如何移植uclinux到NiosII
  • uClinux的分析与移植

    2020-04-27 23:33:59
    uClinux的分析与移植 uClinux的分析与移植 uClinux的分析与移植 uClinux的分析与移植
  • STM32 ucLinux环境搭建

    2015-12-14 19:18:41
    ucLinux用到的资源https://github.com/jserv/stm32f429-linux-builderhttps://github.com/ntfreak/openocd1、usblib安装./configure --disable-udevmakesudo make install2、OPEN OCD 安装sudo apt-get ...
    ucLinux用到的资源
    https://github.com/jserv/stm32f429-linux-builder
    https://github.com/ntfreak/openocd

    1、usblib安装
    ./configure --disable-udev
    make
    sudo make install

    2、OPEN OCD 安装
    sudo apt-get install libtool autoconf automake texinfo
    ./configure --prefix=/usr/local --enable-jlink --enable-ulink --enable-stlink
    echo -e "all:\ninstall:" > doc/Makefile
    make
    sudo make install

    3、genromfs-0.5.2安装
    make
    sudo make install


    4、arm-2010q1安装
    gedit ~/.bashrc
    加 export PATH=/home/build/tools/arm-2010q1/bin:$PATH
    解压,设置环境变量

    5、ST-Link/V2不能挂载到VirtualBox的解决办法
    VirtualBox从ST-Link/V2读到的序列号是乱码,在虚拟机设置中将ST-Link/V2添加到USB设备筛选器中,并编辑该筛选器将其序列号清空,就可以解决这个问题。

    6、添加usb访问权限
    sudo gedit /etc/udev/rules.d/50-myusb.rules
    增加 SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", GROUP="build", MODE="0666"

    展开全文
  • DE2上移植uClinux系统

    2012-12-23 16:37:03
    目的:由于项目需求,需要DE2上移植uClinux系统,然后移植OpenCV,利用OpenCV中的函数处理视频图像 环境平台:Quartus 32-bit Version12.0 +Nios II Software Build Tools for Eclipse + VMware Workstation 9.0 ...

    目的:由于项目需求,需要在DE2上移植uClinux系统,然后移植OpenCV,利用OpenCV中的函数处理视频图像

    环境平台:Quartus 32-bit Version12.0 +Nios II Software Build Tools for Eclipse + VMware Workstation 9.0 + Ubuntu 11.0

    目前只实现了uClinux的编译,其他部分随进展发布。


    1 建立运行uClinux的最小Nios II 系统

    最小系统至少包括Nios II Processor,SDRAM Controller,Flash Memory Interface(CPI),Interval Timer和用于通信的JTAG UART。注意要设置Nios II处理器的Reset Vector 和 Exception Vector。点击Generate,生成Nios II 系统,其中.ptf文件用于编译uClinux内核,.sopcinfo文件用于Nios II IDE创建工程时生成Nios II系统的硬件抽象。

    系统生成后,可以用Nios II IDE编写程序测试一下系统是否可用,然后再进行下一步。

    Nios II IDE新建项目时,会生成两个文件夹,含_bsp的文件夹是Nios II IDE根据SOPC Build定制的Nios II系统生成的。其中system.h包含了系统各组件信息,如名称,基地址,中断号等,且在工程编译连接成功后才能访问。Nios II 系统存储器与外设是统一的,而对于外设的访问都是通过访问外设寄存器达到目的的。

    编译时需要设置Nios II 系统的属性,否者会因为内存不足而出错,因而需要优化内存大小。

    右键项目 - Nios II - BSP Editer - Main - Settings:不勾选enable_plus_plus,勾选enable_small_c_library。enable_reduced_device_drivers 和 enable_clean_exit任选。Generate后重新编译。

    编译后即可在线调试,我在调试时总是会遇到“Download ELF Process failed"的问题,网上一般说是相位延迟,管脚连线的原因,但我暂时还未解决奋斗,容后再说啊。

    这部分主要参考真OO无双的博客如何自己用SOPC Builder建立在DE2上跑uC/OS-II的Nios II系统


    需要准备的文件:Nios2gcc.tar.gz2(支持Nios II处理器的uClinux编译器);uClinux-dist-20070130.tar.gz,uCliux-dist-20070130-nios2-02.diff.gz(内核源码及其补丁文件);.ptf文件(SOPC生成的Nios II系统配置文件)。


    2 在linux环境中配置交叉编译开发环境

    解压Nios2gcc.tar.gz2:通过su命令获取root权限,然后tar -jxvf Nios2gcc.tar.gz2 -C / 。这样工具就安装到了/opt/nios2/bin中了。

    添加环境变量以便在命令行中使用:PATH=$PATH:/opt/nios2/bin。如果在命令行中输入,那么这个设置在重启SHELL后会丢失。可以再./bash_profile或者./bashre(对于Ubuntu),该文件在用户名目录下,就是打开SHELL时的目录下,该文件是隐藏的,需要用ls -a才能看见。奇怪的是Ubuntu中俩个文件都有,我在./bash_profile设置时,用nios2-linux-gcc -v 命令检查是否安装时出错。所以直接在./bashrc的最后添加PATH=$PATH:/opt/nios2/bin,才成功。估计是我对linux的命令行了解太少了,实力不济啊。


    3 编译uClinux(普通用户权限即可)

    (1)解压uClinux-dist-20070130.tar.gz:tar -zxvf uClinux-dist-20070130.tar.gz;获得uClinux-dist文件

    (2)打补丁:把补丁包拷贝到uClinux-dist文件下,gunzip -c uClinux-dist-20070130-nios2-02.diff.gz | patch -p0

    (3)定制内核:输入内核配置命令 make menuconfig,根据实际选择。

    (4)配置硬件:make vendor_hwselect SYSPTF=SOPC生成的.ptf文件,输入命令前要将.ptf文件拷贝到/uClinux-dist/linux-2.6.x文件夹(根据实际)。如不想拷贝,等号右边需要./ptf文件的完全路径。输入命令后会出现ptf文件描述的Nios II系统,包括CPU,存储器,选择对应的CPU及共内核运行的存储器,CPU只有一个,存储器没特殊情况都选SDRAM。

    (5)生成uClinux镜像:依次输入make romfs、make、make linux image,没有出错的哈,在../uClinux-dist/linux-2.6.x/arch/niosnommu/boot/下就会生成zImage镜像。

    常见问题:

    (1)make romfs时:error:nios2-elf-gcc command not found 和 cp:cannot stat 'boa' : No such file or directory。解决办法:make menuconfig时(None)libc Version。但我这样设置后,仍然有此这个问题。可以忽略,似乎不影响后续操作。

    (2)make时出错,再make一次,就没有错误了(网上有部分人是这样的)。但我make多次后,仍有scripts/mod/sumversion.c : error:‘ PATH_MAX ‘ undeclared...。解决办法是:找到sumversion.c文件,在定义全局变量那部分代码添加一行:#define PATH_MAX 128(随意定)。然后我就成功生产了zImage镜像。


    4 在NCS中验证uClinux是否在DE2上运行(Windows环境,需要连接DE2板)

    (1)启动Nios II Command Shell,下载.sof文件:nios2-configure-sof Quartus生生的sof文件。NCS打开时进入的目录是Altera/12.0/nios2eds/,可以将sof文件和zImage镜像拷贝的此目录下。

    (2)下载zImage到SDRAM中:nios2-download -g zImage。

    (3)启动uClinux:nios2-terminal。


    在线调试部分(第4步)还未成功,所以我还没有验证我的zImage是否能真正运行,只是看“Nios II系统上运行uClinuc“有关内容已经一星期了,先总结一下。有错的话,我再改正。还有是网上有关内容都是2010年左右的,大都用的是2007的uClinux,我想在运行成功后,编译最新的uClinux试试。晚上还看到有人移植OpenCV(只是opencv1.1,很古老的版本了)到Nios II上运行的uClinux,我也被老师要求将一些图像处理的内容在FPGA上实现,可能需要移植高版本的OpenCV,个人感觉成功的可能性不大,但还是全力以赴。也希望看到的人有有关方面研究的不吝赐教啊,希望我早日完成。EDA实验没好好学,真是悔不当初啊!




    经过一周的折磨,我终于决定不自己用SOPC创建Nios II的最小系统了,而是用Demo里符合最小系统要求的DE2_NET程序,因为自己创建时会牵涉到引脚配置,连线等问题,功力不深厚是很难解决的。另外“Download ELF Process failed"确实是相位的问题,需要添加一个锁相环。


    最后终于我也成功了啊啊哈哈哈哈哈哈哈哈哈哈哈哈:





    但是这实际上只是在单片机(Nios II系统)上装了一个uClinux系统而已,还什么都不能做的,哇咔咔,现在的设想是在uClinux编写的程序同样编译到zImage镜像中,另外这个系统能不能正常调用DE2上的硬件还是个很大的问题哦,奋斗


    经过一周的努力,终于可以再移植uClinux的Nios 2 系统上运行OpenCV程序了,啊啊啊啊哈。特别感谢Tyreal Han的工作,主要参考他的OpenCV在基于FPGA的嵌入式系统中的移植研究

    编译OpenCV:

    (1)      解压源文件:tar –zxvf opencv-1.1pre1.tar.gz

    (2)      配置编译信息:./configure --host=nios2-linux --without-gtk --without-carbon--without-quicktime --without-1394libs --without-ffmpeg --without-python--without-swig –without-v4l --enable-static --disable-shared --disable-appsCXX=nios2-linux-g++ --prefix=/home/dh/sopc/opencv-1.1.0/uccv

    -enable-static 和 –disable-shared:启用静态链接,禁用动态链接,即只生成静态链接库。这是考虑到嵌入式系统对内核和程序的要求设置的。如果不设置disable-shared会出现编译错误。配置后结果:

    (3)      编译,输入:make。

    如配置编译信息时,不添加-disable-shared参数会出现如下错误:

    (4)      输入命令make install。生成的静态文件库在lib文件夹。


    编写OpenCV程序:

    (1)      写代码,不能调用highgui.h中的函数,保存为hello.cpp。代码另附

    (2)      编译源文件:nios2-linux-g++ -c hello.c pphello.o –I/home/dh/sopc/opencv-1.1.0/uccv/include/opencv(头文件引用位置)

    (3)      连接生成可执行程序:nios2-linux-g++ -o hello hello.o –L/home/dh/sopc/opencv-1.1.0/uccv/lib–lcv –lcvaux –cxcore –lml –lpthread –elf2flt

    (4)      将生成的可执行文件复制到romfs,重新生成内核镜像。

    (5)      下载镜像,执行程序。

    分别以间接(函数调用)和直接方式访问CvMat和IplImage中的数据:

    另附测试代码:

    OpenCV程序hello.cpp
    
    /*
     * DisplayImage.cpp
     *
     *  Created on: Dec 16, 2012
     *      Author: dh
     */
    
    #include <cv.h>
    //#include <highgui.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(int argc,char** argv)
    {
    	printf("Image Processing with OpenCV 1.1.0...\n");
    	printf("CvMat Test :\n");
    	double a[] = {1,2,3,4,5,6,7,8,9,10,11,12};
    	CvMat m = cvMat(3,4,CV_64FC1,a);
    	for(int i = 0;i < 3;i++)
    	{
    		for(int j = 0;j < 4;j++)
    		{
    			printf("m[i][j] = %f\t",cvmGet(&m,i,j));
    
    		}
    		printf("\n");
    	}
    
    	printf("Get CvMat in another way :\n");
    	for(int i = 0;i < 3;i++)
    	{
    		for(int j = 0;j < 4;j++)
    		{
    			printf("m[i][j] = %f\t",m.data.db[i*m.cols+j]);
    
    		}
    		printf("\n");
    	}
    
    	printf("Gray Image Test :\n");
    	IplImage *GrayImg = cvCreateImage(cvSize(10,10),IPL_DEPTH_8U,1);
    	CvScalar s;
    	for(int i = 0;i < GrayImg->height;i++)
    		for(int j = 0;j< GrayImg->width;j++)
    		{
    			s = cvGet2D(GrayImg,i,j);
    			s.val[0] = 0;
    			cvSet2D(GrayImg,i,j,s);
    		}
    	for(int i = 0;i < GrayImg->height/2;i++)
    		for(int j = 0;j< GrayImg->width;j++)
    		{
    			((uchar*)(GrayImg->imageData + i * GrayImg->widthStep))[j] = 255;
    		}
    
    	printf("Tht first line data of the Gray Image :\n");
    	for(int i = 0;i < GrayImg->width;i++)
    	{
    		printf("m[0][i] = %f; \t %d\n",cvGet2D(GrayImg,0,i).val[0],
    				((uchar*)(GrayImg->imageData))[i]);
    	}
    
    	//cvNamedWindow("GrayImage",1);
    	//cvShowImage("GrayImage",GrayImg);
    	//cvWaitKey(0);
    
    	printf("RGB Image Test :\n");
    	IplImage *RgbImg = cvCreateImage(cvSize(10,10),IPL_DEPTH_32F,3);
    	for(int i = 0;i < RgbImg->height;i++)
    		for(int j = 0;j< RgbImg->width;j++)
    		{
    			s = cvGet2D(RgbImg,i,j);
    			s.val[0] = 111;
    			s.val[1] = 0;
    			s.val[2] = 0;
    			cvSet2D(RgbImg,i,j,s);
    		}
    	for(int i = 0;i < RgbImg->height/2;i++)
    		for(int j = 0;j< RgbImg->width;j++)
    		{
    			((float*)(RgbImg->imageData + i * RgbImg->widthStep))[j * RgbImg->nChannels + 0] = 0;
    			((float*)(RgbImg->imageData + i * RgbImg->widthStep))[j * RgbImg->nChannels + 1] = 111;
    			((float*)(RgbImg->imageData + i * RgbImg->widthStep))[j * RgbImg->nChannels + 2] = 0;
    		}
    
    	for(int i = 0;i <RgbImg->height;i++)
    	{
    		printf("RgbImg[%d][0] :\n",i);
    		s = cvGet2D(RgbImg,i,0);
    		printf("B = %f;\t G = %f;\t R = %f\n",s.val[0],s.val[1],s.val[2]);
    		printf("B = %f;\t G = %f;\t R = %f\n",
    ((float*)(RgbImg->imageData + i * RgbImg->widthStep))[0],
    					((float*)(RgbImg->imageData + i * RgbImg->widthStep))[1],
    					((float*)(RgbImg->imageData + i * RgbImg->widthStep))[2]);
    					
    	}
    	//cvNamedWindow("RgbImage",1);
    	//cvShowImage("RgbImage",RgbImg);
    	//cvWaitKey(0);
    
    	//cvNamedWindow("BMP Image",1);
    	//cvShowImage("BMP Image",m);
    	//waitKey(0);
    	//cvReleaseImage(&m);
    	return 0;
    }


    移植uClinux,编译OpenCV完成后,需要操作DE2板上的硬件,主要是摄像头,LCD等外设,然后基于OpenCV 进行图像处理。

    预计要进行内核裁剪,编写底层硬件的驱动了。不知道有没有简单的方法。


    还有想在Nios II Software Build Tools for Eclipse中调用编译好的OpenCV函数,总是出现错误,感觉这样会简单一些。

    有没有做过的高人呢,跪求求求求求求求求求求。。。。。。。。。。。。。。。。。。


    2012-12-23:

    在搭建好基于Nios II uClinux系统的OpenCV平台后,我开始测试OpenCV 1.1.0中常用的数据结构函数,为接下来要进行的图像拼接等其他处理做好准备。

    However, However 突然有一天在make uclinux源码时出现错误,大概和boa有关,错误形式"undefined reference to "bzero" "index“......”——百思不得其解啊 无奈我重装了系统,按照上面的步骤重新做一遍,成功生成了镜像。然后我在引用OpenCV 中的函数,然后打算用nios2-linux-g++命令编译源文件,突然发现我安装的交叉编译环境中没有这个命令(我用的nios2gcc.tar.bz2),然后我直接重新安装了nios2gcc-20080203.tar.bz2,果然里面有nios2-linux-g++ 的命令,并顺利编译,在板子上成功运行。


    此时 我猜想是检查编译环境与uClinux-dist不匹配,果然,我删除原来的uClinux-dist文件夹,重新解压一个,按上面步骤重新制作镜像(注:此时的交叉编译环境是nio2gcc20080203的),果然有出现了上面的问题。由此我确定确实是交叉编译环境与uClinux(20070130)不匹配的原因。


    好了,原因发现后,问题就好解决了。只要保证二者匹配就好了。有由于我现在只在uClinux-dist-20070130的源码包基础上make成功过,只能用nios2gcc.tar.bz2交叉编译环境。SO 我只需要用nios2-linux-gcc编译我的源程序就行了,BUT 这样做竟然出错了,而且是一大堆错误,惨不忍睹。无奈我安装nios2gcc-20080203的交叉编译环境编译成功了。


    难道真是鱼和熊掌不可兼得——我既要要make成功生成镜像,又要nios2-linux-g++编译调用OpenCV函数的程序 ——但能make成功的交叉编译环境不含nios2-linux-g++命令。


    观察发现两个交叉编译环境文件结构基本相同——都是bin,include,lib那几个文件,我只需要让他们合并就好了 。

    所以我在Windows环境下,解压二者,然后合并,注意是将nios2gcc.tar.bz2覆盖nios2gcc-20080203.tar.bz2中的文件,然后复制到linux环境的opt文件夹下——make nios2-linux-g++这样都能成功了。


    我都有点佩服自己了啊哈哈哈哈哈哈哈哈哈哈哈哈哈浩


    我要做的是图像拼接等处理,需要读取图片,就直接用了Tyreal Han共享的bmpDecoder.cpp和bmpDecoder.h程序,但这个程序有错误,编译的时候重视提示cvLoadImage()函数找不到。原来是在bmpDecoder.h文件中没有对这个函数声明,只要在.h文件中添加生命就行了,然后在CPP文件中去掉默认参数(只需要在生命时,制定默认参数就行了)。


    另外 nios2-linux编译环境不支持#ragma pack(push)等命令,就直接注释掉了,后面的程序只用到这个结构体的大小,程序运行表明这个结构大小总是14,就直接用宏定义代替了,当然直接用 14做参数也可。

    #pragma pack(push) 						// 保存对齐状态
    #pragma pack(2)							// 设定为2字节对齐
    typedef struct tagBITMAPFILEHEADER
    {
    	WORD bfType; 						// 位图文件类型,必须为BM(0-1字节)
    	DWORD bfSize; 						// 位图文件大小,以字节为单位(2-5字节)
    	WORD bfReserved1; 					// 位图文件保留字,必须为0(6-7字节)
    	WORD bfReserved2; 					// 位图文件保留字,必须为0(8-9字节)
    	DWORD bfOffBits; 					// 位图数据的起始位置,以相对于位图(10-13字节),文件头的偏移量,以字节为单位
    } BITMAPFILEHEADER;
    #pragma pack(pop)


    我还发现了一个更简单的编译链接程序的方法,不必先生成目标文件,直接生成可执行程序

    nios2-linux-g++ -Wall -o bmpShow bmpShow.cpp -I/home/dh/Sopc/uccv/include/opencv -L/home/dh/Sopc/uccv/lib -lcv -lcvaux -lcxcore -lml -lpthread -elf2flt

    读图程序成功实现,添加到镜像中,运行结果如图:


    读图代码:

    #include <cv.h>
    //#include <highgui.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define BMPFILEHEADERSIZE 14
    
    typedef unsigned long DWORD;
    typedef unsigned short int WORD;
    typedef long LONG;
    typedef unsigned char BYTE;
    
    typedef struct tagBITMAPINFOHEADER
    {
    	DWORD biSize; 						// 本结构所占用的字节数(14-17字节)
    	LONG biWidth; 						// 位图的宽度,以像素为单位(18-21字节)
    	LONG biHeight; 						// 位图的高度,以像素为单位(22-25字节)
    	WORD biPlanes; 						// 目标设备的级别,必须为1(26-27字节)
    	WORD biBitCount;					// 每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一(26-29字节)
    	DWORD biCompression; 					// 位图压缩类型,必须是0(不压缩),1(BI_RLE8)或(BI_RLE4)(30-33字节)
    	DWORD biSizeImage; 					// 位图的大小,以字节为单位(34-37字节)
    	LONG biXPelsPerMeter; 					// 位图水平分辨率,每米像素数(38-41字节)
    	LONG biYPelsPerMeter; 					// 位图垂直分辨率,每米像素数(42-45字节)
    	DWORD biClrUsed;					// 位图实际使用大颜色表中的颜色数(46-49字节)
    	DWORD biClrImportant;					// 位图显示过程中重要的颜色数(50-53字节)
    } BITMAPINFOHEADER;
    
    typedef struct tagRGBQUAD
    {
    	BYTE rgbBlue;						// 蓝色的亮度(0-255)
    	BYTE rgbGreen; 						// 绿色
    	BYTE rgbRed; 						// 红色
    	BYTE rgbReserved;					// 保留,必须为0
    } RGBQUAD;	
    
    
    
    int main(int argc,char **argv)
    {
    	
    	//cvShowImage("Bitmap",img);
    	IplImage* cvLoadBmpImage(char *sFileName);
    	IplImage *img = cvLoadBmpImage(argv[1]);
    	printf("The Basic Informations of the Bitmap image:\n");
    	printf("width = %d\t,height = %d\t,widthStep = %d\n",img->width,img->height,img->widthStep);
    	printf("total size = %d\t,depth = %d\t,nChannels = %d\n",img->nSize,img->depth,img->nChannels);
    	switch(img->origin)
    	{
    	case 0:		printf("The Bmp is Top-Left origin !\n");break;
    	case 1: 	printf("The Bmp is Bottom-Left origin,that is Windows bitmaps style.\n");break;
    	default:	printf("Can't identify its origin style");
    	}
    	return 0;
    }
    
    IplImage* cvLoadBmpImage(char *sFileName)
    {
    	FILE *fp = fopen(sFileName,"rb");
    	if(fp == NULL)
    	{
    		printf("Open BMP File failed !\n");
    		return NULL;
    	}
    	else
    	{
    		printf("Open BMP File Success !\n");
    	}
    	
    	// 跳过位图头文件
    	fseek(fp,  BMPFILEHEADERSIZE,0);
    	BITMAPINFOHEADER head;
    	int width,height;
    	int biBitCount,lineByte;
    	
    	// 定义位图信息头结构变量,读取位图信息头进内存,存放在head中
    	fread(&head, sizeof(BITMAPINFOHEADER), 1,fp);
    	width = head.biWidth;
    	height = head.biHeight;
    	printf("Width = %d\t,Height = %d\n",width,height);
    
    	// 计算图像每行所占的 字节数(必须是4大倍数)
    	biBitCount = head.biBitCount;
    	lineByte = (width * biBitCount/8)/4*4;
    	printf("biBitCount = %d\t,lineByte = %d\n",biBitCount,lineByte);
    
    	RGBQUAD *pColorTable = NULL;
    	unsigned char* blocks = NULL;
    	printf("Size of the Structure RGBQUAD:\t%d\n",sizeof(RGBQUAD));
    	if(biBitCount == 8)
    	{
    		// 申请颜色表所需要的空间,读颜色表进内存
    		pColorTable = (RGBQUAD *)malloc(256*sizeof(RGBQUAD));
    		fread(pColorTable,sizeof(RGBQUAD),256,fp);
    		
    		
    	}
    	else
    	{
    		printf("biBitCount != 8, Can't Create Color Table Now !\n");
    	}
    	
    	blocks = (unsigned char *)malloc(lineByte*height*sizeof(char));
    	if(blocks == NULL)
    	{
    		printf("Malloc Blocks Failed !\n");
    		return NULL;
    	}
    	else
    	{	printf("Malloc Blocks Success !\n");	}
    	
    	fread(blocks,1,lineByte*height,fp);
    	printf("Fread Blocks Success !\n");
    
    	
    	free(pColorTable);
    	free(blocks);
    	printf("Free pColorTable and Blocks Success !\n");
    
    	IplImage *img = NULL;
    	img = cvCreateImageHeader(cvSize(width,height),8,3);
    	printf("Create Image Header Success !\n");
    	cvSetData(img,blocks,lineByte*3);
    	printf("Set Image Data Success !\n");
    	img->origin = IPL_ORIGIN_BL;
    	
    	return img;
    }
    
    


    Altera官网上的uClinux-dist已经到2010版本了,我尝试过还没有成功,但这才是大道,正途。

    我这里走的都是歪门邪道,一切只为实现,哎呀,显得自己好邪恶啊。

    等我吧官网上的2010的编译成功后在来和大家分享吧。


    OpenCV 1.1.0 貌似还不能满足我的需要啊,主要还是不想自己编写底层代码。

    所以我会尝试着配置下OpenCV 2.0,然后要试着编写摄像头,VGA/LCD的底层驱动,主要是为了获取图像和显示图像的


    末日已过,诸神保佑我吧








    其他有用的资料链接:

    真OO无双——(原创)如何在DE2上安装uClinux作业系统(台湾的同胞)

    TYTRAL HAN——UCLINUX在NIOS II平台上的移植

    百度空间中D-Zone关于uClinux的部分,提供了make是错误的解决办法

    duckfly的博客——duckfly:在niosii上跑uClinux

    MyFPGA论坛:liyongjie的帖子:DE2_114 uClinux移植

    小鲁的博客:(原创)uClinux在Nios II平台上的移植(基于NIOS II的SOPC软硬件系统)(DE2)








    展开全文
  • 介绍了嵌入式操作系统相关知识后,以Microblaze处理器进行uclinux移植为例,详细地展示了整个实验的开发流程。
  • LPC1788上移植uclinux

    2014-03-23 12:31:28
    lpc1788 uclinux移植开发包开放 以前一直想搞下ulcinuxlpc1788上面的板子,但是一直没有搞定,还自己投了点钱,最终还是没有出来,现在也没什么精力去搞了,所以放出来,给大家学习!当然大家也可以去维护! ...

    源码链接!http://www.lpclinux.com/Downloads/WebHome#LPC313xDownloads


    lpc1788 uclinux移植开发包开放

    以前一直想搞下ulcinux在lpc1788上面的板子,但是一直没有搞定,还自己投了点钱,最终还是没有出来,现在也没什么精力去搞了,所以放出来,给大家学习!当然大家也可以去维护!
    下载地址:
    git下载工具:
    git clone https://bitbucket.org/microcreat/cortexm_uclinux.git

    已经放到github上面了
    https://github.com/microcreat/cortexm_uclinux.git
    git clone https://github.com/microcreat/cortexm_uclinux.git
    注:
    此代码是可以运行起来的,norflash+sdram,如果坛友要用的话,要根据自己的板子进行对于的修改!
    我只有验证自己的板子,并能正常运行起来!

    在这里特别感谢:
    http://www.emcraft.com 的工程师 开源了软件移植包!



    来配合这个代码!
    到时候原理图和pcb都会开源!
    一起放到github上面去!希望有人能一起维护!

    目前好像github出了一个windows下面也能使用的工具:
    地址是:
    http://windows.github.com/
    使用方法我已经写个简单的文档到我的博客了!

    github新建立的硬件的地址:
    https://github.com/microcreathardware/cortexm_hardware.git




























    展开全文
  • uClinux移植概述

    2008-02-20 16:20:00
    1.建立开发环境 作为uClinux系统的移植和开发的主机最好...进行uClinux移植和开发之前,我们需要建立系统的交叉编译环境,因为做为主机我们使用的是IA32体系结构的处理器,而开发板我们才用的是ARM体系结构的处理

    1.建立开发环境
         作为uClinux系统的移植和开发的主机最好使用Linux操作系统,如果选择Windows平台作为开发平台则需要Cygwin软件包的支持。在这里我们选用的开发平台是Fedora Core 2,内核版本为2.4.x。在进行uClinux的移植和开发之前,我们需要建立系统的交叉编译环境,因为做为主机我们使用的是IA32体系结构的处理器,而开发板我们才用的是ARM体系结构的处理器。ARM平台的交叉编译工具可以从uClinux的官方网站获得(www.uclinux.org)。在这里我们采用的是arm-elf-tools-20030314.sh,该文件是一个自解压文件,可以直接执行程序安装。
         #./arm-elf-tools-20030314.sh
         如果不能执行该文件,则需要修改一下文件的可执行属性
         #chmod 755 arm-elf-tools-20030314.sh
         然后再执行程序的安装。可执行文件按会被默认安装在/usr/local/bin目录下。

    2.编译uClinux内核
         uClinux是一款支持无MMU单元的嵌入式操作系统,我们可以从其官方网站获取最新版本的内核文件(www.uclinux.org)。
         我们将下载的uClinux内核文件放入我们的工作目录(/home/jelly/kernel/),然后使用tar工具解压内核文件。
         $cd /home/jelly/kernel/
         $tar xvzf uClinux-dist-200xxxxx.tar.gz
         经过一段时间的解压后将在工作目录下会生成uClinux-dist文件夹。
         在编译内核之前我们首先要做的是配置内核,常用的配置方式有如下几种:
         make xconfig - X Windows图形界面的配置选项
         make menuconfig - Console图形界面的配置选项
         make config - 命令接口的配置选项
         在这里需要注意的是uClinux是不支持loadable modules的,因此应该取消对该模块的支持。

         $cd uClinux-dist/
         $make menuconfig

         配置你需要的选项,比如处理器类型,开发板类型,内核版本等。配置好之后选择Saving and Exiting保存退出。

         编译uClinux内核的常用选项有:
         make distclean
         该命令将清除以前编译时候产生的文件,包括.config文件,所有目标文件以及内核映象文件。

         make clean
         该命令与make distclean相似,也是清除之前编译时候产生的文件

         make dep 这个只需要在第一次编译的时候执行,为了是建立文件之间的依赖关系,make命令会根据这个依赖关系来确定哪些文件需要重新编译,哪些文件可以跳过。

         make lib_only
         编译uClibc库

         make user_only
         编译用户制定的应用程序,比如初始化进程init,bash,以及集成了很多常用工具的嵌入式软件包busybox。

         make romfs
         uClinux经常才用romfs(只读文件系统)来作为系统的根文件系统,所以首先需要将之前编译的很多应用程序以uClinux所需要的目录格式存放起来。比如将可执行文件放在bin目录下,将配置文件放在etc目录下。该命令执行后会在uClinux-dist目录下生成一个romfs的目录,并且将文件系统所需要的文件组织起来,以便之后生成fomfs的映象文件。

         make image
         生成romfs文件系统的映象文件,以及linux的映象文件。该linux的映象文件是elf格式的,是不能直接下载到开发板上执行的(里面包含了大量的调试信息,elf文件执行前的环境建立信息等内容。该文件可以使用arm-elf-objcopy工具来生成可以直接在RAM中执行的binary文件)。

         make linux
         执行该命令之后将生成linux内核文件。

         make zImage
         建立经过gzip算法压缩过的内核映象文件,通常zImage产生的内核映象文件无法超过512KB大小。

         make modules
         建立内核模块

         注:有些uClinux版本提供了更多的编译方式,比如make linux.bin。关于其他的编译方式可以参看内核源码目录里的Makefile文件。

         在介绍完常用的几个内核编译命令后,我们可以使用如下的几个命令来建立我们所需要的内核以及文件系统:
         make dep
         make clean
         make all

         这样在uClinux-dist/linux-2.x.x目录下会生成linux, System.map,在uClinux-dist/images/目录下会生成image.bin, linux.bin, image.ram, image.rom, romfs.img, linux.text, linux.data等文件。如果你编译过程中没有出现错误,但是没有我说的这些文件,你可以参看Makefile文件了解更多的东西。
         其中image.ram是直接可以下载到ram中执行的文件。在调试阶段我们就可以使用该文件。
         image.rom是一个zImage文件,可以自解压的内核,该文件需要少写到FLASH里,而不能直接放入RAM中执行。

    3.uClinux内核建立过程
         建立内核首先是建立单独的内核模块和内核子系统,一旦这些建立好了之后将通过连接文件将多个文件连接在一起。该连接文件一般在arch/$(ARCH)/$(PLATFORM)/$(BOARD)/$(MODEL).ld。连接器使用该连接文件生成linux文件:
         LD -T (MODUEL).ld crt0_$(MODUEL).o [objs] -o linux
         连接文件定义了内核如何组织内存段。

         System.map文件是通过linux文件产生的,用于调试使用。通过该文件可以方便的确定函数的位置。该文件是通过如下方式产生:
         NM $(LINUX) | grep -v '/(compiled/)/|/(/.o$$/)/|/(a/)' | sort > System.map

         linux.data文件是包含内核所有数据段的代码,是通过移除linux文件中所有只读段和其他不需要的段得到的,该文件可以通过arm-elf-objcopy来产生,如:
         OBJCOPY -O binary --remove-section=.romvec --remove-section=.text/
                           --remove-section=.ramvec --remove-section=.bss/
                           --remove-section.eram linux linux.data

         linux.text文件包含了所有文本段代码,是去除数据段后的代码
         OBJCOPY -O binary --remove-section=.ramvec --remove-section=.bss/
                           --remove-section-.data --remove-section=.eram/
                           --set-section-flags=.romvec=CONTENTS,ALLOC,LOAD,READONLY,CODE linux linux.text

         linux.bin文件,是可以实际载入内存中执行的文件,他的建立是通过linux.text和linux.data两个文件连接得到的,如:
         cat linux.text linux.data > linux.bin
         该文件只是内核,并没有包含文件系统。我们可以使用如下方式将文件系统和内核文件连接起来生成image.bin映象文件:
         cat linux.bin romfs.img > image.bin

    4.手工生成ROMFS文件系统
         建立ROMFS文件系统之前应该手工建立文件系统树,例如通常ROMFS包含如下目录:
         /bin /dev /etc /lib /proc /sbin /tmp /usr /var

         然后我们可以将交叉编译好的应用程序放入/bin目录中,之后使用genromfs工具来建立文件系统的映象,如:
         genromfs -v -V "ROM Disk" -f romfs.img -d romfs > romfs.map

         最后,可以与内核文件连接在一起,然后烧入Flash中。
         cat linux.bin romfs.img > image.bin

    5.参考文档
         《构建嵌入式LINUX系统》 O'REILLY
         《Linux How To》
         《Linux Documentation》

     
    展开全文
  • 移植uClinux

    2011-05-13 22:09:00
    在移植uClinux之前要做一些准备工作,比如调试器是否可以正常工作,交叉编译环境的建立等。然后,再开始启动代码的移植和uClinux的移植。 ①要保证硬件和JTAG接口正常以及正确的跳线。看调试器是否可以...
  • 移植enc28j60笔记 enc28j60移植第一步初始化接口 1,spi接口 2,外部中断接口 平台设备注册 arch/arm/mach-stm32/spi.c 注册平台设备 #if defined(CONFIG_STM32_SPI4) platform_set_drvdata(&spi_stm32_dev4, ...
  •  FPGA上移植最新版本的uClinux,本实验主要是DE2进行。  历经一个多月的时间,终于FPGA上移植uClinux,从开学到现在,从找中文博客(无双学长的博客),由于版本的问题,加上uClinux更新的比较快,编译...
  • 一个人忙来忙去,也习惯了... 经过不断的摸索,终于在uclinux上成功移植了第一个程序,虽说是个小程序,但是它体现了整个uclinux程序移植的套路!!  1.linux系统下,建立一个*.c文件,(我是用gedit来编的,自己
  • 最近比较忙,针对前面的留言说有怎么download u-boot、uclinux到stm32,我翻了翻以前记录下的笔记,特意贴上来,其实有些步骤我都已经忘记了。。。 一、搭建嵌入式linux开发环境 1. 准备一台Linux系统(Fedora,...
  • uClinux操作系统移植

    2008-07-05 17:11:00
    (复旦大学电子工程系沈沙,欢迎转载,转载时请保留此行作者信息)l ... uClinux简介uClinux这个英文单词中u表示Micro,小的意思,C表示Control,控制的意思,所以uClinux就是Micro-Control-Linux,字面的理解就是
  • 移植uClinux2.4到IX425DP

    2013-08-23 22:51:47
    移植uClinux2.4到IX425DP   目录 移植uClinux2.4到IXP425DP. 1 实验环境... 1 配置,编译,安装相关文件... 1 1. 解压snapgear-3.5.0.tar.gz. 2 2. 安装arm-linux-tools-20051123. 2 3. 准备snapgear补丁文件... 3 ...
  • Pro-crack-ha-7.8sp2,然后进行安装二、嵌入式uClinux的实现1.uClinux内核编译(1)安装交叉编译工具安装交叉编译器arm-elf-tools-20030314.sh,这是一个可以自动安装的脚本文件,可以相关网站下载。/home/...
  • 上午一直忙着整protel Dxp sp2,... 下午和晚上又进行了一次uclinux内核的移植,这一次用的是2004的内核,用的是他们提供的补丁,经过编译后,下栽到板子里,可以运行,但还是有问题的:/usr下本来是可以下栽文件的,从新编
  • uClinux移植和分析(1)

    2007-01-20 13:29:00
    简介: 前一段时间,曾先后移植uClinux-2.0.x和uClinux-2.4.x的内核,我的移植基本是从零做起,linux并没有支持该目标机的代码,所以这个移植工作基本是新增加对一种目标机的支持。 工作过程中,我学到了...
1 2 3 4 5 ... 20
收藏数 3,874
精华内容 1,549
关键字:

在32上移植uclinux