嵌入式课程设计报告完整版.docx

上传人:b****7 文档编号:10098996 上传时间:2023-02-08 格式:DOCX 页数:11 大小:68.96KB
下载 相关 举报
嵌入式课程设计报告完整版.docx_第1页
第1页 / 共11页
嵌入式课程设计报告完整版.docx_第2页
第2页 / 共11页
嵌入式课程设计报告完整版.docx_第3页
第3页 / 共11页
嵌入式课程设计报告完整版.docx_第4页
第4页 / 共11页
嵌入式课程设计报告完整版.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

嵌入式课程设计报告完整版.docx

《嵌入式课程设计报告完整版.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计报告完整版.docx(11页珍藏版)》请在冰豆网上搜索。

嵌入式课程设计报告完整版.docx

嵌入式课程设计报告完整版

目录

前言2

一、U-Boot分析3

1、引导程序U-Boot第一阶段分析3

2、引导过程4

3、程序流程图8

二、程序设计8

三、心得体会9

 

前言

ARM嵌入式处理器已被广泛应用于消费电子厂品、无线通信、网络通信和工业控制等领域。

在嵌入式操作系统中,Linux、Vxworks、WinCE三足鼎立,其中Linux由于其开源性、稳定性、安全性、可裁剪性更是一支独秀。

在嵌入式系统中,如何实现在ARM平台下Linux操作系统的引导工作是嵌入式技术开发的重要环节。

BootLoader就是在操作系统内核运行之前运行的一段小程序。

通过这段小程序,我们可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。

在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。

比如在一个基于ARM7TDMIcore的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。

 

一、U-Boot分析

嵌入式Linux系统中常用的Bootloader引导程序有U-Boot,redboot,blob和vivii等,其中U-Boot遵循GPL条款的开放源码项目,功能最为强大,U-Boot对PowerPC系列处理器支持最丰富,同时还支持MIPS,x86,ARM,XScale等诸多常用系列的处理器;U-Boot引导程序分为Stage1和Stage2量大部分,Stage1中主要包括设备初始化、中断设置、时间设置和储存器初始化等工作,并且采用汇编语言实现,而一些通用功能大多采用C语言实现,放在Stage2中。

1、引导程序U-Boot第一阶段分析

Stage1的代码在CPU/arm920t/start.s中定义,它包括从系统上电后在0x00000000地址开始执行的部分。

这部分代码系统启动后,从NADAFLASH自动加载到SDRAM中,它包括S3C2410A中寄存器的初始化和将U-Boot的Stage2代码从FLASH拷贝到SDRAM。

Stage2的起始地址是在Stage1代码中指定的,被复制到SDRAM后,就从第一阶段跳到这个入口地址,开始执行剩余部分代码;其系统工作图如下:

2、引导过程

U-Boot启动内核的过程可以分成为两个阶段,但在本次课程设计中我们只对其的第一个阶段代码进行分析。

第一阶段的功能主要包括硬件设备初始化,加载U-Boot第二阶段代码到RAM空间,设置好栈,跳转到第二阶段代码入口。

第一阶段对应的文件是cpu/arm920t/start.S和board/samsung/mini2440

/lowlevel_init.S,当系统上电后第一个链接的是cpu/arm920t/start.o,进而执行其代码。

1)设置异常向量,从而保证系统上电后出现异常时,CPU根据异常号在异常向量表中找到对应的异常向量,然后执行异常向量处的跳转指令,CPU就跳转到对应的异常处理程序执行;

2)设置CPU模式为SVC模式并将中断禁止位和快中断禁止位置一,从而屏蔽了IRQ和FIQ中断;

mrsr0,cpsr

bicr0,r0,#0x1f

orrr0,r0,#0xd3

msrcpsr,r0

3)设置控制寄存器地址

#ifdefined(CONFIG_S3C2410A)

#definepWTCON0x15300000

#defineINTMSK0x14400008/*Interupt-Controllerbaseaddresses*/

#defineCLKDIVN0x14800014/*clockdivisorregister*/

#elifdefined(CONFIG_S3C2410A)

#definepWTCON0x53000000

#defineINTMSK0x4A000008/*Interupt-Controllerbaseaddresses*/

#defineINTSUBMSK0x4A00001C

#defineCLKDIVN0x4C000014/*clockdivisorregister*/

#endif

4)设置关闭看门狗:

LDRR0,=Pwtcon

MOVR1,#0x0

STRR1,[R0]

以上代码向看门狗控制寄存器写入0,关闭看门狗。

否则在U-Boot启动过程中,CPU将不断重启。

5)设置主中断屏蔽寄存器,禁止所以中断,INTMSK是主中断屏蔽寄存器,每一位对应SRCPND(中断源引脚寄存器)中的一位,表明SRCPND相应位代表的中断请求是否被CPU所处理。

movr1,#0xffffffff

ldrr0,=INTMSK

strr1,[r0]//关闭所有

6)设置MPLLCON,UPLLCON,CLKDIVN,CPU上电几毫秒后,晶振输出稳定,FCLK=Fin(晶振频率),CPU开始执行指令。

但实际上,FCLK可以高于Fin,为了提高系统时钟,需要用软件来启用PLL。

这就需要设置CLKDIVN,MPLLCON,UPLLCON这3个寄存器。

#ifdefined(CONFIG_S3C2410A)||defined(CONFIG_S3C2410)

ldrr0,=pWTCON

movr1,#0x0

strr1,[r0]//关闭watchdog

movr1,#0xffffffff

ldrr0,=INTMSK

strr1,[r0]//关闭所有的中断

#ifdefined(CONFIG_S3C2410A)

ldrr1,=0x3ff

ldrr0,=INTSUBMSK

strr1,[r0]//关闭所有的中断

#endif

