当前位置:文档之家› 嵌入式学习笔记

嵌入式学习笔记

嵌入式学习笔记
嵌入式学习笔记

nand 启动时bank0 失效,即用不了NOP FLASH

nand flash 前4K被强制复制到片内SRAM 4K内存中,然后CPU会从零地址(SRAM)开始执行。

nor 启动时

nor flash 零地址在nor flash cpu从零地址执行。nor flash特征是可以像内存一样读数据,但是不能像内存一样直接写数据,

要通过命令先擦除后才能写数据。

GPIO实验:

main 没什么特别的,一样要被别人调用,执行往也要返回。

启动文件: 调用main,调用完之后要返回,所以要设置返回地址。最后要进行一些清理工作。

软件初始化:

设置栈/*设置栈就是把栈指针SP指向某个内存,假如指向SDRAM则要先初始化SDRAM才能设置栈*/

设置返回地址/*bl指令会跳转到main函数,并且把返回地址保存在LR寄存器里面。*/

调用main

清理工作

硬件初始化:

关看门狗/*上电时候看门狗启动,会倒数计时三秒内没有关闭就会重启系统。所以要关掉*/

初始化时钟/*想要跑的更快要初始化时钟*/

初始化SDRAM/**/

设置返回地址:

bl main /*bl指令会跳转到main函数,并且把返回地址保存在LR寄存器里面。*/

/*bl 指令会把返回地址存在lr寄存器里面。*/

#define GPFCON (*(volatile unsigned long *)0x56000050) /* volatile让编译器不要优化变量*/

#define GPF4_out(1<<(4*2))

#define GPF5_out(1<<(5*2))

#define GPF6_out(1<<(6*2))

#define GPF7_out(1<<(7*2))

GPFCON |= GPF4_out|GPF5_out|GPF6_out; // 将LED1-3对应的GPF4/5/6三个引脚设为输出

按位操作:

想要清零:按位与/*例如清bit3 则a&=~(1<<3)*/

想要置“1”:按位或/*例如置bit3 则a|= (1<<3)*/

SRAM在芯片手册里面称为steppingstone

CPU通过存储管理器才知道怎么访问外部的设备例如SDRAM DM9000网卡等

想访问一个芯片,需要哪些条件

1:地址线(例如SDRAM 行地址13位,列地址9位)看芯片手册

2:数据线/* 8/16/32位数据宽度例如SDRAM 位宽32位SDRAM32位,所以ADDR0,ADDR1就不需要使用。*/ 看原理图

3:时钟/频率(刷新周期8192/64ms 即刷新8192次需要64ms)看芯片手册

4:芯片相关:例如SDRAM(行地址,列地址,Bank) 看芯片手册

SDRAM32位,所以ADDR0,ADDR1就不需要使用。因为2440的地址的单位是byte(8位),所以CPU发出的0,1,2,3这四个地址都是

访问到SDRAM地址中的同一个单元。返回都是返回同一个四字节(32位)的数据。假如访问的芯片去16位的,则ADDR0 就不需要使用。

想要访问某个芯片(如SDRAM)先要配置存储管理器(位宽,行列地址,刷新周期)。所谓配置也就是设置寄存器。

2440可以接8个外设(SDRAM,DM9000网卡,NOR FLASH等等),因为有8个Bank,有8条片选信号(CS信号)。Bank0~5都是一样的结构。

Bank6~7比较特别,它们可以接SDRAM。

内存可以分为SRAM,SDRAM,DDR等等。SRAM很快但是比较贵,使用方法简单,直接发地址信号就可以了。SDRAM比较便宜且访问比较复杂,

它的地址还分为Bank地址,行地址,列地址。还要不断的刷新SDRAM(REFRESH寄存器就是用来设置刷新周期的),不刷新数据就会丢失。

网卡,NOR FLASH它们的接口跟根SRAM的接口是一样的,术语上称为RAM like。

每个Bank可以外接128M的东西,寻址空间是128M。bank7/bank6可以组(128M/128M,64M/64M,32M/32M等)

大程序启动过程:

1:一上电nand flash前4K被拷贝到SRAM中。

2:程序会先关看门狗,初始化存储管理寄存器,SDRAM。

3:拷贝到SRAM中的4K代码再把nand flash中的代码拷贝到SDRAM中去,然后继续执行(在SDRAM中运行)。

arm-linux-ld -Ttext 0x3000000 -g led_on.o -o led_on_elf (Ttext 0x3000000 是链接地址)

所谓链接地址就是说,运行时程序“应该”位于哪里。所以head.s 就应该从片内SRAM拷到SDRAM中去。

当前PC值= 当前指令的地址+ 8 // pc = 当前指令地址+ 8

MMU:权限管理,地址映射。使用MMU时,使用CPU发出的地址是虚拟地址。或者是真实的物理地址。CPU发出的是物理地址还是

虚拟地址CPU是不在乎的,CPU没有虚拟地址和物理地址概念。

写程序的时候,我们说的地址例如链接地址,也没有虚拟地址,物理地址概念。就是一个单纯的地址。地址只是从CPU角度看到的。

虚拟地址(VA)怎么转换为物理地址(PA)。

对于mips架构来说VA=0xA000,0000 + PA /* VA=fun(PA)*/

对于ARM结构来说:表格:一级页表,二级页表。对于ARM来说有两种映射:段和页

段映射:表格里面每一个表项对应一段,表示大小是1M。假如CPU的地址数是4G,则需要的表格数位4G/1M=4*1024=4096个。

创建页表:启动前和启动瞬间,地址要连续。

A:所以0~4096的虚拟地址要对应0~4096的物理地址

使用MMU会加快程序的运行速度,因为有DCACH,ZCACH。这些会加快程序运行速度。

1,MMU首先知道你创建的这些页表项都放在哪里;

2,MMU通过虚拟地址的高12位可以找到对应的页表项,并且这个页表项的高12位就是物理地址的高12位;

3,虚拟地址的低20位就是物理地址的低20位;

4,页表项的高12位+虚拟地址的低20位==物理地址。

SDRAM程序中mem_cfg_val结构体中的的数字为寄存器BWSCON,BANKCON0,BANKCON1,BANKCON2,BANKCON3,BANKCON4,BANKCON5,BANKCON6,

BANKCON7,REFRESH,BANKSIZE,MRSRB6,MRSRB7寄存器赋值。目的是初始化SDRAM。

unsigned long *p = (unsigned long *)MEM_CTL_BASE; 此语句是将指针P指向寄存器0x48000000

MMU代码:/*复制第二段代码到SDRAM中*/

void copy_2th_to_sdram(void)

{

unsigned int *pdwSrc = (unsigned int *)2048;

unsigned int *pdwDest = (unsigned int *)0x30004000;/*地址为0x30004000是因为前16K

用来存放页表*/

while (pdwSrc < (unsigned int *)4096)

{

*pdwDest = *pdwSrc;

pdwDest++;

pdwSrc++;

}

}

寄存器:NFCMMD NFADDR NFDATA

Nand flash 没有地址总线跟CPU相连,不同于SDRAM,DM9000网卡,SRAM,寄存器等都有地址总线与CPU相连,所以SDRAM,DM9000网卡,

SRAM,寄存器与Nand flash的寻址方式不一样。SDRAM,DM9000网卡,SRAM,寄存器的地址是CPU发出来的,或称为CPU统一编址。

而Nand flash 的地址是Nand flash 自己编址的,CPU “看不到”的。所以CPU说的“0”地址与Nand flash 说的“0”地址不是一个概念。

那Nand flash 是怎么编址的呢?

从原理图上,Nand flash 与CPU相连的只有数据总线,控制总线。所以CPU发出的地址,命令都是由数据总线进行传输。

但是如何分辨是地址还是命令呢?

显然是通过控制总线进行区分。CLE(高电平)信号是命令,ALE(高电平)信号是地址,两个信号都无效的话传输的就是数据。

是读数据还是写数据又由nFWE(读) 引脚nFRE(写)引脚控制。

Nand flash 的典型结构是大页,一个大页有2K 也就是2048字节。有64页。

注意:每一个大页中都有一个叫OOB的空间(64字节)。一般来说用不到OOB这个空间,例如我们要访问第2049这个字节空间,

不会访问到OOB这个空间而是访问第二页开始的第二个字节。

所以真实的一页是2K+64字节。只是64字节基本上不用。

那怎么访问Nand flash ?

1:发出命令CLE NFCMMD 寄存器

2:发出地址ALE NFADDR 寄存器

3:发出数据R/W NFDATA 寄存器

4:状态NFSTAT 寄存器//发出擦除命令不可能马上就擦除成功,用状态寄存器确定NAND FLASH的状态判断是否擦除成功

代码:

ldr r0, =0x30000000 @1. 目标地址=0x30000000,这是SDRAM的起始地址

