嵌入式程序复习_第1页
嵌入式程序复习_第2页
嵌入式程序复习_第3页
嵌入式程序复习_第4页
嵌入式程序复习_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一 写出下列各条指令的执行含义 1 ADD R0 R0 1 指令实现的功能是将 R0 1 的结果送 R0 是保存 2 ADD R0 R1 R2 指令实现的功能是将以 R2 中的内容为地址的单元 中的值与 R1 相加 结果送 R0 保存 3 LDR R0 R1 4 指令实现的功能是将 R1 的内容加 4 后送 R0 4 LDR R0 R1 4 指令实现的功能是将 R1 的内容加 4 后送 R0 然后 R1 的内容自增 4 个字节 5 B Lable 程序无条件跳转到标号 Lable 处执行 MOV R1 R0 指令实现的功能是将寄存器 R0 的值传送到寄存器 R1 7 CMP R1 R0 指令实现的功能是寄存器 R1 的值与寄存器 R0 的值相减 根据结果设置 CPSR 的标志位 8 CMN R1 R0 指令实现的功能是将寄存器 R1 的值与寄存器 R0 的值相加 根据结果设置 CPSR 的标志位 9 ORR R0 R0 3 该指令设置 R0 的 0 1 位 其余位保持不变 10 MRS R0 SPSR 传送 SPSR 的内容到 R0 11 CMP R1 R2 指令实现的功能是寄存器 R1 的值与寄存器 R2 的值相减 根据结果设置 CPSR 的标志位 12 MRS R0 CPSR 传送 CPSR 的内容到 R0 13 MOV R2 R0 指令实现的功能是将寄存器 R0 的值传送到寄存器 R2 14 ADD R1 R1 3 指令实现的功能是将 R1 3 的结果送 R1 是保存 15 ADD R2 R1 R0 指令实现的功能是将以 R0 中的内容为地址的单元 中的值与 R1 相加 结果送 R2 保存 16 LDR R1 R0 4 指令实现的功能是将 R0 的内容加 4 后送 R1 17 LDR R1 R0 4 指令实现的功能是将 R0 的内容加 4 后送 R1 然后 R0 的内容自增 4 个字节 18 AND R0 R0 3 该指令保持 R0 的 0 1 位 其余位清零 19 B 0 x1200 跳转到绝对地址 0 x1200 处执行 20 CMN R1 R2 指令实现的功能是将寄存器 R1 的值与寄存器 R2 的值相加 根据结果设置 CPSR 的标志位 1 写一条 ARM 指令 完成操作 r1 r2 4 MOV R1 R2 LSL 2 2 写一条 ARM 指令 完成操作 r1 r2 3 ADD R1 R2 R2 LSL 1 3 初始值 R1 23H R2 0FH 执行指令 BIC R0 R1 R2 LSL 1 后 寄存 器 R0 R1 的值分别是多少 R0 21H R1 23H 4 初始值 R2 5 R3 9 R4 3 执行指令 SUBS R2 R3 R4 LSR 2 后 寄 存器 R2 R3 的值分别是多少 R2 9 R3 9 5 ADDR0 R0 R0 LSL 2 执行结果 R0 5 R0 ADDR5 R3 R1 LSL 2 R5 R3 R1 4 SUB R1 R1 R2 LSR 2 R1 R1 R2 4 因为 R2 右移 2 位相当于 R2 除以 4 LSL n 逻辑左移 n 位 1 n 31 低端空位补 0 LSR n 逻辑右移 n 位 1 n 32 高端空位补 0 6 LDR R2 R3 0 x0C 前变址 传数前计算地址 读取 R3 0 x0C 地址上的存储单元的内容 放入 R2 STR R1 R0 4 R0 4 R1 R0 R0 4 符号 表明指令在完成数据传送后应该更新基址寄存器 否 则不更新 属于回写前变址 LDR R0 R1 4 后变址 先进行 R1 R0 操作然后 R1 4 R1 操作完毕后 R1 R1 4 不需要 号 7 多寄存器寻址即是一次可传送几个寄存器值 允许一条指令传送 16 个寄存器的任何 子集或所有寄存器 多寄存器寻址指令举例如下 LDMIA R1 R2 R7 R12 将 R1 指向的单元中的数据读出到 R2 R7 R12 中 R1 自动增加 LDMIA R0 R1 R2 R3 R4 R1 R0 R2 R0 4 R3 R0 8 R4 R0 12 STMIA R0 R2 R7 R12 将寄存器 R2 R7 R12 的值保存到 R0 指向的存储单元中 R0 自动增加 STMIA R0 R1 R7 将 R1 R7 的数据保存到存储器中 存储指针在保存第一 个值之后后增加 增长方向为向上上增长 R0 R1 R0 4 R2 R0 8 R3 R0 12 R4 R0 16 R5 R0 20 R6 R0 24 R7 R0 保持自动增值 8 LDR R2 R3 0 x0C 读取 R3 0 x0C 地址上的一个字数据内容 放入 R2 属前变址 参看教材第 125 页 STR R1 R0 4 R0 4 R1 R0 R0 4 符号 表明指令在完成数据传送后应该更新基址寄存器 否则不更新 属回写前变址 LDR R1 R0 R3 LSL 1 将 R0 R3 2 地址上的存储单元的内容读出 存入 R1 属前变址 9 写一段 ARM 汇编程序 循环累加队列 myarray 中的所有元素 直到碰上零值 元素 结果放在 r4 中 程序框架如下 补充代码完成上述功能 AREA total CODE READONLY ENTRY start MOV r4 0 ADR r0 myarray 在此补充代码 loop LDR r1 r0 4 ADDr4 r4 r1 CMPr1 0 BNEloop stop B stop myarray DCD 0 x11 DCD 0 x22 DCD 0 x0 END 10 并编写了如下的汇编程序 问 现执行上述程序 请列出 R0 R1 R2 的最终值 并告知整个程序的功能 R0 1 R1 2 R2 1 功能 对 R0 和 R1 分别赋值 0 1 在 R1 为 5 的条件下循环给 R0 赋值 R0 和 R1 之和 给 R1 加 1 取得 RESULT 的地址赋值于 R2 将 R0 的值保存在 RESULT 中 11 读如下程序 test s test c 请列出上述程序执行后 R0 R1 的值 并说明上述程序的作用 R0 31 R1 23 功能 test c 调用 s program 函数 将 54 赋值 R0 23 赋值 R1 两者相减后 赋值给 R0 R0 作为返回值赋值给 num 然后输出 num 12 有如下 C 语言定义的函数 mypro int mypro int a int b a a b return a 请补充完成调用上述函数的汇编程序 实现 11 与 22 相乘 并要求将结果保存在地址为 0 x 处 area test3 code readonly import mypro entry code32 start mov r0 11 1 mov r1 22 2 BL mypro 3 Ldr r3 0 x 4 Str r0 r3 5 END 13 程序段如下 实现下面流程图 试补充编写 ARM 汇编代码 start r2 r3 r2 r3 r3 r3 r2 stop r2 r2 r3 YES NO YESNO 程序 Start CMP r2 r3 SUBLT r3 r3 r2 SUBGT r2 r2 r3 BNE start 14 明指令 STMIAr8 r0 r7 的操作功能 将 R0 R7 八个寄存器中的 32 位数据 存储到 R8 地址指针为起始地址的内存中 地址的操作方式是先操作 后增加 并更新地址 15 汇编程序调用 C 程序的方法为 首先在汇编程序中使用 IMPORT 伪指令事先声明将要调 用的 C 语言函数 然后通过 BL 指令来调用 C 函数 写出注释能把程序写出来 给出程 写出注释能把程序写出来 给出程 序能将注释写出来 序能将注释写出来 程序段 MOV r2 15 MOV r3 9 start 补充代码 stop B stop END 例如在一个 C 源文件中定义了如下求和函数 int prom int x int y return x 调用 prom 函数的汇编程序结构如下 IMPORT prom 声明要调用的 C 函数 MOV r0 1 MOV r1 2 BL prom 调用 C 函数 prom 16 C 程序调用汇编子程序的方法为 首先在汇编程序中使用 EXPORT 伪指令声明被调用的 子程序 表示该子程序将在其他文件中被调用 然后在 C 程序中使用 extern 关键字声明要 调用的汇编子程序为外部函数 写出注释能把程序写出来 给出程序能将注释写出来 写出注释能把程序写出来 给出程序能将注释写出来 例如在一个汇编源文件中定义了如下求和函数 EXPORT prom 声明 prom 子程序将被外部函数调用 prom 求与子程序 prom AND r0 r0 r1 MOV pc lr 在一个 C 程序的 main 函数中对 prom 汇编子程序进行了调用 extern int prom int x int y 声明 prom 为外部函数 void main int a 1 b 2 c c prom a b 调用 prom 子程序 综合编程综合编程 1 教材第六章关于 GPIO 的应用 列举了一个 I O 管脚控制 4 个 LED 发光二极管的例子 但我们实验箱所提供的 LED 发光二极管位于不同的引脚 它们分别使用 了 S3C2410 的 GPC5 GPC6 GPC7 如下图 请修改原程序段以实现三个灯的交替闪烁 注 未用引脚 设置为 input 状态 写出注释能把程序写出来 给出程序能将注释写出来 写出注释能把程序写出来 给出程序能将注释写出来 博创经典版 LED 接线原理图 相关寄存器定义 define rGPCCON volatile unsigned 0 x define rGPCDAT volatile unsigned 0 x define rGPCUP volatile unsigned 0 x 端口初始化 void port init void rGPCCON 0 x56aa rGPCUP 0 xff GPF 所有端口都不加上拉电阻 所有 LED 交替亮灭 void led on off void int i rGPCDAT 0 所有 LED 全亮 for i 0 i i rGPCDAT 0 xE0 所有 LED 全灭 for i 0 i i 2 例程 例程 4 个个 led 灯循环亮灯循环亮 会配置端口会配置端口 define rGPEDAT volatile unsigned 0 x Port E data define rGPEUP volatile unsigned 0 x Pull up control E define rGPHCON volatile unsigned 0 x Port H control define rGPHDAT volatile unsigned 0 x Port H data define rGPHUP volatile unsigned 0 x Pull up control H 主程序 extern void delay int times void xmain void rGPECON rGPECON 1 22 GPE11 设置为 output rGPECON rGPECON 1 24 GPE12 设置为 output rGPHCON rGPHCON 1 8 GPH4 设置为 output rGPHCON rGPHCON 1 12 GPH6 设置为 output while 1 rGPEDAT GPE11 output 0 rGPEDAT 1 12 GPE12 output 1 rGPHDAT 1 4 GPH4 output 1 rGPHDAT 1 6 GPH6 output 1 delay delay rGPEDAT 1 11 GPE11 output 1 rGPEDAT GPE12 output 0 rGPHDAT 1 4 GPH4 output 1 rGPHDAT 1 6 GPH6 output 1 delay delay rGPEDAT 1 11 GPE11 output 1 rGPEDAT 1 12 GPE12 output 1 rGPHDAT GPH4 output 0 rGPHDAT 1 6 GPH6 output 1 delay delay rGPEDAT 1 11 GPE11 output 1 rGPEDAT 1 12 GPE12 output 1 rGPHDAT 1 4 GPH4 output 1 rGPHDAT GPH6 output 0 delay delay 3 通过对通过对 G 口的操作控制口的操作控制 CPU 板左下角的板左下角的 LED1 和和 LED2 实现轮流闪烁 实现轮流闪烁 写出注释能把 写出注释能把 程序写出来 给出程序能将注释写出来 程序写出来 给出程序能将注释写出来 void Main void int flag i Target Init 进行硬件初始化操作 包括对 I O 口的初始化操作 for if flag 0 for i 0 i i 延时 rGPGCON rGPGCON 配置第 6 第 7 位为输出引脚 rGPGDAT rGPGDAT 第 6 位输出为低电平 第 7 位输出高电平 for i 0 i i 延时 flag 1 else for i 0 i i 延时 rGPGCON rGPGCON 配置第 6 第 7 位为输出引脚 rGPGDAT rGPGDAT 第 6 位输出为高电平 第 7 位输出低电平 for i 0 i i 延时 flag 0 4 列举了一个通过按钮产生中断请求的实验例子 但我们实验箱所提供的按钮位于不同的 引脚 如下图 按键接到 INT5 中断 博创经典版中断实验电路图 请修改原程序段以实现实例中要求的功能 即当按钮按下 向 CPU 发出中断请求 当 CPU 受理中断后 进入相应的中断服务程序 通过超级终端的主窗口显示当前进入的中断号 有关 EXTINTn 参数配置请参考附件 EXTINTn 参数 doc 注 直接在原来的程序上修 改 并删除同此实验要求无关的原有代码部分 相关寄存器定义 define rGPFCON volatile unsigned 0 x 端口 F 的控制寄存器 define rEXTINT0 volatile unsigned 0 x 外部中断控制寄存器 0 define rEINTMASK volatile unsigned 0 xa4 外部中断屏蔽寄存器 define rEINTPEND volatile unsigned 0 xa8 外部中断挂起寄存器 define rINTMSK volatile unsigned 0 x4a 中断屏蔽寄存器 define rSRCPND volatile unsigned 0 x4a 源挂起寄存器 define rINTPND volatile unsigned 0 x4a 中断挂起寄存器 中断初始化 下面程序写出注释能把程序写出来 给出程序能将注释写出来 下面程序写出注释能把程序写出来 给出程序能将注释写出来 void int init void rGPFCON rGPFCON 将 GPF0 配置为 EINT5 pISR EINT5 UINT32T int0 int 注册中断处理函数 rEINTPEND 0 xffffff 清除所有外部中断挂起状态 rSRCPND BIT EINT5 清除源的挂起状态 rINTPND BIT EINT5 清除挂起状态 rEXTINT0 rEXTINT0 EINT5 下降沿触发 rINTMSK 打开 INTMSK 中的中断 0 中断处理函数 void irq int0 int void 外部中断 0 处理函数 uart printf EINT0 interrupt occurred n ClearPending BIT EINT0 清除中断源 define ClearPending bit rSRCPND bit rINTPND rINTPND precent write wrong data 清除中断源 注意清除的顺序 要从源头开始清除 5 阅读下列与看门狗有关的寄存器描述 解释每一行代码的功能 阅读下列与看门狗有关的寄存器描述 解释每一行代码的功能 看门狗定时器控制寄存器 WTCON WTCON 的标识位 WTCONBit描 述 初 始 值 Prescaler Value 15 8 预装比例值 有效范围值为 0 255 0 x80 Reserved 7 6 保留00 Watchdog Timer 5 使能和禁止看门狗定时器 禁止看门狗定时器 使能看门狗定时器 0 Clock Select 4 3 这两位决定时钟分频因素 00 1 16 01 1 32 10 1 64 11 1 128 00 Interrupt Generation 2 中断的禁止和使能 0 禁止中断产生 1 使能中断产生 0 Reserved 1 保留0 Reset Enable Disable 0 禁止很使能看门狗复位信号 的输出 1 看门狗复位信号使能 0 看门狗复位信号禁止 1 看门狗定时器数据寄存器 WTDAT 寄 存 器地 址读 写描 述初 始 值 WTDAT0 x读 写看门狗数据寄存器0 x8000 看门狗计数寄存器 WTCNT 寄 存 器地 址读 写描 述初 始 值 WTCNT0 x读 写看门狗计数器当前值0 x8000 define rWTCON volatile unsigned 0 x 第1行 define rWTDAT volatile unsigned 0 x 第2行 define rWTCNT volatile unsigned 0 x 第3行 void watchdog test void rWTCON PCLK 1 8 3 3 1 2 第4行 rWTDAT 7812 第5行 rWTCNT 7812 第6行 rWTCON 1 5 第7行 第 1 3 行 定义看门狗控制寄存器 数据寄存器和计数寄存器为 rWTCON rWTDAT 和 寄存器 地 址读 写描 述初 始 值 WTCON0 x读 写看门狗定控制寄存器0 x8021 rWTCNT 第 4 行 设置看门狗的预装比例值为 分频因素为 1 128 并使能中断 第 5 6 行 对数据寄存器和计数寄存器赋值为 7812 第 7 行 启动看门狗 6 6 阅读下列与定时器有关的寄存器描述 解释每一行代码的功能 阅读下列与定时器有关的寄存器描述 解释每一行代码的功能 1 定时器预分频器配置寄存器 TCFG0 的含义 2 定时器控制寄存器 TCON TCON位表述初始状态 保留 7 5 保留 死区 4 0 死区使无效 1 死区使能0 定时器 0 自动加载 3 0 不自动加载 1 自动加载0 定时器 0 输出反转 2 0 不反转 1 反转0 定时器 0 手动更新位 1 0 无用 1 将 TCNTBn TCMPBn 寄存器的值 装入内部寄存器 TCNTn TCMPn 中 0 定时器 0 开启停止位 0 0 停止定时器 1 开始定时器0 3 DMA 模式与分频选择寄存器 TCFG1 保留 死区长度 预分频器1 预分频器2 位 31 24 23 16 15 8 7 0 描 述 这8位控制死区的长度 一个单元时间的长 度等于定时器0的一单元时间长度 这8位数据等于定时器2 3和4的预分频值 这8位数据等于定时器0和1的预分频值 初始化状态 0 x00 0 x00 0 x00 0 x00 含义 4 定时器计数缓冲寄存器 TCNTBn 程序 define rTCFG0 volatile unsigned 0 x 第 1 行 define rTCFG1 volatile unsigned 0 x 第 2 行 define rTCON volatile unsigned 0 x 第 3 行 define rTCNTB4 volatile unsigned 0 xc 第 4 行 void init Time0 定时器输入时钟频率 PCLK 预分频值 1 分频值 rTCFG0 49 预分频值预分频值 49 rTCFG1 rTCFG1 1 0 4 分频分频 rTCNTB0 50X106 50 4 在在 pclk 50MHz 下 下 1s 的记数值的记数值 rTCNTB1 50 4 rTCMPB0 0 rTCON 1 1 手动更新手动更新 rTCON 清清 手动更新手动更新 位位 rTCON 1 3 1 0 启动定时器 自动重载启动定时器 自动重载 rSRCPND BIT TIMER0 写写 1 来清除标志位

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论