/*FCLK:

HCLK:

PCLK=1:

2:

4*/

/*defaultFCLKis120MHz!

*/

//设置HCLK为FCLK/2,PCLK为FCLK/4,FCLK为CPU产生clock,HCLK为AHB总线上的设备产生//clock,PCLK为APB总线上的设备产生clock,

7)初始化RAM控制寄存器,在程序代码中lowlevel_init是来完成内存初始化的工作,由于内存初始化是依赖于开发板的,因此lowlevel_init的代码一般放在board下面相应的目录中(lowlevel_init在board/samsung/mini2440/lowlevel_init.S中定义)。

U-Boot在NANDFlash启动时,lowlevel_init.o将自动被读取到CPU内部4KB的内部RAM中。

因此第137~146行的代码将从CPU内部RAM中复制寄存器的值到相应的寄存器中。

对于U-Boot在NORFlash启动的情况,由于U-Boot连接时确定的地址是U-Boot在内存中的地址,而此时U-Boot还在NORFlash中,因此还需要在NORFlash中读取数据到RAM中。

由于NORFlash的开始地址是0,而U-Boot的加载到内存的起始地址是TEXT_BASE,SMRDATA标号在Flash的地址就是SMRDATA-TEXT_BASE。

综上所述,lowlevel_init的作用就是将SMRDATA开始的13个值复制给开始地址[BWSCON]的13个寄存器,从而完成了存储控制器的设置。

8)复制U-Boot第二阶段代码到RAM,由于cpu/arm920t/start.S原来的代码是只支持从NORFlash启动的,所以要修改现在U-Boot的NORFlash和NANDFlash上就能启动了。

而U-Boot的启动可能是在NANDFlash启动或NORFlash启动,所以在启动程序中要专门一段程序来对启动方式进行判定。

无论是从NORFlash还是从NANDFlash启动,地址0处为U-Boot的第一条指令“bstart_code”,对于从NANDFlash启动的情况,其开始4KB的代码会被自动复制到CPU内部4K内存中,因此可以通过直接赋值的方法来修改;对于从NORFlash启动的情况,NORFlash的开始地址即为0,必须通过一定的命令序列才能向NORFlash中写数据,所以可以根据这点差别来分辨是从NANDFlash还是NORFlash启动:

向地址0写入一个数据,然后读出来,如果发现写入失败的就是NORFlash,否则就是NANDFlash。

9)设置堆栈

stack_setup:

ldrr0,_TEXT_BASE

subr0,r0,#CFG_MALLOC_LEN

subr0,r0,#CFG_GBL_DATA_SIZE

#ifdefCONFIG_USE_IRQ

subr0,r0,#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)

#endif

subsp,r0,#12

只要将sp指针指向一段没有被使用的内存就完成栈的设置了。

根据上面的代码可以知道U-Boot内存使用情况了,如下图所示:

11)清除BSS段,初始值为0,无初始值的全局变量,静态变量将自动被放在BSS段。

应该将这些变量的初始值赋为0,否则这些变量的初始值将是一个随机的值,若有些程序直接使用这些没有初始化的变量将引起未知的后果。

clear_bss:

ldrr0,_bss_start

ldrr1,_bss_end

movr2,#0x00000000

clbss_l:

strr2,[r0]

addr0,r0,#4

cmpr0,r1

bleclbss_l

12)跳转到第二阶段代码入口,当程序执行到ldrpc,_start_armboot跳转指令时跳转到第二阶段代码入口start_armboot处。

ldrpc,_start_armboot//跳转到_start_armboot处执行。

_start_armboot:

.wordstart_armboot

 

3、程序流程图

U-Boot第一阶段启动程序流程图如下:

 

二、程序设计

按照实验设计要求自主设计一个简单的引导程序,要求设置中断向量表、堆栈初始化和准备C环境,最后跳到C程序main函数入口点。

程序如下所示:

.globl_start

_start:

breset//复位向量

ldrpc,_undefined_instruction

ldrpc,_software_interrupt

ldrpc,_prefetch_abort

ldrpc,_data_abort

ldrpc,_not_used

ldrpc,_irq//中断向量

ldrpc,_fiq//快速中断向量

_undefined_instruction:

.wordundefined_instruction

_software_interrupt:

.wordsoftware_interrupt

_prefetch_abort:

.wordprefetch_abort

_data_abort:

.worddata_abort

_not_used:

.wordnot_used

_irq:

.wordirq

_fiq:

.wordfiq

stack_setup:

ldrr0,_TEXT_BASE

ubr0,r0,#CFG_MALLOC_LEN

subr0,r0,#CFG_GBL_DATA_SIZE

#ifdefCONFIG_USE_IRQ

subr0,r0,#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)

#endif

subsp,r0,#12

BCmain

Cmain

EXPORTDMAIN

AREADMAIN,CONE,READONLY

IMPOPTCmain

END

Main()

{

inta=1;

while(a);

}

三、心得体会

通过此次课程设计,使我更加扎实的掌握了有关嵌入式技术方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。

实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。

过而能改,善莫大焉。

在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。

最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。

这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。

在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!

课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。

同时,设计让我感触很深。

使我对抽象的理论有了具体的认识。

通过这次课程设计,我掌握了常用元件的识别和测试;熟悉了常用仪器、仪表;了解了电路的连线方法;以及如何提高电路的性能等等,掌握了焊接的方法和技术,通过查询资料,也了解了收音机的构造及原理。

我认为,在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。

更重要的是,在实验课上,我们学会了很多学习的方法。

而这是日后最实用的,真的是受益匪浅。

要面对社会的挑战,只有不断的学习、实践,再学习、再实践。

这对于我们的将来也有很大的帮助。

以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。

就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。

回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。

实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。

果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。

此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1