mov r1, #4096 @2. 源地址= 4096,连接的时候,main.c 中的代码都存在NAND Flash地址4096开始处

mov r2, #2048 @3. 复制长度= 2048(bytes),对于本实验的main.c,这是足够了

bl nand_read

汇编和C语言传递参数:如上例子,r0为传递给C函数(nand_read)的第一个参数,r1为第二个,r2为第三个。

void nand_read(unsigned char *buf, unsigned long start_addr, int size);

中断:

ARM体系CPU的7种工作模式:

用户模式(usr):ARM处理器正常的程序执行状态

该模式下的寄存器:r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15(pc)

系统模式(sys):运行具有特权的操作系统任务

该模式下的寄存器:r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15(pc)

快速中断模式(fiq):用于高速数据传输或通道处理

该模式下的寄存器:r0 r1 r2 r3 r4 r5 r6 r7 “r8_fiq”“r9_fiq”“r10_fiq”“r11_fiq”“r12_fiq”“r13_fiq”“r14_fiq”r15(pc)

中断模式(irq):用于通用的中断处理

该模式下的寄存器:r0 r1 r2 r3 r4 r 5 r6 r7 r8 r9 r10 r11 r12 “r13_irq”“r14_irq”r15(pc)

管理模式(svc):操作系统使用的保护模式

该模式下的寄存器:r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 “r13_svc”“r14_svc”r15(pc)

数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护

该模式下的寄存器:r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 “r13_abt”“r14_abt”r15(pc)

未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真

该模式下的寄存器:r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 “r13_und”“r14_und”r15(pc)

由上可知除了系统模式和用户模式的寄存器相同,其余的5个模式下的寄存器不相同。其中快中断模式拥有7个独立寄存器,

其余模式都是r13 r14 两个寄存器独立。

中断也是一种异常

发生了异常之后:

1:CPU 强制进入异常模式,就是切换寄存器(如上)

/*这里就是说发生异常之后CPU进入异常模式

2:PC(r15)= 异常入口然后程序自动跳到异常入口*/

设置栈,栈sp 就是r13。

异常入口是什么:就是CPU固定的地址。如下:

@***************************************************************************** *

@ 异常向量,本程序中,除Reset和HandleIRQ外,其它异常都没有使用

@***************************************************************************** *

.extern main

.text

.global _start

_start: @ _start 表示0地址入口

@复位异常的入口就是0地址,发生复位之后CPU自动跳到0地址取指执行

b Reset

@ 0x04: 未定义指令中止模式的向量地址

HandleUndef:

b HandleUndef /*死循环*/

@ 0x08: 管理模式的向量地址,通过SWI指令进入此模式

HandleSWI:

b HandleSWI /*死循环*/

@ 0x0c: 指令预取终止导致的异常的向量地址

HandlePrefetchAbort:

b HandlePrefetchAbort /*死循环*/

@ 0x10: 数据访问终止导致的异常的向量地址

HandleDataAbort:

b HandleDataAbort /*死循环*/

@ 0x14: 保留

HandleNotUsed:

b HandleNotUsed /*死循环*/

@ 0x18: 中断模式的向量地址

b HandleIRQ

@ 0x1c: 快中断模式的向量地址

HandleFIQ:

b HandleFIQ /*死循环*/

Reset:

ldr sp, =4096 @ 设置栈指针,以下都是C函数,调用前需要设好栈bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启

msr cpsr_c, #0xd2 @ 进入中断模式

ldr sp, =3072 @ 设置中断模式栈指针

msr cpsr_c, #0xd3 @ 进入管理模式

ldr sp, =4096 @ 设置管理模式栈指针,

@ 其实复位之后,CPU就处于管理模式,

@ 前面的“ldr sp, =4096”完成同样的功能,此句可省略

bl init_led @ 初始化LED的GPIO管脚

bl init_irq @ 调用中断初始化函数,在init.c中

msr cpsr_c, #0x53 @ 设置I-bit=0,开IRQ中断

ldr lr, =halt_loop @ 设置返回地址

ldr pc, =main @ 调用main函数

halt_loop:

b halt_loop

HandleIRQ:

sub lr, lr, #4 @ 计算返回地址/*这个是ARM架构决定的,所以就是这个。*/

stmdb sp!, { r0-r12,lr } @ 保存使用到的寄存器

@ 注意,此时的sp是中断模式的sp

@ 初始值是上面设置的3072

ldr lr, =int_return @ 设置调用ISR即EINT_Handle函数后的返回地址

ldr pc, =EINT_Handle @ 调用中断服务函数,在interrupt.c中

int_return:

ldmia sp!, { r0-r12,pc }^ @ 中断返回, ^表示将spsr的值复制到cpsr

怎么用中断?“被中断”

1:中断发生。要做什么事情?“保存”“别人”的状态

先初始化引脚等,然后使能中断

2:中断处理分辨中断源,根据中断源进行不同的处理,然后进行清理工作(清中断)3:恢复“别人”的状态就是恢复寄存器。

中断控制器:

1:使能中断2:状态寄存器(分辨中断源)3:设置高电平低电平上升沿下降沿等触发。

4:引脚设置设置为输入,输出,中断。5:优先级寄存器

设置栈,栈sp 就是r13。

切换到中断模式(或其他异常模式)时,要重新设置栈,因为r13 (sp)是每个模式下独有的。

怎么进入中断?msr cpsr_c, #0xd2 @ 进入中断模式,运行这个msr cpsr_c 指令就可以进入中断,而x0d2表示进入哪个中断。具体如下。

0xd2 二进制为:110 10010

除r0 ~ r15 这16个寄存器外还有第17个寄存器cpsr(当前状态寄存器) (详见MSR和MRS 文本)

控制位:(以0xd2 为例)

I中断禁止位F快速中断禁止位TCPU状态位M4工作模式位M3工作模式位M2工作模式位M1工作模式位M0工作模式位

1 1 0 1 0 0 1 0

以上就是表示中断模式。

M[4:0]

10000 User 表示用户模式

10001 FIQ 表示快中断模式

10010 IRQ 表示中断模式

10011 Supervisor 表示管理模式

10111 Abort 表示数据访问中止模式

11011 Undefined 表示未定义指令中止模式

11111 System 表示系统模式

系统时钟:

2440 CPU :400M (FCLK)如果什么都不设置,CPU 是以晶振的频率12M HZ 在跑。

SDRAM,MD900,NOR FLASH等: 100M ~ 133M (HCLK)

UART,定时器,I2C等: 50M (PCLK)

2440 的晶振只有12M设置PLL 寄存器设置频率

怎么设置FCLK PCLK HCLK

1:晶振→PLL→400M HZ PLL (LOCKTIME)锁定时间寄存器(使用默认值就可以了),MPLLCON 设置晶振频率的寄存器

2:400M HZ →分频(HCLK PCLK)分频寄存器CLKDIVN

设置波特率UBRDIVn(n=0~1) 有一个公式看数据手册

位置相关:

PCnew = 某个绝对值

引入一个新的概念:

位置无关码

bl和b 指令就是位置无关码。PCnew = PC(当前) +偏移/*偏移值是编译器帮我们算好的。*/

