您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 嵌入式系统设计VIVI
嵌入式系统设计-VIVI的补充李春杰建立软件开发环境1、安装2、安装Jtag工具链3、安装开发调试工具:ADS、GDBSC2410的基础对2410各部分的组成及基本工作方式了解,是进行2410系统设计的基础SC2410的基础实验一汇编语言编写的LED亮程序实验实验步骤:把PC并口和开发板JTAG接口连起来、确保插上“BOOTSEL”跳线、上电进入LED_ON目录后,执行如下命令生成可执行文件led_on:make执行命令将led_on写入nandflashi.Jflash-s3c2410led_on/t=5ii.当出现如下提示时,输入0并回车:iii.当出现如下提示时,输入0并回车:iv.当再次出现与步骤ii相同的提示时,输入2并回车按开发板上reset键后可看见LED1被点亮了实验步骤总地来说分3类:编写源程序、编译/连接程序、烧写代码。SC2410的基础实验一汇编语言编写的LED亮程序实验先看看源程序led_on.s:1.text2.global_start3_start:4LDRR0,=0x56000010@R0设为GPBCON寄存器。此寄存器@用于选择端口B各引脚的功能:@是输出、是输入、还是其他5MOVR1,#0x000040006STRR1,[R0]@设置GPB7为输出口7LDRR0,=0x56000014@R0设为GPBDAT寄存器。此寄存器@用于读/写端口B各引脚的数据8MOVR1,#0x00000000@此值改为0x00000080,@可让LED1熄灭9STRR1,[R0]@GPB7输出0,LED1点亮10MAIN_LOOP:11BMAIN_LOOPSC2410的基础实验一汇编语言编写的LED亮程序实验对于程序中用到的寄存器GPBCON、GPBDATGPBCON用于选择PORTB的11根引脚的功能:输出、输入还是其他特殊功能。每根引脚用2位来设置:00表示输入、01表示输出、10表示特殊功能、11保留不用。LED1-3的引脚是GPB7-GPB10,使用GPBCON中位[12:13]、[13:14]、[15:16]、[17:18]来进行功能设置。GPBDAT用来读/写引脚:GPB0对应位0、GPB1对应位1,诸如此类。当引脚设为输出时,写入0或1可使相应引脚输出低电平或高电平。SC2410的基础实验一汇编语言编写的LED亮程序实验实验步骤二的说明实验步骤b中,指令“make”的作用就是编译、连接led_on.s源程序。Makefile的内容如下:1led_on:led_on.s2arm-linux-gcc-g-c-oled_on.oled_on.s3arm-linux-ld-Ttext0x0000000-gled_on.o-oled_on_tmp.o4arm-linux-objcopy-Obinary-Sled_on_tmp.oled_on5clean:6rm-fled_on7rm-fled_on.o8rm-fled_on_tmp.omake指令比较第1行中文件led_on和文件led_on.s的时间,如果led_on的时间比led_on.s的时间旧(led_on未生成时,此条件默认成立),则执行第2、3、4行的指令更新led_on。您也可以不用指令make,而直接一条一条地执行2、3、4行的指令——但是这样多累啊。第2行的指令是预编译,第3行是连接,第4行是把ELF格式的可执行文件led_on_tmp.o转换成二进制格式文件led_on。执行“makeclean”时强制执行6、7、8行的删除命令。SC2410的基础实验二C语言编写的LED亮程序实验汇编语言可读性太差,现在开始实验二,用C语言来实现同样的功能SC2410的基础实验二C语言编写的LED亮程序实验SC2410的基础实验二C语言编写的LED亮程序实验实验源码分析C语言程序执行的第一条指令,并不在main函数中。当我们生成一个C程序的可执行文件时,编译器总是在我们的代码前加一段固定的代码——crt0.o,它是编译器自带的一个文件。此段代码设置C程序的堆栈等,然后调用main函数。在我们的裸板上,编译器自带的这段代码无法执行,所以我们得自己写一个。crt0.s代码:1.text2.global_start3_start:4ldrsp,=1024*4@设置堆栈,注意:不能大于4k@nandflash中的代码在复位后会@移到内部ram中,它只有4k5blmain@调用C程序中的main函数6halt_loop:7bhalt_loopSC2410的基础实验二C语言编写的LED亮程序实验现在,我们可以很容易写出控制LED的程序了,led_on_c.c代码如下:1#defineGPBCON(*(volatileunsignedlong*)0x56000010)2#defineGPBDAT(*(volatileunsignedlong*)0x56000014)3intmain()4{5GPBCON=0x00004000;//设置GPB7为输出口6GPBDAT=0x00000000;//令GPB7输出07return0;8}SC2410的基础实验二C语言编写的LED亮程序实验我们来看看Makefile:1led_on_c:crt0.sled_on_c.c2arm-linux-gcc-g-c-ocrt0.ocrt0.s3arm-linux-gcc-g-c-oled_on_c.oled_on_c.c4arm-linux-ld-Ttext0x0000000-gcrt0.oled_on_c.o-oled_on_c_tmp.o5arm-linux-objcopy-Obinary-Sled_on_c_tmp.oled_on_c6clean:7rm-fled_on_c8rm-fled_on_c.o9rm-fled_on_c_tmp.o10rm-fcrt0.o第2、3行分别对源程序crt0.s、led_on_c.c进行预编译,第4行将预编译得到的结果连接起来,第5行把连接得到的ELF格式可执行文件led_on_c_tmp.o转换成二进制格式文件led_on_c。可以开始上机实验了:SC2410的基础实验二C语言编写的LED亮程序实验实验步骤:a.进入LED_ON_C目录后,执行如下命令生成可执行文件led_on_c:makeb.执行如下命令将led_on_c写入nandflash:i.Jflash-s3c2410led_on_c/t=5ii.当出现如下提示时,输入0并回车:K9S1208NANDFlashJTAGProgrammerVer0.00:K9S1208Program1:K9S1208PrBlkPage2:ExitSelectthefunctiontotest:iii.当出现如下提示时,输入0并回车:Inputtargetblocknumber:iv.当出现与步骤ii相同的提示时,输入2并回车c.按开发板上reset键后可看见LED1被点亮了arm-linux-ld命令的理解下arm-linux-ld连接命令的使用arm-linux-ld-Ttext0x00000000crt0.oled_on_c.o-oled_on_c_tmp.o意思:-o选项设置输出文件的名字为led_on_c_tmp.o;“--Ttext0x00000000”设置代码段的起始地址为0x00000000;这条指令的作用就是将crt0.o和led_on_c.o连接成led_on_c_mp.o可执行文件,此可执行文件的代码段起始地址为0x00000000。大多机器上电时是从地址0开始运行的,但是从地址0运行程序在性能方面总有很多限制,所以一般在开始的时候,使用与位置无关的指令将程序本身复制到它的连接地址处,然后使用向pc寄存器赋值的方法跳到连接地址开始的内存上去执行剩下的代码。arm-linux-ld命令的理解arm-linux-ld命令中选项“-Ttext”也可以使用选项“-Tfilexxx”来代替,在文件filexxx中,我们可以写出更复杂的参数来使用arm-linux-ld命令源代码为head.s、init.c和main.c。head.s调用init.c中的函数来关WATCHDOG、初始化SDRAM、初始化NANDFlash,然后将main.c中的代码从NANDFlash地址4096开始处复制到SDRAM中,最后,跳到main.c中的main函数继续执行。代码本身没什么难度,与前面程序最大的差别就是“连接脚本”的引入:在arm-linux-ld命令中,选项“-Ttext”可以使用选项“-Tfilexxx”来代替。在本实验中,使用“-Tnand.lds”。nand.lds内容如下:1SECTIONS{2firtst0x00000000:{head.oinit.o}3second0x30000000:AT(4096){main.o}4}如果想进一步了解连接脚本如何编写,请参考《UsingldTheGNUlinker》(1)阶段1:arch/s3c2410/head.S完成如下几件事情:1、关WATCHDOG:上电后,WATCHDOG默认是开着的2、禁止所有中断:vivi中没用到中断(不过这段代码实在多余,上电后中断默认是关闭的)3、初始化系统时钟:启动MPLL,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz,“CPUbusmode”改为“Asynchronousbusmode”。请参考实验十一:CLOCK4、初始化内存控制寄存器:还记得那13个寄存器吗5、检查是否从掉电模式唤醒,若是,则调用WakeupStart函数进行处理——这是一段没用上的代码,vivi不可能进入掉电模式6、点亮所有LED7、初始化UART0:a.设置GPIO,选择UART0使用的引脚b.初始化UART0,设置工作方式(不使用FIFO)、波特率1152008N1、无流控等,8、将vivi所有代码(包括阶段1和阶段2)从nandflash复制到SDRAM中:a.设置nandflash控制寄存器b.设置堆栈指针——调用C函数时必须先设置堆栈c.设置即将调用的函数nand_read_ll的参数:r0=目的地址(SDRAM的地址),r1=源地址(nandflash的地址),r2=复制的长度(以字节为单位)d.调用nand_read_ll进行复制e.进行一些检查工作:上电后nandflash最开始的4K代码被自动复制到一个称为“Steppingstone”的内部RAM中(地址为0x00000000-0x00001000);在执行nand_read_ll之后,这4K代码同样被复制到SDRAM中(地址为0x33f00000-0x33f01000)。比较这两处的4K代码,如果不同则表示出错9、跳到bootloader的阶段2运行——就是调用init/main.c中的main函数:a.重新设置堆栈b.设置main函数的参数c.调用main函数
本文标题:嵌入式系统设计VIVI
链接地址:https://www.777doc.com/doc-3799899 .html