不用虚拟机 会断开
arm属于RISC架构
1991年,ARM推出第一款嵌入式RISC处理器,即ARM6。
arm 指令集是32 位宽,Thumb指令集是16位宽的
4.备注:arm指令集和thunb指令集区别?
arm指令集一条指令编译成机器码,占用4字节空间
thumb指令集一条指令编译成机器码,占用2字节空间
指令宽度:一条指令编译成机器码,机器码占用代码段空间
T[5]:状态位
T= 0:ARM状态
T= 1:thumb状态
ARM指令集是4字节对齐,Thumb指令集是2字节对齐的
复位后,ARM处理器处于SVC模式,ARM状态
/*系统一上电-->SVC模式
从SVC模式切换到user用户模式
SVC模式: CPSR[4:0] = 10011
USER模式:CPSR[4:0] = 10000
通过仿真查看,需要禁止IRQ/FIQ,ARM状态
ARM的Cortex-A处理器总共有43 个寄存器,System模式下使用17个寄存器
5.寄存器个数:cortex系列寄存器一个43个,arm系列寄存器一个37个
ARM处理器中优先级别最高的异常为SVC
3.异常源具有优先级,复位优先级最高
ARM数据处理指令中不是立即数的是0x08000012
0x08000012---->>>0000 1000 0000 0000 0000 0000 0001 0010
oprand2:第二操作数
1)立即数
2)有效数:如果一个数取反之后是立即数
3)寄存器
APTCS规定中,推荐子函数参数最大为4个
APTCS规定中,栈是满减栈
在用ARM汇编编程是,其寄存器有多少个别名,通常PC是指R15 , LR是指R14,SP 是指R13。
下列条件码中表示不相等的是NE
cond:条件码
如果汇编语言中没有加条件码,指令默认无条件指令
如果汇编语言中有加条件码,指令有条件指令
CPSR寄存器中反映处理器状态位的是T位
下面属于ARM子程序调用指令的是B/BL
若R1=2000H,(2000H)=0x86,(2008H)=0x39,则执行指令LDR R0,[R1,#8] !后R0的值为 地址2008H数据0x39
LDR 读 后面读给前面 数据2000+8 给R0 地址R1+8给R1
存储一个32位数0x2168465到2000-0000H~2000-0003H四个字节单元中,若以大端模式存储,则2000-0000H存储单元的内容为 0x02
谈谈你对UART总线的理解,以及你用UART总线做过哪些实验,需将总线特点和协议描述清楚。————》》》》》》
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,通常称作UART) 是一种串行异步收发协议,应用十分广泛。UART工作原理是将数据的二进制位一位一位的进行传输。在UART通讯协议中信号线上的状态位高电平代表’1’低电平代表’0’。当然两个设备使用UART串口通讯时,必须先约定好传输速率和一些数据位。
UART协议规定,当总线处于空闲状态时信号线的状态为‘1’即高电平起始位之后就是要传输的数据,数据可以是5,6,7,8,9位,构成一个字符,一般都是8位。先发送
最低位
最后发送最高位
。数据位传送完成后,要进行奇偶校验,校验位其实是调整个数,串口校验分几种方式:
1.无校验(no parity)
2.奇校验(odd parity):如果数据位中’1’的数目是偶数,则校验位为’1’,如果’1’的数目是奇数,校验位为’0’。
3.偶校验(even parity):如果数据为中’1’的数目是偶数,则校验位为’0’,如果为奇数,校验位为’1’。
4.mark parity:校验位始终为1
5.space parity:校验位始终为0
停止位:数据结束标志,可以是1位,1.5位,2位的高电平。数据传输速率使用波特率来表示,单位bps(bits per second),常见的波特率9600bps,115200bps等等,其他标准的波特率是1200,2400,4800,19200,38400,57600。举个例子,如果串口波特率设置为9600bps,那么传输一个比特需要的时间是1/9600≈104.2us。
串口实验 RCC_MP_AHB4ENSETR寄存器功能:使能GPIOB和GPIOG时钟使能RCC_MP_AHB4ENSETR[1] = 1 RCC_MP_AHB4ENSETR[6] = 1 RCC_MP_APB1ENSETR寄存器功能:使能UART4时钟使能 RCC_MP_APB1ENSETR[16] = 1
.GPIOx_MODER寄存器功能:设置PB2和PG11引脚为复用功能
GPIOB_MODER[5:4] = 10 -------->设置PB2引脚为复用功能
GPIOG_MODER[23:22] = 10-------->设置PG11引脚为复用功能
GPIOx_AFRL寄存器功能:设置PB2引脚的复用功能为UART4_RX
GPIOB_AFRL[11:8] = 1000 -------->设置PB2引脚的复用功能为UART4_RX
.GPIOx_AFRH寄存器功能:设置PG11引脚的复用功能为UART4_TX
GPIOG_AFRH[12:15] = 0110 -------->设置PG11引脚的复用功能为UART4_TX
USART_CR1:串口控制寄存器,设置数据位宽度,以及对应位使能
USART_CR2:设置串口停止位位数
USART_BRR:设置串口波特率
USART_TDR:设置串口发送数据寄存器
USART_RDR:设置串口接收数据寄存器
USART_ISR:设置串口状态位
USART_PRESC:串口分频器
USART_CR1[28][12]:设置8位数据位宽度
USART_CR1[15]:设置串口16倍采样率
USART_CR1[10]:设置串口无奇偶校验位
USART_CR1[3]:设置串口发送寄存器使能
USART_CR1[2]:设置串口接收寄存器使能
USART_CR1[0]:设置串口使能
USART_CR1[13:12] = 00 :设置串口1位停止位
USART_RDR接收数据寄存器,用来接收数据
USART_TDR发送数据寄存器,用来发送数据
USART_PRESC设置串口不分频
键盘输入一个字符,字符进行+1,并在串口进行打印
例如:键入输入一个'a',串口打印'b'
键盘输入一个字符串,串口回显字符串
简述ARM发生异常时,ARM核心会自动做那些事情,从异常返回时,我们要做哪些事情——————》》》》
简述一下常用的汇编指令有哪些,以及汇编指令格式,至少说出5个——————————》》》》》》
编写汇编代码实现一下运算要求
make all
make menuconfig
<board_name> defconfig
fail B 0xC2000000
printk
strip
readelf
objcopy
addr2line
shell 通配符
setenv
内核配置,哪个关键词包含下一级kconfig source
F
在内核配置中,哪个关键词是来创建一个选项菜单 config
保存 .config
ext4
F C
查找u-boot启动代码时,需要通过哪个文件来查找它的入口函数名及入口文件
AB ipaddr serverip
F
nfs挂载根文件系统,设置uboot环境变量ipaddr serverip bootargs
ABD ipaddr serverip bootargs
make uImage make dtbs
F
根文件系统依赖nfs进行挂载
只有linux系统才会用到nfs,uboot不使用nfs
nfs路径是通过uboot传入的
针对我们当前移植的系统,根文件系统和nfs,下面描述正确的是 BCD
【产品阶段系统部署方式(项目完成)】
uboot —>EMMC/SD卡
uImage —>EMMC/SD卡
ramdisk.img —>EMMC/SD卡
1> 将内核镜像uImage烧写到EMMC中
tftp 0x41000000 uImage mmc write 0x41000000 0x800 0x4000
2>. 将根文件系统镜像ramdisk.img烧写到EMMC中
tftp 0x41000000 ramdisk.img mmc write 0x41000000 0x20800 0x20800
3>. 设置uboot的启动参数
setenv bootcmd mmc read 0x48000000 0x800 0x4000; mmc read 0x49000000 0x20800 0x20800; bootm 0x48000000 0x49000000
saveenv
setenv bootargs root=/dev/ram rw initrd=0x49000040,0x1000000 rootfstype=ext4 init=/linuxrc console=ttySAC0,115200
saveenv
到此如果串口工具软件可以通过U-boot自启动并且进入根文件系统,则表示完成
一、准备文件 二、使用ums命令将镜像文件烧写到EMMC更改拨码开关启动方式为EMMC启动方式011 3.1 启动流程 3.2 组网(
设置uboot中的环境变量信息
serverip:服务器ip地址
ipaddr:板子ip地址
netmask:子网掩码
gatewayip:网关
) 3.3 使用tftp命令下载程序到开发板中 3.4 设置自启动参数(bootargs) 3.5 启动内核 3.6 设置自启动命令(bootcmd)
系统部署
系统启动
一、准备文件 二、系统部署 三、系统启动 4.1 mmc read命令 4.2 mmc write命令 五、产品部署 5.1 将镜像文件下载到EMMC中
1.开发板上电,进入uboot交互模式
2.部署uImage镜像文件,下载到EMMC中
3,部署设备树镜像文件,下载到EMMC中
4.部署ramdisk.img镜像文件,下载到EMMC中
5.2 设置bootargs参数
FSMP1A> setenv bootargs root=/dev/ram console=ttySTM0,115200 init=/linuxrc initrd=0xc5000040,0x1000000 rw rootstype=ext4
FSMP1A> saveenv
6.1 将镜像文件搬移到内存中
6.2 设置bootcmd参数
FSMP1A> setenv bootcmd "mmc dev 1;mmc read 0xc2000000 0x2000 0x4000;mmc read 0xc4000000 0x10000 0x200;mmc read 0xc5000000 0x21500 0x21500;bootm 0xc2000000 0xc5000000 0xc4000000"
FSMP1A> saveenv
Saving Environment to MMC... Writing to MMC(1)... OK
将根文件系统(rootfs)制作成根文件系统镜像(ramdisk.img)
进入到ubuntu的家目录 cd ~
执行如下命令制作一个大小为8M的镜像文件 dd if=/dev/zero of=ramdisk bs=1k count=8192
将该镜像格式化为ext2格式 mkfs.ext2 -F ramdisk
将该镜像文件挂载到ubuntu下的/mnt目录下 sudo mount -t ext2 ramdisk /mnt
删除库文件中的符号表减小库文件体积: su root$ arm-none-linux-gnueabi-strip lib/*
将制作的根文件系统中所有的文件拷贝到该镜像中 :sudo cp -a /home/linux/nfs/rootfs/* /mnt/
解除挂载 sudo umount /mnt
压缩镜像 gzip --best -c ramdisk > ramdisk.gz
使用mkimage为镜像文件添加校验头然后生成可用的镜像ramdisk.img
mkimage -n “ramdisk” -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
将制作生成的根文件系统镜像拷贝到tftp的下载目录下并修改其权限
cp ramdisk.img /home/linux/tftpboot/$ chmod 777 /home/linux/tftpboot/ramdisk.img
在图形化界面中进入到“Device Drivers —>”菜单,
再进入“[*] Block devices —>”菜单,将 “RAM block device support” 选为“Y”,
将“Default RAM disk size (kbytes)”修改为“8192”
配置完成后保存退出。
回到内核源码的顶层目录下重新编译内核源码(将交叉编译器切换到4.5.1版本*****低版本)
make uImage
将生成的uImage文件拷贝到tftp服务器的下载目录中:
cp arch/arm/boot/uImage /home/linux/tftpboot/
chmod 777 /home/linux/tftpboot/uImage
3,将新生成的内核镜像uImage和根文件系统镜像ramdisk.img烧写到EMMC中并从EMMC中启动测试
ubuntu@ubuntu:day5$ make modname=chrdev arch=x86