PCnew = (4+8) + 0x28 =0x34 /* +8是ARM架构决定的。

那怎么写位置无关码的代码?

1:汇编中使用bl或b 指令进行跳转

2:C语言中不使用全局变量,静态变量当PC指针跳到应该位于的位置时就不用考虑全局变量,静态变量这些限制

以上详情看视频例子UART 的代码。

关于位置无关的一些心得:

当程序被拷贝到4K RAM里面开始执行。如果用位置无关码写程序,程序之间的跳转都是用相对跳转的(PC = 当前地址+ XXX)。而不是用绝对地址(链接地址)

也就是说,当程序再4K里面运行的时候,PC的值就是在这4K里面,当用相对跳转的时候,要跳转的地址也就只能出现在4K。但是如果用了位置相关码,那么一跳转

就到SDRAM了

LCD原理图:

有哪些信号:

1:垂直方向的同步信号VSYNC

2:水平方向的同步信号HSYNC

3:使能信号VDEN

4:背光信号LED- LED+ GPB0 输出高电平背光芯片才会工作LCD才会点亮。所以第一步就是要设置GPB0 为输出高电平

5:时钟信号VCLK

6:数据信号VD0 ~ VD23

写程序:

1:打开背光

2:时序设置

3:在Frame Buffer写数据

LCD选定之后,像素宽度是固定的。JZ2440的LCD的像素宽度就是16bpp(一个像素用16

位数据表示)

JZ2440 LCD 上每一个像素对应Frame Buffer 里的2字节(因为16bpp)。

那要使LCD的像素与Frame Buffer 对应?

设置BSWP HWSWP两个寄存器。详情见手册。

因为LCD 的像素宽度是固定的16bpp,但是如果硬是要使用8bpp。就要涉及“调色板(Palette)”。

8bpp 的数据宽度可以有256 种颜色。所以调色板(Palette)中也是256中颜色,但是为了跟LCD的16bpp 对应。

所以调色板(Palette)上用16位来存一种颜色。

要使用调色板,需要将调色板初始化

LCD 控制器:LCDCONn (n=1~5)

清屏:可以将一种颜色发给TPAL寄存器,然后使能TPAL寄存器。之后2440 LCD控制器就会从TPAL寄存器取颜色发给LCD(全屏)

LCD 代码中

LCDSADDR1 = ((LCDFRAMEBUFFER>>22)<<21) | LOWER21BITS(LCDFRAMEBUFFER>>1);

LCDSADDR2 = LOWER21BITS((LCDFRAMEBUFFER+ \

(LINEVAL_TFT_240320+1)*(HOZVAL_TFT_240320+1)*2)>>1);

LCDSADDR3 = (0<<11) | (LCD_XSIZE_TFT_240320*2/2);

这一段是2440要我们怎么做我们就怎么做没什么好说的。

UBOOT 的最终目的是要启动内核

1:从flash 读出内核,放到SDRAM

2:启动内核

所以UBOOT要实现的核心功能:

1:读flash,写flash。

2:初始化SDRAM,初始化时钟,关看门狗。

3:从flash 读出内核

4:启动内核

为了开发方便:

开发功能:

1:烧写flash

2:初始化网卡(用网络下载文件)

3:初始化USB(用USB下载文件)

4:初始化串口(在PC机上中断操作UBOOT)

UBOOT make 的时候为什么知道要先make 100ask_24x0.config?

是因为UBOOT文件中有一个README 文件。里面写有了关于UBOOT的约定。

分析UBOOT文件源码时首先要分析MakeFile 找到链接地址,然后根据链接地址找到第一个源文件,然后根据源文件一路分析贯通。

视频以后多看几遍。

UBOOT heads.S 完成步骤

1:设为svc 管理模式

2:关看门狗

3:屏蔽中断

4:初始化SDRAM

5:设置栈

6:初始化时钟

7:重定位(将代码从nand flash 中拷到SDRAM )

8:清bss段。所谓bss段就是,未定义的一些静态变量,全局变量。以免占用内存。

9:调用start_armboot C函数。

UBOOT的核心是命令,读出内核以及启动内核都是需要命令的。所以可以想象到UBOOT的代码中一定有一个命令的结构体,

这个结构体中包含了所有的命令,当我们在UBOOT界面上输入命令是会去匹配,匹配到哪个命令就执行哪个命令。

内核启动流程分析:

1:解压缩

2:打补丁打补丁用patch 命令patch -p_ <某个目录下的补丁文件

3:配置配置有三种方式a:make menuconfig b:使用默认配置在上面修改

c:使用厂家提供的配置文件

如果直接make menuconfig 的话里面成千上万的配置选项,是很复杂的。所以我们用默认的配置文件。

那我们不知道默认的配置文件怎么办呢?可以再终端输入fine -name "*defconfig*"查找有哪些默认的配置文件的目录,然后在相应目录下

找到自己需要的配置文件。2440开发板用的配置文件是s3c2410_defconfig。然后执行make s3c2410_defconfig。最后执行make menuconfig

执行完make menuconfig 后就会在s3c2410_defconfig 的基础上出现一个配置菜单,然后就可以自己修改配置项了。

由上述的步骤可以知道,当执行make s3c2410_defconfig 后,终端提示所有的配置项被写入.config里面。所以make menuconfig 是去.config里面读取需要

的配置项。所以使用厂家的配置文件,只需要将厂家的配置文件CP成.config就行了。(cp config_ok .config)

结合makefile进行分析

以一个配置项为例:CONFIG_DM9000

1:c源码中定义了CONFIG_DM9000 是个宏宏对C语言来说只能在C语言和头文件中定义。所以这个宏来源于autoconfig.h

2:子目录下Makefile :drivers/net/makefile

3:include/config/autoconfig 中定义了CONFIG_DM9000 。

4:include/linux/autoconfig.h 由名字可以知道autoconfig.h是配置的时候自动根据.config生成的。

查看autoconfig.h的时候发现里面的宏大部分都被定义为“1”。也就是说在配置内核的时候无论配置项(DM9000)被设置为“Y”“N”还是“M”

都被定义为“1”。那么Y N M 之间的差别怎么体现呢?

竟然C语言和头文件中不能体现区别,那么只能在子目录中的Makefile中体现。

这里插讲一下子目录的Makefile。格式比较简单obj-y +=xxx.o 表明xxx.c这个文件最后会编译进内核obj-m += yyy.o 表示yyy.c这个文件

最后会变编译成一个可加载的模块。所以子目录中的Makefile 写成obj-$(config_DM9000) +=dm9000.o

分析内核的Makefile 可以找到第一个文件,还有链接脚本。

第一个文件arch/arm/kernel/head.s

链接脚本arch/arm/kernel/vmlinux.lds

内核:最终目的是要运行应用程序

1:处理UBOOT传入的参数

a:判断是否支持这个CPU

b:判断是否支持这个单板(UBOOT启动内核时传入的机器ID)

c:使能MMU

d:跳到start_kernel

2:挂接根文件系统

内核怎样启动第一个应用程序

1:打开一个设备open(dev/console)/*这三个程序代表printf scanf err() */ sys_dup(0) sys_dup(0)

2:然后用run_init_process(某个目录下的程序); 例如:run_init_process(“/sbin/init”); 这个函数启动某个程序

busybox:ls cp cd等等的组合

我们执行ls cp cd 等命令时,实际上就是执行busybox这个程序ls cp cd 等都是指向busybox

内核的最终目的不是启动第一个文件sbin/init 而是要启动用户程序。但是怎么知道要启动什么程序呢?做手机的启动

手机程序做监控的启动监控程序。所以需要一个配置文件指定应用程序还有指定何时执行。而内核的配置文件一般来说在etc/目录下

如果没有配置文件的话,内核会自动执行一个默认的配置项。

busybox-> init_main

parse_inittab()

file = fopen(INITTAB,"r"); //打开配置文件/etc/inittab

如果没有配置文件的话,内核会自动执行一个默认的配置项

如果有的话就会对配置文件进行解析,例如#开头的忽略当做注释,为id 加个/dev/的前缀。

解析完之后最终要调用new_init_action(a->action,command,id)

new_init_action 要做什么事情

1:创建一个init_action结构,这个结构的内容用new_init_action(a->action,command,id)中的参数进行填充。

2:把这结构放入init_action_list链表

run_actions(SYSINIT); /*执行*/

waitfor(a,0); /*执行程应用序,等待它执行完毕*/

run(a); /*创建子进程,子进程就是process里面指定的应用程序*/

waitpid(runpid,&status,0); /* 等待它结束*/

delete_init_action(a); /*把init_action结构在init_action_list链表

里删掉,所以用run_actions(SYSINIT); 定义的程序

执行一次就被删掉了。*/

run_actions(WAIT);

waitfor(a,0); /*执行程应用序,等待它执行完毕*/

run(a); /*创建子进程,子进程就是process里面指定的应用程序*/

waitpid(runpid,&status,0); /* 等待它结束*/

delete_init_action(a); /*把init_action结构在init_action_list链表里删掉,所以用run_actions(SYSINIT); 定义的程序

执行一次就被删掉了。*/

run_actions(ONCE); /*ONCE 跟前面的SYSINIT,WAIT有点不一样,因为没有waitpid(runpid,&status,0); 所以init进程不会等待它执行完毕。*/

run(a);

delete_init_action(a);

while(1){

run_actions(RESPAWN);

if (a->pid == 0) {

a->pid = run(a);

}

run_actions(ASKFIRST);

if (a->pid == 0) {

a->pid = run(a);

}

wpid = wait(NULL); /*等待子进程退出*/

while(wpid>0){

a->pid = 0; /*退出后,就这是pid=0*/

}

}

inittab格式:

:::

id-> /dev/id :用作终端,stdin,stdout,stderr: printf scanf err /*: WARNING: This field has a non-traditional meaning for BusyBox init!*/

runlevels :忽略/*The runlevels field is completely ignored.*/

action :执行时机/*Valid actions include: sysinit, respawn, askfirst, wait, once, restart, ctrlaltdel, and shutdown.*/

process :应用程序或脚本/* Specifies the process to be executed and it's command line.*/

由上可知,一个最小的根文件系统需要的项:

1: /dev/console /dev/null

2:init->busybox

3:/etc/inittab /*配置文件*/

4: 配置文件里指定的应用程序

5:库

init本身,即busybox

