嵌入式实验心得体会
  学期开始,我们开始学习《嵌入式系统及应用》,由于初次接触嵌入式系统,感觉蛮难的,所以收获不是很大,很多的概念都比较模糊,等到学期完毕开始做嵌入式课程设计时,真是茫然无从下手,自从拿到设计主题后,我就像热锅上的蚂蚁,一个字“急”。最后实在没有方法,逼着自己去学习,查资料,总算对嵌入式有了浅层理解。
  嵌入式系统本身是一个相对模糊的定义,一个手持的MP3和一个PC104的微型工业控制计算机都可以认为是嵌入式系统。总体来说,嵌入式系统是“用于控制,监视或者辅助操作机器和设备的装备”。
  一个典型的桌面Linux系统包括3个主要的软件层---linux内核、C库和应用程序代码。内核是唯一可以完全控制硬件的层,内核驱动程序代表应用程序与硬件之间进展会话。内核之上是C库,负责把POSIX API转换为内核可以识别的形式,然后调用内核,从应用程序向内核传递参数。应用程序依靠驱动内核来完成特定的任务。
  在了解了根底知识之后,我开始进展上机操作,当然,其中遇到很多的难题,很多东西都是
第一次接触,又没有别人在旁边指导操作,完全凭借自己去摸索练习。其中的困难可想而知。然而坚持就是胜利,牙一咬眼一闭坚持做下去,而通过本次实验,我感觉收获还是蛮多的。可能我对于嵌入式的知识学习的还是不太多,但是这之外的东西收获颇丰。
  它让我学会了如何通过自己的努力去认知一个新事物,更重要的是端正自己的学习态度,只有真正下功夫去学习,才能有收获,正所谓“一份耕耘,一份收获。”没有付出,何谈回报呢?再者,通过本次实验,我也学会了如何去分析问题,如何出自己设计中的缺乏,继而去排除解决问题,这就是一个自我学习的过程。当我们通过实验去学习理论知识时,自己动手得出的结论,不仅能加深我们对嵌入式的理解,更能加深我们对此的记忆。
  当然,在这其中,我也发现自己的许多缺乏之处,由于学期伊始我没有好好学习,才落到如此地步,这也可以说是一个教训吧!我相信在以后的学习工作中,我一定会端正自己的学习态度,一丝不苟的去对待每一件事。只有做好足够的准备,才能事半功倍!
  Uboot是1999年由德国DENX软件工程中心的Wolfgang Denk发起的,全称Universal Bootloader。具有如下特点:
  ★支持多种硬件构架:包括ARM、x86、PPC、MIPS、m68k、NIOS、Blackfin
  ★支持多种操作系统:包括Linux、VxWorks、NETBSD、QNX、RTEMS、ARTOS、LynxOS
  ★支持多达216种以上的开发板
socket编程实验的心得体会
  ★开放源代码,遵循GPL条款
  ★易于移植、调试
  1、进一步了解Uboot的启动流程
  2、进一步分析Uboot的启动过程
  3、实现Uboot的移植
  分析Uboot的启动流程,实现Uboot的移植
  1、Uboot的启动流程、分析
  U-Boot的启动过程可以分成3个阶段。首先在Flash中运行汇编程序,将Flash中的启动代码部
分复制到SDRAM中,同时创造环境准备运行C程序;然后在SDRAM中执行,对硬件进展初始化;最后设置内核参数的标记列表,复制镜像文件,进入内核的入口函数。
  1) 程序首先在Flash中运行CPU入口函数/cpu/arm920t/start.s。详细工作包括:设置异常的入口地址和异常处理函数;配置PLLCON存放器,确定系统的主频;屏蔽看门狗和中断;初始化I/O存放器;关闭MMU功能;初始化存储器空间,设置刷新频率;将U-Boot的内容复制到SDRAM中;设置堆栈的大小,ldr pc, startarmboot。board/yqliu2410中config.mk文件(TEXTBASE = 0x31F00000)用于设置程序编译连接的起始地址,在程序中要特别注意与地址相关指令的使用。当程序在Flash中运行时,执行程序跳转时必须要使用跳转指令,而不能使用绝对地址的跳转(即直接对PC操作)。如果使用绝对地址,那么,程序的取指是相对于当前PC位置向前或者向后的32MB空间内,而不会跳入SDRAM中。
  2) 程序跳转到SDRAM中执行/libarm/board.c中的startarmboot()函数。该
  函数将完成如下工作:
  *设置通用端口;设置处理器类型;设置启动参数地址;
  * envinit:设置环境变量,初始化环境;
  * initbaudrate:设置串口的波特率;
  * serialinit:设置串口的工作方式;
  * flashinit:设置ID号、每个分页的起始地址等信息,将信息送到相应的构造体中;
  * draminit:设置SDRAM的起始地址和大小;
  * envrelocate:将环境变量的地址送到全局变量构造体中;
  * enableinterrupts:开启中断;
  * mainloop:该函数主要用于设置延时等待,从而确定目标板是进入下载操作模式还是下载镜像文件启动内核。在设定的延时时间范围内,目标板将在串口等待输入命令,当目标板接到正确的命令后,系统进入下载模式。在延时时间到达后,如果没有接收到相关命令系统将自动进入装载模式。
  3) 装载模式下系统将执行dobootmlinux()函数,0x30008000是内核在SDRAM中的起始地址;0x30800000是ramdisk在SDRAM中的起始地址;0x40000是内核在Flash中的位置,0x100000是数据块的大小;0x140000是ramdisk在FLASH中的位置,0x440000是数据块的大小。系统调用memcpy()函数将内核从flash和ramdisk复制到SDRAM中,详细如下:
  memcpy((void *)0x30008000, (void *)0x40000, 0x100000);//复制数据块
  memcpy((void *)0x30800000, (void *)0x140000, 0x440000);//复制数据块
  通常,将内核参数传递给Linux操作系统有两种方法:采用struct paramstruct
  构造体或标记列表。
  一个合法的标记列表开始于ATAGCORE,完毕于ATAGNONE。ATAGCORE可以为
  空,一个空的ATAGCORE的size字段设为“2”(0x00000002)。ATAGNONE 的size
  字段必须设为“0”。标记列表可以有任意多的标记(tag)。在嵌入式Linux系统中,
  通常由U-Boot设置的启动参数有:ATAGCORE、ATAGMEM、ATAGCMDLINE、ATAGRAMDISK、ATAGINITRD等。
  在本系统中,传递参数时分别调用了以下tag:
  setupstarttag(bd); //标记列表开始
  setupmemorytags(bd); //设置内存的起始位置和大小
  setupmandlinetag(bd, mandline); /*Linux内核在启动时可以命令
  行参数的形式来接收信息,利用这一点可以向内核提供那些内核不能检测的硬件参
  数信息,或者重载(override)内核检测到的信息。
  setupramdisktag(bd); //表示内核解压后ramdisk的大小
  setupinitrdtag(bd, initrdstart, initrdend); //设置ramdisk的大小
  和物理起始地址
  setupendtag(bd); //标记列表完毕
  其中bdt *bd = gd->bd是指向bdt 构造体的指针,在该构造体中存放了关于
  开发板配置的根本信息。
  系统采用以下代码来进入内核函数:
  theKernel = (void (*)(int, int))ntohl(hdr->ihep);
  hdr是imageheadert类型的构造体,hdr->ihep指向内核的第一条指令地址,
  即Linux操作系统下的/kernel/arch/arm/boot/pressed/head.S汇编程序。theKernel()函数调用应该不会返回,如果该调用返回,那么说明出错。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。