资源预览内容
第1页 / 共27页
第2页 / 共27页
第3页 / 共27页
第4页 / 共27页
第5页 / 共27页
第6页 / 共27页
第7页 / 共27页
第8页 / 共27页
第9页 / 共27页
第10页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
嵌入式系统设计嵌入式系统设计VIVI建立软件开发环境n1、安装n2、安装Jtag工具链n3、安装开发调试工具:ADS、GDBEvaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.SC2410的基础实验二C语言编写的LED亮程序实验n汇编语言可读性太差,现在开始实验二,用C语言来实现同样的功能nSC2410的基础实验二C语言编写的LED亮程序实验Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.SC2410的基础实验二C语言编写的LED亮程序实验n实验源码分析nC语言程序执行的第一条指令,并不在main函数中。当我们生成一个C程序的可执行文件时,编译器总是在我们的代码前加一段固定的代码crt0.o,它是编译器自带的一个文件。此段代码设置C程序的堆栈等,然后调用main函数。n在我们的裸板上,编译器自带的这段代码无法执行,所以我们得自己写一个。ncrt0.s代码: n1 .text n2 .global _start n3 _start: n4 ldr sp, =1024*4 设置堆栈,注意:不能大于4k nand flash中的代码在复位后会 移到内部ram中,它只有4k n5 bl main 调用C程序中的main函数 n6 halt_loop: n7 b halt_loop Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.SC2410的基础实验二C语言编写的LED亮程序实验n现在,我们可以很容易写出控制LED的程序了,led_on_c.c代码如下: n1 #define GPBCON (*(volatile unsigned long *)0x56000010) n2 #define GPBDAT (*(volatile unsigned long *)0x56000014) n3 int main() n4 n5 GPBCON = 0x00004000; /设置GPB7为输出口 n6 GPBDAT = 0x00000000; /令GPB7输出0 n7 return 0; n8 Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.SC2410的基础实验二C语言编写的LED亮程序实验n我们来看看Makefile: n1 led_on_c : crt0.s led_on_c.c n2 arm-linux-gcc -g -c -o crt0.o crt0.s n3 arm-linux-gcc -g -c -o led_on_c.o led_on_c.c n4 arm-linux-ld -Ttext 0x0000000 -g crt0.o led_on_c.o -o led_on_c_tmp.o n5 arm-linux-objcopy -O binary -S led_on_c_tmp.o led_on_c n6 clean: n7 rm -f led_on_c n8 rm -f led_on_c.o n9 rm -f led_on_c_tmp.o n10 rm -f crt0.o n第2、 3行分别对源程序crt0.s、 led_on_c.c进行预编译,第4行将预编译得到的结果连接起来,第5行把连接得到的ELF格式可执行文件led_on_c_tmp.o转换成二进n制格式文件led_on_c。 n可以开始上机实验了:Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.SC2410的基础实验二C语言编写的LED亮程序实验n实验步骤: na进入LED_ON_C目录后,执行如下命令生成可执行文件led_on_c: make nb执行如下命令将led_on_c写入nand flash: ni. Jflash-s3c2410 led_on_c /t=5 nii.当出现如下提示时,输入0并回车: nK9S1208 NAND Flash JTAG Programmer Ver 0.0 n0:K9S1208 Program 1:K9S1208 Pr BlkPage 2: Exit nSelect the function to test : niii.当出现如下提示时,输入0并回车: nInput target block number: niv.当出现与步骤ii相同的提示时,输入2并回车 nc按开发板上reset键后可看见LED1被点亮了Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.arm-linux-ld 命令的理解n下arm-linux-ld连接命令的使用narm-linux-ld -Ttext 0x00000000 crt0.o led_on_c.o -o led_on_c_tmp.o 意思:-o选项设置输出文件的名字为led_on_c_tmp.o;“-Ttext 0x00000000”设置代码段的起始地址为0x00000000;这条指令的作用就是将crt0.o和led_on_c.o连接成led_on_c_mp.o可执行文件,此可执行文件的代码段起始地址为0x00000000。n大多机器上电时是从地址0开始运行的,但是从地址0运行程序在性能方面总有很多限制,所以一般在开始的时候,使用与位置无关的指令将程序本身复制到它的连接地址处,然后使用向pc寄存器赋值的方法跳到连接地址开始的内存上去执行剩下的代码。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.arm-linux-ld 命令的理解narm-linux-ld命令中选项“-Ttext”也可以使用选项“-Tfilexxx”来代替,在文件filexxx中,我们可以写出更复杂的参数来使用arm-linux-ld命令n源代码为head.s、init.c和main.c。head.s调用init.cn中的函数来关WATCH DOG、初始化SDRAM、初始化NAND Flash,然后将main.c中的代码从NAND Flash地址4096开始处复制到SDRAM中,最后,跳到main.c中的main函数继续执行。代码本身没什么难度,与前面程序最大的差别就是“连接脚本”的引入:在arm-linux-ld命令中,选项“-Ttext”可以使用选项“-Tfilexxx”来代替。在本实验中,使用“-Tnand.lds”。nand.lds内容如下: n1 SECTIONS n2 firtst 0x00000000 : head.o init.o n3 second 0x30000000 : AT(4096) main.o n4 n如果想进一步了解连接脚本如何编写,请参考Using ld The GNU linkerEvaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.n(1)阶段1:arch/s3c2410/head.S 完成如下几件事情: n1、关WATCH DOG:上电后,WATCH DOG默认是开着的 n2、禁止所有中断:vivi中没用到中断(不过这段代码实在多余,上电后中断默认是关闭的) n3、初始化系统时钟:启动MPLL,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz,“CPU bus mode”改为“Asynchronous bus mode”。请参考实验十一:CLOCK n4、初始化内存控制寄存器:还记得那13个寄存器吗Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.n5、检查是否从掉电模式唤醒,若是,则调用WakeupStart函数进行处理这是一段没用上的代码,vivi不可能进入掉电模式 n6、点亮所有LED n7、初始化UART0: na设置GPIO,选择UART0使用的引脚 nb初始化UART0,设置工作方式(不使用FIFO)、波特率115200 8N1、无流控等,Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.n8、将vivi所有代码(包括阶段1和阶段2)从nand flash复制到SDRAM中: na设置nand flash控制寄存器 nb设置堆栈指针调用C函数时必须先设置堆栈 nc设置即将调用的函数nand_read_ll的参数:r0=目的地址(SDRAM的地址),r1=源地址(nand flash的地址),r2=复制的长度(以字节为单位) nd调用nand_read_ll进行复制 ne进行一些检查工作:上电后nand flash最开始的4K代码被自动复制到一个称为“Steppingstone”的内部RAM中(地址为0x00000000-0x00001000);在执行nand_read_ll之后,这4K代码同样被复制到SDRAM中(地址为0x33f00000-0x33f01000)。比较这两处的4K代码,如果不同则表示出错 n9、跳到bootloader的阶段2运行就是调用init/main.c中的main函数: na重新设置堆栈 nb设置main函数的参数 nc调用main函数 Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.结束语结束语谢谢大家聆听!谢谢大家聆听!27
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号