编译busybox

在源码中找到“INSTALL”文件,阅读文件知道怎么编译busybox

make menuconfig # This creates a file called ".config"

make # This creates the "busybox" executable

make install # or make CONFIG_PREFIX=/path/from/root install /*默认是安装到PC机中的文件系统的,为了避免破坏整个系统。

所以我们应该安装到我们指定的目录里面*/

配置busybox 的时候配置上Tab completion 以后使用的时候比较好用。

Tab completion (Tab 补全) 输入命令的时候按tab键会自动补全命令

例如:cd /work/ cd/wo此时按tab键会自动补全为cd /work/

make menuconfig 后make 编译busybox 的时候可能会出现错误,出现措错误的话就重新编译,将出现错误的命令配置项去掉。

如果实在是想要用这个命令就上网搜。解决办法。make好之后千万不要直接make install 因为默认安装到PC机,这样会破坏我们的电脑。

先创建一个目录(/work/nfs_root/first_root/tmp),然后make CONFIG_PREFIX=/work/nfs_root/tmp install

根据这五项:

1: /dev/console /dev/null

2:init->busybox

3:/etc/inittab /*配置文件*/

4: 配置文件里指定的应用程序

5:库

创建最小的根文件系统(在/work/nfs_root 目录下)

第一创建/dev/console /dev/null 这两个设备文件。

怎么创建呢?用sudo mknod console 【设备类型】【主设备号】【次设备号】

先看看PC机上/dev/console /dev/null 这两个文件是怎么回事。

用ls /dev/console /dev/null -l 命令行查看设备的主设备号次设备号

crw-------1 root root 5,1 2010-11-26-07:47 /dev/console /*开头的“C”表示该设备是字符设备,“5”是主设备号,“1”是次设备号*/

crw-rw-rw-1 root root 1,3 2010-11-26-07:47 /dev/null /*开头的“C”表示该设备是字符设备,“1”是主设备号,“3”是次设备号*/

由上可知sudo mknod console c 5 1

sudo mknod null c 1 3

第二要构造一个inittab

第三安装glibc库

mkdir /work/nfs_root/first_root/lib

cd /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib 进入含有glibc库的目录下。

cp *.so* /work/nfs_root/first_root/lib -d 将glibc库拷贝到最小根文件系统目录下。注意拷贝的时候要加个“-d”选项,否则库文件会很大。

至此我们已经做好了最少根文件系统,但是我们要怎么烧到开发板上去?

需要做了一个映像文件yaffs2 /*yaffs1 是用于小页的flash。JZ2440的flash 是大页的使用yaffs2*/

首先cd /work/system/ /*进去system 目录*/

tar xjf yaffs_source_util_lager_samll_page_nand.tar.bz2 /*解压这个工具,这个工具可以支持大页,也可以支持小页*/

cd Development_util_ok /*进入解压yaffs_source_util_lager_samll_page_nand.tar.bz2后得到的Development_util_ok目录*/

cd yaffs2/ /*进入Development_util_ok目录下yaffs2*/

cd utils/ /*进入utils */

然后执行make

这样就编译出来一些工具。而我们用到的是mkyaffs2image

sudo cp mkyaffs2image /usr/local/bin/ /*将mkyaffs2image拷贝到PC机的/usr/local/bin/*/

sudo chomd +x /usr/local/bin/mkyaffs2image /*加上可执行属性。*/

然后就可以创建文件系统映像了。

cd /work/nfs_root /*先回到最小根文件系统所在的目录*/

mkyaffs2image first_root first_root.yaffs2 /*这样就可以创建映像文件了。这个就可以烧到开发板上*/

dev目录里面的东西对应于设备驱动,我们有成千上百个驱动。如果要一个一个的去创建dev 目录会很麻烦。

有一种方法可以简化这些过程:

Udev 机制:自动创建/dev/目录下面的设备节点。

在busybox里面有个简化版本mdev

mdev 怎么使用

[1] mount -t sysfs sysfs /sys

[2] echo /bin/mdev > /proc/sys/kernel/hotplug

[3] mdev -s

[4] mount -t tmpfs mdev /dev

[5] mkdir /dev/pts

[6] mount -t devpts devpts /dev/pts

具体过程查看电子书。

对于写应用程序的人来说,不用去阅读芯片手册,硬件的构造等。他们用open,read,write 等这种标准的接口来调用我们的驱动程序。

open,write,read这些函数不是我们实现的,是C库实现的。C库也属于应用层。

当我们的应用程序调用open,write,read这些系统调用接口的时候会进入到内核。驱动属于内核的一部分。

那C库怎么进去内核呢?open,write,read这些的调用实现实质上是执行一条swi val 汇编指令,这条汇编指令会引发一个异常。相当于

中断一样,当发生这个异常的时候,就会进入内核的异常处理函数里面。

内核中有一层system call interface(系统调用接口),那它是做什么的呢?

在异常处理函数里面根据swi val 发生中断异常的原因,调用不同的处理函数。比如,我们用open的时候传进来的是val=1,read是val=2,write是val=3

那么这个system call interface 就跟根据传进的val 的不同的值,调用sys_open,sys_read,sys_write。

内核中sys_open,sys_read,sys_write 这一层叫做VFS (虚拟文件系统)

int mian()

{

int fd1,fd2;

int val = 1;

fd1 = open("dev/led",O_RDWR);

write(fd1,&val,4);

fd2 = open("hello.txt",O_RDWR);

write(fd2,&val,4);

}

上述程序点灯和写文件都是用同样的函数,但是这两个行为显然不一样。那么谁来实现这些不一样的行为呢。

sys_open,sys_read,sys_write 会根据打开的不同文件,不同的文件有不同的属性。根据这些属性,找到对应的底层驱动程序,

基于ARM32位单片机的机器人设计毕业论文

基于ARM32位单片机的机器人设计毕业论文 目录 摘要 (2) Abstract (3) 第一章引言 (4) 第二章S3C44B0X控制器介绍 (6) 2.1 S3C44B0X控制器管脚 (6) 2.2 Samsung S3C44B0X介绍 (8) 第三章ARM开发工具简介 (12) 3.1 ARM开发工具综述 (12) 3.2 ARM STD安装和应用 (13) 第四章S3C44B0X部资源编程 (20) 4.1 LED显示 (20) 4.2键盘控制 (23) 4.3 数码管显示 (24) 4.4 中断控制 (25) 第五章机器人的设计 (27) 5.1硬件结构 (27) 5.2软件设计 (31)

5.3结论 (44) 第六章展望 (45) 参考文献 第一章引言 ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如嵌入控制、消费、教育类、多媒体、DSP和移动式应用等。ARM将其技术授权给世界上许多著名的半导体、软件和OEM厂商,每个厂商得到的都是一套独一无二的ARM相关技术及服务。利用这种合伙关系,ARM很快成为许多全球性RISC标准的缔造者。 目前,总共有30家半导体公司与ARM签订了硬件技术使用许可协议,其中包括Intel、IBM、LG半导体、NEC、SONY、菲利浦和国民半导体这样的大公司。至于软件系统的合伙人,则包括微软、升阳和MRI等一系列知名公司。ARM架构是面向低预算市场设计的第一款RISC 微处理器。 ARM提供一系列核、体系扩展、微处理器和系统芯片方案。由于所有产品均采用一个通用的软件体系,所以相同的软件可在所有产品中运行(理论上如此)。典型的产品如下。 ①CPU核 --ARM7:小型、快速、低能耗、集成式RISC核,用于移动通信。 -- ARM7TDMI(Thumb):这是公司授权用户最多的一项产品,将ARM7指令集同Thumb扩展组合在一起,以减少存容量和系统成本。同时,它还利用嵌入式ICE调试技术来简化系统设计,并用一个DSP增强扩展来改进性能。该产品的典型用途是数字蜂窝和硬盘驱动器。 --ARM9TDMI:采用5阶段管道化ARM9核,同时配备Thumb扩展、调试和Harvard总线。在生产工艺相同的情况下,性能可达ARM7TDMI的两倍之多。常用于连网和顶置盒。 ②体系扩展 -- Thumb:以16位系统的成本,提供32位RISC性能,特别注意的是它所需的存容量非常小。 ③嵌入式ICE调试 由于集成了类似于ICE的CPU核调试技术,所以原型设计和系统芯片的调试得到了极大的简化。 ④微处理器 --ARM710系列,包括ARM710、ARM710T、ARM720T和ARM740T:低价、低能耗、封装式常规系统微型处理器,配有高速缓存(Cache)、存管理、写缓冲和JTAG。广泛应用于手持式计算、数据通信和消费类多媒体。 --ARM940T、920T系列:低价、低能耗、高性能系统微处理器,配有Cache、存管理和写缓冲。应用于高级引擎管理、保安系统、顶置盒、便携计算机和高档打印机。 --StrongARM:性能很高、同时满足常规应用需要的一种微处理器技术,与DEC联合研制,后来授权给Intel。SA110处理器、SA1100 PDA系统芯片和SA1500多媒体处理器芯片均采用了这一技术。 --ARM7500和ARM7500FE:高度集成的单芯片RISC计算机,基于一个缓存式ARM7 32位核,拥有存和I/O控制器、3个DMA通道、片上视频控制器和调色板以及立体声端口;ARM7500FE 则增加了一个浮点运算单元以及对EDO DRAM的支持。特别适合电视顶置盒和网络计算机(NC)。Windows CE的Pocket PC只支持ARMWindows CE可支持多种嵌入式处理器,但基于

