章鱼哥听歌

本文介绍了ARM架构的历史,强调其作为RISC架构的特点,详细讲解了ARM和Thumb指令集的区别,以及处理器的工作模式和寄存器使用。此外,还涉及到ARM汇编语言编程中的条件码、异常管理和子程序调用。最后,讨论了UART总线的通信协议,包括数据位、校验位、停止位和波特率,并展示了在开发板上配置UART的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 不用虚拟机 会断开

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值