嵌入式系统设计大作业

嵌入式系统设计大作业 学号:14020520009 姓名:罗翔 1、叙述JTAG接口在嵌入式开发中的作用。 答: (1)用于烧写FLASH 烧写FLASH的软件有很多种包括jatg.exe fluted flashpgm等等,但是所有这些软件都是通过jtag接口来烧写flash的,由于pc机上是没有jtag接口的,所以利用并口来传递信息给目标板的jtag接口。所以就需要并口转jtag接口的电路。 (2)用于调试程序 同时应该注意到jtag接口还可以用来调试程序。而调试程序(如ARM开发组件中的AXD)为了通过jtag接口去调试目标板上的程序,同样是使用pc的并口转jtag接口来实现与目标板的通信。这样,并口转jtag接口的电路就有了两种作用。 (3)仿真器 根据(1)和(2)的总结,并口转jtag接口的电路是两种应用的关键,而这种电路在嵌入式开发中就叫仿真器。并口转jtag接口的电路有很多种,有简单有复杂的,常见的仿真器有Wigger,EasyJTAG,Multi-ICE等。这些所谓的仿真器的内部电路都是并口转jtag接口,区别只是电路不同或使用的技术不同而已。 2、叙述嵌入式平台的搭建过程,以linux为例。 答: 1) 一:建立宿主机开发环境 建立交叉编译的环境即在宿主机上安装与开发板相应的编译器及库函数,以便能够在宿主机上应用开发工具编译在目标板上运行的Linux引导程序,内核,文件系统和应用程序 交叉编译:在特殊的环境下,把嵌入式程序代码编译成不同的CPU所对应的机器代码。

开发时使用宿主机上的交叉编译,汇编及链接工具形成可执行的二进制代码(该代码只能在开发板上执行),然后下载到开发板上运行 2) 下载和安装arm-Linux-gcc编译工具链下载最新的arm-Linux-gcc并解压至当前目录下 在系统配置文件profile中设置环境变量方法:直接在profile文件中加入搜索路径立即使新的环境变量生效:运行source命令,检查是否将路径加入到path,测试是否安装成功, 编译程序,测试交叉工具链 3) 配置超级终端minicom minicom是宿主机与目标板进行通信的终端:在宿主机Linux终端中输入:minicom-s或输入minicom然后按ctrl+A+O对超级终端minicom进行配置,再选择串口并配置串口,最后保存即可 4) 建立数据共享服务:NFS服务是Linux系统中经常使用的数据文件共享服务 5) 编译嵌入式系统内核:内核配置,建立依存关系,建立内核 6) 制作文件系统 3、给出现今有哪些用于嵌入式开发的芯片名称,他们分别是哪些公司的产品? 体系结构是什么? S3C2410X基于ARM的Sumsang; XscalePXA255/PXA270基于ARM的Intel; 摩托罗拉MC基于68k; Power 601基于Power PC; MIPS32Kc基于MIPS 4、现今较流行的嵌入式操作系统有哪些? 答: (1) VxWorks (2)wince (3)linux (4)android

嵌入式linux基本操作实验一的实验报告

实验一linux基本操作实验的实验报告 一实验目的 1、熟悉嵌入式开发平台部件,了解宿主机/目标机开发模式; 2、熟悉和掌握常用Linux的命令和工具。 二实验步骤 1、连接主机和目标板;(三根线,网线直接连接实验箱和PC机,实验箱UART2连接主机的UART口)。 2、Linux命令的熟悉与操作 PC端:在PC机的桌面上打开虚拟机,并启动Linux系统,打开命令终端,操作Linux基本命令,如:查看:ls,进入目录:cd,创建文件:mkdir,删除文件:rmdir,配置网络:ifconfig,挂载:mount,设置权限:chmod,编辑器:vi,拷贝:cp等命令,要求能熟练操作。 使用方法: 1.查看:ls Ls列出文件和目录 Ls–a 显示隐藏文件 Ls–l 显示长列格式ls–al 其中:蓝:目录;绿:可执行文件;红:压缩文件;浅蓝:链接文件;灰:其他文件;红底白字:错误的链接文件 2.进入目录:cd 改变当前目录:cd 目录名(进入用户home目录:cd ~;进入上一级目录:cd -) 3.创建文件:mkdir 建立文件/目录:touch 文件名/mkdir目录名 4.删除文件:rmdir 删除空目录:rmdir目录名 5.配置网络:ifconfig 网络- (以太网和WIFI无线) ifconfig eth0 显示一个以太网卡的配置 6.挂载:mount mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘- 确定目录'/ mnt/hda2' 已经存在 umount /dev/hda2 卸载一个叫做hda2的盘- 先从挂载点'/ mnt/hda2' 退出fuser -km /mnt/hda2 当设备繁忙时强制卸载 umount -n /mnt/hda2 运行卸载操作而不写入/etc/mtab文件- 当文件为只读或当磁盘写满时非常有用 mount /dev/fd0 /mnt/floppy 挂载一个软盘 mount /dev/cdrom /mnt/cdrom挂载一个cdrom或dvdrom mount /dev/hdc /mnt/cdrecorder挂载一个cdrw或dvdrom mount /dev/hdb /mnt/cdrecorder挂载一个cdrw或dvdrom mount -o loop file.iso /mnt/cdrom挂载一个文件或ISO镜像文件

大作业设计报告书(嵌入式系统原理与开发)

大作业设计报告书 题目:嵌入式系统原理与开发 院(系):物联网工程学院 专业: 班级: 姓名: 指导老师: 设计时间: 10-11 学年 2 学期 20XX年5月

目录 1.目的和要求 (3) 2.题目内容 (3) 3.设计原理 (4) 4.设计步骤 (5) 4.1 交通指示灯设计 (5) 4.2 S3C44B0X I/O 控制寄存器 (6) 4.3 红绿灯过渡代码: (8) 4.4 电源电路设计 (10) 4.5 系统复位电路设计 (11) 4.6 系统时钟电路设计 (11) 4.7 JTAG 接口电路设计 (12) 4.8串口电路设计 (12) 5.引脚分类图 (13) 6.参考文献 (13)

1.目的和要求 ARM技术是目前嵌入式应用产业中应用十分广泛的先进技术,课程开设的目的在于使学生在了解嵌入式系统基础理论的前提下能够掌握ARM处理器的汇编语言和c语言的程序设计方法,掌握S3C44B0X芯片的基本硬件结构特点和接口设计方法,同时熟悉ARM开发环境,学习ARM的硬件设计和软件编程的基本方法,为今后从事相关的应用与研究打下基础。通过大作业要达到如下目的: 一、掌握ARM的开发工具使用和软件设计方法。 二、掌握ARM处理器S3C44B0X的原理和GPIO接口设计原理。 三、掌握C语言与的ARM汇编语言的混合编程方法; 四、培养学生选用参考,查阅手册及文献资料的能力。培养独立思考,深入研 究,分析问题、解决问题的能力。 五、通过课程设计,培养学生严肃认真的工作作风。 2.题目内容 题目:交通指示灯系统设计 功能描述: 1.用S3C44B0X的GPIO设计相关电路; 2.设计相关的软件并注释; 3.实现十字路口2组红、黄、绿交通灯交替显示。 编程提示: 1.交通灯可用发光二极管代替; 2.电路可部分参照实验电路; 3.时间控制可以使用软件循环编程解决。

《嵌入式系统与开发》构建嵌入式Linux系统-实验报告

《嵌入式数据库sqlite移植及使用》 实验报告 学生姓名:陈彤 学号:13004405 专业班级:130044 指导教师:孙国梓 完成时间:2016.5.31 实验3 嵌入式数据库sqlite移植及使用 一.实验目的 理解嵌入式软件移植的基本方法,掌握sqlite数据库软件移植的步骤,掌握sqlite开发的两种方式—命令模式和C代码开发模式的使用方法,并编程实现简单通讯录查询实验。 二.实验内容 实验3.1 移植嵌入式数据库sqlite 实验3.2 简单通讯录查询实例设计和测试 三.预备知识 Linux使用、数据库相关知识等 四.实验设备及工具(包括软件调试工具) 硬件:ARM 嵌入式开发平台、PC 机Pentium100 以上、串口线。 软件:WinXP或UBUNTU开发环境。 五.实验步骤 5.1 移植嵌入式数据库sqlite 步骤【参看教材103页】: 第一步,解压缩sqlite源码,命令tar zxvf sqlite-autoconf-3080900.tar.gz,在解压后的文件夹下,可以看到源码文件有shell.c 和sqlite3.c文件,生成Makefile的配置脚本文件configure.ac ,并检查当前文件夹下__A__(A.存在 B.不存在)Makefile文件。 第二步利用configure脚本文件生成基于ARM实验台的Makefile,具体命令为./configure CC=arm-linux-gcc –prefix=/opt/sqlite –host=arm-linux(假设安装目录为/opt/sqlite),并检查当前文件夹下___A__(A.存在 B.不存在)Makefile文件。 第三步,编译sqlite,命令为_make_,编译过程中使用的编译器为_ arm-linux-gcc _。 第四步,安装sqlit,命令为_make install_。安装完成后到_/opt/sqlite_文件夹下去查看相关文件,可以看到该文件夹下有_bin_、_include_、__lib__和share文件夹,其中可执行文件sqlite3位于_./bin_文件夹,库位于_./lib_文件夹。 第五步,将sqlite3拷贝到开发板bin目录下,将库下的文件拷贝到开发板的lib目录下【注意链接文件的创建】 第六步,数据库的使用 方式1:命令操纵数据库 在超级终端环境下创建数据库stucomm.db,命令为_sqlite3 stucomm.db_; 创建数据表stutable,字段包括id 整型,name 字符型,phoneNum 字符型,具体命令为_sqlite> create table stutable (id int(20),name char(20),phoneNum char(20));_; 插入2条记录,记录信息如下 001,zhangsan,10086 002,lisi,10000

基于arm的指纹识别毕业设计

v .. . .. 基于ARM的指纹识别系统设计 摘要 世界正朝着互联化的方向发展,而物联网正是这个数字革命的核心之一。在目前流行的物联网技术中,要求嵌入式终端能够提供成熟且价格便宜的生物特征识别技术,目前来说指纹识别的技术应用最为广泛,我们不仅在门禁、考勤系统中可以看到指纹识别技术的身影,市场上有了更多指纹识别的应用:如手机、指纹锁、银行支付验证都可应用指纹识别的技术。 在指纹识别控制领域,也会用到各种微控制器,本文采用了三星半导体S3C6410作为控制核心,S3C6410应用了专为要求高性能、低成本、低功耗的嵌入式消费类电子设计的ARM9内核。按性能分成两个不同的系列:该系列内核时钟频率已经达到72MHz。 指纹识别基于两种特征点来识别:(i)组成指纹的指纹整体特征结构(ii)局部的特征点。本文提出了一种可以在自动指纹识别系统中使用的基于特征点的指纹识别算法。本文提到的方法基于从细化提取的特征点,二值化一个指纹图像分割图。该系统采用在指纹分类的指纹索引匹配,大大提高了匹配算法的性能。 关键字:ARM9,指纹识别,特征识别,图像处理 . . . 资料. .

v .. . .. Abstract The world is moving in the direction of the development of the Internet, the Internet of is one of the core of the digital revolution. In the current network technology, the embedded terminal capable of providing biometric technology is mature and the price is cheap, at present technology of fingerprint recognition is the most widely, we can not only see the fingerprint recognition technology in access control, attendance system, fingerprint recognition application is more on the market: such as mobile phone, fingerprint lock, bank payment verification can be applied to fingerprint recognition technology. In the fingerprint recognition and control field, we will also use a variety of micro controller, this paper uses Samsung S3C6410 as the control core, S3C6410 application designed for high performance, low cost, low power embedded consumer electronic design based on ARM9 kernel. According to performance is divided into two different series: this series of core clock frequency has reached 72MHz. Fingerprint identification two feature points based on: (I) to identify the fingerprint feature structure fingerprint (II) feature local. This paper proposes a can be used in automatic fingerprint recognition system of fingerprint . . . 资料. .

2016年下学期嵌入式系统设计大作业

嵌入式系统设计大作业 1、叙述嵌入式系统开发过程中所要解决的两个问题。 2、叙述嵌入式平台的搭建过程,以linux为例。 3、给出现今有哪些用于嵌入式开发的芯片名称,他们分别是哪些公司的产品? 体系结构是什么? 4、现今较流行的嵌入式操作系统有哪些? 5、PXA270嵌入式开发板的接口有哪些? 6、请写出Nor Flash和Nand Flash的区别。 7、冯。诺依曼架构与哈佛架构的区别。 8、单周期3级流水的情况下,第10个指令周期时,第几条指令执行结束? 9、下面是linux下的一个简单的设备驱动程序,写出linux设备驱动常用的数据结构,同时阅读下面代码,请给出测试程序中的每条语句加以注释。 设备驱动程序Keypad.c的源代码: #include #include #include #include #include #include #include #include #include #include #include #define LEDnKEY_MAJOR 251 #define KEYPAD_NAME "X-Hyper250 Keypad" #define KEYPAD_VERSION "Version 0.1" #define EXT_KEY_CS EXT_PORT2 #define EXT_LED_CS EXT_PORT3 #define LED_SHOW 10 /*EXT_KEY_CS 为向外部LED进行数值设定,它定义在其它头文件里*/ void led_off_on() /**/ { int i; EXT_LED_CS = 0xff; for(i =0 ; i<8;++i) { EXT_LED_CS = ~((1 << i) & 0xff); udelay(30000); } EXT_LED_CS = 0xff; }

南邮嵌入式系统B实验报告2016年度-2017年度-2

_* 南京邮电大学通信学院 实验报告 实验名称:基于ADS开发环境的程序设计 嵌入式Linux交叉开发环境的建立 嵌入式Linux环境下的程序设计 多线程程序设计 课程名称嵌入式系统B 班级学号 姓名 开课学期2016/2017学年第2学期

实验一基于ADS开发环境的程序设计 一、实验目的 1、学习ADS开发环境的使用; 2、学习和掌握ADS环境下的汇编语言及C语言程序设计; 3、学习和掌握汇编语言及C语言的混合编程方法。 二、实验内容 1、编写和调试汇编语言程序; 2、编写和调试C语言程序; 3、编写和调试汇编语言及C语言的混合程序; 三、实验过程与结果 1、寄存器R0和R1中有两个正整数,求这两个数的最大公约数,结果保存在R3中。 代码1:使用C内嵌汇编 #include int find_gcd(int x,int y) { int gcdnum; __asm { MOV r0, x MOV r1, y LOOP: CMP r0, r1 SUBLT r1, r1, r0 SUBGT r0, r0, r1 BNE LOOP MOV r3, r0 MOV gcdnum,r3 //stop // B stop // END } return gcdnum; } int main() { int a; a = find_gcd(18,9);

printf("gcdnum:%d\n",a); return 0; } 代码2:使用纯汇编语言 AREA example1,CODE,readonly ENTRY MOV r0, #4 MOV r1, #9 start CMP r0, r1 SUBLT r1, r1, r0 SUBGT r0, r0, r1 BNE start MOV r3, r0 stop B stop END 2、寄存器R0 、R1和R2中有三个正整数,求出其中最大的数,并将其保存在R3中。 代码1:使用纯汇编语言 AREA examp,CODE,READONL Y ENTRY MOV R0,#10 MOV R1,#30 MOV R2,#20 Start CMP R0,R1 BLE lbl_a CMP R0,R2 MOVGT R3,R0 MOVLE R3,R2 B lbl_b lbl_a CMP R1,R2 MOVGT R3,R1 MOVLE R3,R2 lbl_b B . END 代码2:使用C内嵌汇编语言 #include int find_maxnum(int a,int b,int c)

嵌入式程序设计实验报告

实验一开发环境的搭建与配置 【实验目的】 1)熟悉嵌入式Linux开发平台。 2)掌握嵌入式Linux开发平台的开发环境搭建与配置。 3)了解minicom配置串口通信参数的过程。 4)了解嵌入式Linux的启动过程。 5)掌握程序交叉编译运行及调试的一般方法。 【实验内容】 1)连接实验开发板与宿主机。 2)在虚拟机中的CentOS(宿主机)搭建开发环境。 3)在宿主机中配置minicom。 4)分析嵌入式Linux的启动过程。 5)在宿主机上编写简单的C语言程序并用交叉编译工具进行编译,然后传输到目标机上运行。 6)在宿主机上编写简单的C语言程序并用交叉编译工具进行编译,用gdbserver进行远程调试。 【实验步骤】 连接实验开发板,对虚拟机进行设置 1)首先把实验开发板打开,用网线和串口线连接宿主机,并连接电源(注意这时不要拨动实验 开发板的开关按钮)。 2)在桌面上点击打开vmware 软件,选择“编辑虚拟机设置”,如下图所示:

图1 3)进入虚拟机配置界面后把网络连接方式设置为“桥接方式”,如图2所示: 图2

4)添加串口,如下图所示: 图3 5)完成串口的添加后,选择“OK”,完成对虚拟机的设置。如下图所示:

图4 6)选择虚拟机的“Edit”、“Virtual Network Editor...”,如下图所示:

图5 7)进入虚拟机网络参数设置界面后对VMnet0进行设置(注意这里桥接的网卡应选择与实验开 发板相连接的那块儿网卡),然后点击“Apply”、“OK”如下图所示:

图6 8)上述设置完成后启动CentOS(CentOS的用户名为“root”,密码为“xidianembed”)。 工具链的配置 1)在CentOS的根目录下创建一个名为“EELiod”的目录,把实验中要用到的文件(主要是一 些rpm包)拷贝到该目录下。(可以用U盘、WinSCP等工具进行,此处不再做详细说明)。 2)交叉编译工具链位于/opt/buildroot-2011.02/output/host/usr目录下,进入工具链的bin目录下, 可以看到一些编译工具,这些工具将会在之后的交叉编译过程中使用到。

(完整版)基于ARM的射频识别读写器设计毕业设计

本科毕业论文(设计)

摘要 射频识别(Radio Frequency Identification,RFID)是一种非接触式的自动识别技术,它通过射频信号自动识别目标对象并获取相关数据,识别过程无需人工干预,是一种新的自动识别技术[1]。RFID是利用射频的方式进行非接触的双向通信,而非接触式IC 射频卡成功地解决了无源(卡中无电源) 和免接触这一个难题。RFID具有非接触、长距离工作、适应环境能力强、可识别运动目标等优点,射频识别技术已经在越来越多的领域内出现,因此,对射频卡的开发应用也具有一定的现实意义。本文的设计是基于Philips公司的Mifare1 S50/S70芯片的射频识别系统的设计方案,制作一套以ARM微处理器为MCU的射频识别读写器系统,设计RF 接口电路,制作相应的硬件电路模块,分析非接触式IC 卡系统的通信协议,通过Keil C软件编程实现读写器与非接触式IC 卡系统的通信,并完成校园卡考勤系统。

关键词: RFID; 自动识别; ARM; 非接触式IC卡; Keil C Abstract RFID is a non-contact automatic identification technology,it identify target and get the related data through radio frequency signal automatically,the identification process without human intervention, is a kind of new automatic identification technology. RFID for non-contact two-way communication by the way of radio frequency, and non-contact IC radio frequency card has successfully solved the difficulty problems: without power supply and non-contact. RFID has many advantages: non-contact,long-distance work,good adaptability for environment and can recognize the moving objects,RFID technology has appeared in more and more field,so the development and application of radio frequency card also has certain practical significance. The design of this article is based on the Mifare 1 S50 / S70 chip radio frequency

嵌入式系统实验报告

郑州航空工业管理学院 嵌入式系统实验报告 (修订版) 20 – 20第学期 赵成,张克新 院系: 姓名: 专业: 学号: 电子通信工程系 2014年3月制

实验一ARM体系结构与编程方法 一、实验目的 了解ARM9 S3C2410A嵌入式微处理器芯片的体系结构,熟悉ARM微处理器的工作模式、指令状态、寄存器组及异常中断的概念,掌握ARM指令系统,能在ADS1.2 IDE中进行ARM汇编语言程序设计。 二、实验内容 1.ADS1.2 IDE的安装、环境配置及工程项目的建立; 2.ARM汇编语言程序设计(参考附录A): (1)两个寄存器值相加; (2)LDR、STR指令操作; (3)使用多寄存器传送指令进行数据复制; (4)使用查表法实现程序跳转; (5)使用BX指令切换处理器状态; (6)微处理器工作模式切换; 三、预备知识 了解ARM嵌入式微处理器芯片的体系结构及指令体系;熟悉汇编语言及可编程微处理器的程序设计方法。 四、实验设备 1. 硬件环境配置 计算机:Intel(R) Pentium(R) 及以上; 内存:1GB及以上; 实验设备:UP-NETARM2410-S嵌入式开发平台,J-Link V8仿真器; 2. 软件环境配置 操作系统:Microsoft Windows XP Professional Service Pack 2; 集成开发环境:ARM Developer Suite (ADS) 1.2。 五、实验分析 1.安装的ADS1.2 IDE中包括和两个软件组件。在ADS1.2中建立类型的工程,工程目标配置为;接着,还需要对工程进行、及链接器设置;最后,配置仿真环境为仿真方式。 2.写出ARM汇编语言的最简程序结构,然后在代码段中实现两个寄存器值的加法运算,给出运算部分相应指令的注释。 ; 文件名:

嵌入式系统基础作业

一、简要说明嵌入式系统产品的基本组成、嵌入式系统特点、嵌入式系统开发流程; 答:基本组成:可分为硬件和软件两个组成部分。其中硬件组成结构以嵌入式微处理机为中心,配置存储器I/O设备、通信模块以及电源等必要的辅助借口;软件组成结构包括应用层、OS层、BSP等。 特点:“专用”计算机系统;运行环境差异大;比通用PC系统资源少;功耗低、体积小、集成度高、成本低;具有完整的系统测试和可靠性评估体系;具有较长的生命周期;需要专用开发工具和方法进行设计;包含专用调试电路;多科学知识集成系统。 开发流程:(1)系统定义与需求分析阶段。(2)方案设计阶段。(3)详细设计阶段。(4)软硬件集成测试阶段。(5)系统功能性及可靠性测试阶段。 二、写出教材图1-1嵌入式系统的组成结构中各英文缩写的中文释义; 答:.OS:操作系统 API:应用程序接口 BSP:板级支持包 Boot:启用装载 HAL:硬件抽象层 SoC/SoPC:片上系统/片上可编程系统 GPIO:控制处理器输出接口 USB:通用串行总线 LCD:液晶显示器 ADC/DAC:模数转换和数模转换 FPGA/CPLD:现场可编程门阵列/复杂可编程逻辑器件 UART/IrDA:通用异步收发传输器/红外线接口 DMA:直接内存访问 CAN:控制器局域网络 Timer/RTC:定时器/实时时钟 MMU/Cache:内存管理单元/高速缓冲存储器

三、比较说明FLASH存储器中NOR型和NAND型FLASH的主要区别;比较说明RAM 存储器中SRAM和SDRAM的主要区别; 答:NORFlash的读取和我们常见的SDRAM的读取是一样,用户可以直接运行装载在NORFLASH里面的代码,这样可以减少SRAM的容量从而节约了成本。NANDFlash没有采取内存的随机读取技术,它的读取是以一次读取一块的形式来进行的,通常是一次读取512个字节,采用这种技术的Flash比较廉价。SRAM是靠双稳态触发器来记忆信息的;SDRAM是靠MOS电路中的栅极电容来记忆信息的。由于电容上的电荷会泄漏,需要定时给与补充,所以动态RAM需要设置刷新电路。但动态RAM比静态RAM集成度高、功耗低,从而成本也低,适于作大容量存储器。所以主内存通常采用SDRAM,而高速缓冲存储器(Cache)则使用SRAM,在存取速度上,SRAM>SDRAM。 四、说明嵌入式系统常见硬件平台种类、典型处理器型号; 答:典型的型号有MIPS处理器、PowerPC处理器、Sparc处理器、ARM处理器、Xtensa系列可配置处理器。 五、嵌入式系统中常用的接口或通信方式有RS232、RS485、BlueTooth、CAN、IrDA、GPRS、SPI、GSM、802.11、SPI、IIC、Ethernet、JTAG等,请根据通信介质是否无线或有线对其进行分类;请根据通信距离从近至远依次排序;请根据通信速度从慢至快依次排序; 答:无线:RS485、BlueTooth、CAN、IrDA、GPRS、GSM、802.11、Ethernet 有线:RS232、SPI、IIC、JTAG 传输距离:RS232、SPI、IIC、JTAG、BlueTooTh、IrDA、RS485、CAN、802.11、GSM、GPRS、Ethernet 传输速度:GSM、GPRS、Blueteeth、IrDA、802.11、CAN、RS232、RS485、Ethernet、IIC、SPI、JTAG 六、列举常见嵌入式操作系统及其特点; 答:源代码公开并且遵循GPL协议 有大量的免费的优秀的开发工具,且都遵从GPL,是开放源代码的。

linux嵌入式实验2

嵌入式实验报告(二) 姓名:董辰辰 学号:111180031 专业:电子信息与科学 一、 实验目的 1、 了解Linux 内核源代码的目录结构以及各个目录的相关内容。 2、 了解Linux 内核各配置选项内容和作用。 3、 掌握Linux 内核的编译过程。 4、 了解嵌入式操作系统中文件系统的类型和作用。 5、 了解JFFS2文件系统的优点以及在嵌入式系统中的作用。 6、 掌握利用busybox 软件制作嵌入式文件系统的方法。 7、 掌握嵌入式Linux 文件系统的挂载过程。 二、实验内容和要求 1、配置完整的内核,尽可能理解配置选项在操作系统中的作用。 2、以 Busybox 为基础,构建一个合适的文件系统。 3、制作ramdiak 文件系统映像。 4、将自己编译生成的内核和文件系统下载进开发板。 5、讨论自己的嵌入式系统所具备的的功能。 6、比较romfs 、ext2fs/ext3fs 、JFFS2等文件系统的优缺点。 三、实验设计和分析 实验分为两个部分:Linux 内核配置编译和文件系统构建。本次实验的目的 就是自己搞一个内核和文件系统。当然自己编写代码是不太可能啦,而是根据 linux 提供的源代码自己配置编译出一个自己的内核,在构建一个自己需要的文 件系统。实验室用的内核版本是2.6.35.7 实验室的开发板有了内核和文件系统 才能够对其进行开发。内核是操作系统最基本的部分,可以说是一个软件,实验 室的开发板有处理器、内存、Flash 闪存等硬件组成,可以说内核是调度它们的 软件,有了内核各种应用程序才能够调用硬件资源,总的来说内核文件是操作系 统的核心,负责系统的进程管理,内存管理,设备和文件管理等,决定着系统的 性能和稳定性。文件系统是操作系统的一个重要组成部分,通过对操作系统所管 理的存储空间的抽象,向用户提供统一的、对象化的访问接口,屏蔽对物理设备 的直接操作和资源管理。我觉得内核的本质其实是程序,而文件系统是设置一些 规则来用来管理存储的,在一个完整的操作系统中两者都是不可或缺的,内核在 加载的时候需要有很多的挂载指令,应该挂载的就是文件系统的文件夹,比如将 proc 文件系统挂载到proc 文件夹,这就是为什么在开发板启动时内核和文件系 本页已使用福昕阅读器进行编辑。福昕软件(C)2005-2009,版权所有,仅供试用。

毕业设计开题报告----基于ARM技术的WIFI无线网络技术研究

毕业设计开题报告----基于ARM技术的WIFI无线网络技术 研究 毕业论文(设计)开题报告 学生姓名学号班级教师姓名职称系别毕设题目基于ARM技术的WIFI无线网络技术研究 1. 查找有关WiFi无线网络的书籍、文章,了解WiFi无线网络技术; 教师资 料2. 调研目前WiFi无线网络的覆盖、应用及发展情况; 布置情况 3. 在各大网站及数据库中查找有关基于ARM技术的WiFi技术研究 的材料; 4. 了解目前流行的WiFi技术应用,选择适合题目研究的技术应用。 1. 通过对相关资源的搜索,了解什么是WiFi,以及它目前的覆盖和应用状况; 学生自主 2. 查询了解WiFi技术、ARM技术的优缺点,以及相关的研究意义; 资料查询 3. 在数据库中查询到有关基于WiFi技术应用和基于ARM的无线网络应用的相关情况论文进行参考,通过论文、书籍的相关内容大概了解研究所需的技术方法; 4. 搜索最新的WiFi无线网络应用,以找到适合毕设研究的项目。 1.研究的意义 随着互联网越来越深入的走进人们的生活,用户对能够随时随地上网的需求越来越迫切,WiFi 无线通信技术也得到了迅速发展。 WiFi是一种可以将个人电脑、手持设备(如PDA、手机)等终端以无线方式 互相连接的技术,它可以帮助用户访问电子邮件、Web和流式媒体。它为用户提供

了无线的宽带互联网访问。同时,它也是在家里、办公室或在旅途中上网的快速、 便捷的途径。WiFi凭借它覆盖范围广、速度快、可靠性高、无需布线、健康安全及 计费便宜等特点已成为当今无线网络接入的主流标准。只要随身携带的电子设备集 成了 WiFi 无线通信终端用户就可以在 WiFi覆盖区域内随时拨打或接听电话、快 速浏览网页、下载或上传音视频文件、收发电子邮件,而无需担心花费太高和网速 太慢等问题。国内外许多地区都提供了WiFi 信号覆盖域,美国等发达国家是目前 WiFi 用户最多的地区,我国的许多大中城市的机场、车站、咖啡厅、酒店、图书开题综述馆等公共场也逐渐被 WiFi 信号所覆盖。 随着 WiFi 信号覆盖范围越来越广,WiFi无线通信技术在各种便携式产品上的应用也将变得越来越多。目前具有WiFi功能的手机也越来越普遍,人们对于基 于WiFi技术的应用的需求越来越大,随着技术的不断发展,各种电子产品都将提 供 WiFi无线接入功能。 ARM 是目前进行便携式电子产品开发的主流芯片,它具有如下特点: 1、体积小、低功耗、低成本、高性能;2、支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件;3、大量使用寄存器,指令执行速度更 快 ;4、

嵌入式系统大作业

嵌入式系统大作业-标准化文件发布号:(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII

基于嵌入式系统的车载GPS导航系统的设计 1 设计目的与功能 1.1 设计目的 随着人们经济基础增强,安全意识增强的基础上,很多人都会选择车载GPS 导航设备,所以制造功能强大,价格低廉的车载GPS导航设备是有很大市场和发展前景的。由于导航仪投入小,外壳模块、芯片等材料市场供应量大,这也是我选择设计车载GPS导航设备的理由。为了满足不同用户的不同需求,我想设计一款内置四维地图系统。 1.2设计功能 1提供准确无误的全3D实景导航; 2附带全国沿途咨询; 3具有视频、音乐播放等娱乐功能。 2.需求分析调研 2.1 产品的硬件组成(型号、类型、电气特性、选择的理由等) (1)处理器:S3C2440A 400MHz,S3C2440A 是三星公司生产推出的基于ARM920T的32位RISC嵌入式微处理器,S3C2440A采用了ARM920T的内核,0.13um的CMOS标准宏单元和存储器单元。 采用ARM920T CPU内核支持ARM调试体系结构。 (2)储存模块:SDRAM , K4M561633-75 , 64MByte Nand FLASH, K9F1208G 64MByte同步动态随机存储器,工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;存储阵列需要不断的刷新来保证数据不丢失;数据不是线性依次存储,而是自由指定地址进行数据读写。 (3)音频模块:PHILIPS公司的UDA1341TS是一块功能强大的专用语音处理芯片。本设计使用的AT91RM9200处理器具有一个IIS音频接口,此接口

淮阴工学院嵌入式系统开发与应用实验报告实验四嵌入式Linux开发环境的搭建

实验四嵌入式Linux开发环境的搭建 一、实验目的 1、了解嵌入式Linux开发环境的作用 2、掌握相关服务器的安装 二、实验准备 硬件:JXARM9-2410教学实验箱,PC机 软件:Windows XP操作系统,ADS集成开发工具 三、实验过程 1、tftp网络配置 (1) 虚拟机网络配置 a. 点击虚拟机-设置,将网络适配器设置为自定义,并 指定虚拟网络为VMnet0。 b. 点击编辑-虚拟机网络参数-主机虚拟网络映射,并 且指定其桥接的网卡

c. Red Hat IP配置 ●点击系统设置-网络,双击eth0配置IP信息如下: 地址:172.20.11.243 子网掩码:255.255.255.0 默认网关地址:172.20.11.254 DNS: 210.29.152.4 ●点击激活,在弹出的对话框点击是按钮 ●

测试网络连接是否正常 方法一:在linux下,点击系统工具-终端,输入命令ping 172.20.11.243 方法二:在主系统中打开命令提示符,输入ping 172.20.11.243 (2)修改tftp的配置文件 a.在终端下输入gedit /etc/xinetd.d/tftp b.修改”disable=yes”为”=no”,点击保存,关闭gedit

c.重启xinetd服务,使刚才的更改生效,在终端里输入, /etc/init.d/xinetd restart d.进入tftpboot文件夹创建一个测试文件testfile e.取得tftpboot文件夹的所有权限,命令chmod 777 /tftpboot f.启动tftp测试上传和下载 2配置NFS服务器 a.设置:开始->系统设置->服务器设置->NFS服务器打开配置对话 框 第一步:点击添加nfs共享 第二步:输入目录/tftpboot 第三步:输入主机172.20.11.243 第四步:基本权限为读/写

相关主题
文本预览
相关文档 最新文档