15.1.硬件工作原理及原理图查阅
(1)LED物理特性介绍:LED本身有2个接线点,1个是LED的正极,1个是LED的负极。LED这个硬件的功能就是点亮或者不亮,物理上想要点亮一颗LED只需要给它的正负极上加正电压即可,要熄灭1颗LED只需要去掉电压即可。
(2)查阅原理图了解板载LED硬件接法:查阅原理图,发现GEC210开发板上共有6颗LED(4颗在核心板上D1~D4,2颗在底板上D1和D3);底板D1接法(VDD_5V(5V直流)通过低压差稳压芯片(AMS1086CM-3.3)输出VDD_IO(3.3V直流);即D1正极接3.3V(VDD_IO),负极接地,则该颗LED只要上电就会常亮,即该颗LED是电源指示灯);底板D3接法(D3正极接3.3V,负极接SoC上的1个引脚(GPG0_3));核心板D1~D4的接法(正极接3.3V(VDD_REG1_IO),负极接了SoC上的1个引脚(D1~D4分别对应GPJ2_0~GPJ2_3))。
(3)如何点亮及熄灭LED(GPIO):因为正极已经定了(3.3V),而负极接在了SoC的引脚上,可以通过SoC中编程来控制负极的电压值,因此我们可以通过程序控制负极输出低电平(0V),这样在正负极上就有了压差,LED即可点亮。


15.2.数据手册查阅及相关寄存器浏览
(1)GPIO概念的引入:通用输入输出(general purpose input output);GPIO就是芯片的引脚(芯片上的引脚有些不是GPIO),作为GPIO的这类引脚,其功能和特点是可以被编程控制其工作模式和电压高低等;我们设计电路时就把LED接在了某个GPIO上,这样我们就可以通过编程控制GPIO的模式和输入输出值来操控LED的亮灭。
(2)阅读数据手册GPIO部分:当我们想要通过编程操控GPIO来操作LED时,我们首先需要通读一下S5PV210的数据手册中有关于GPIO的部分,这部分在数据手册的Section2.2中。
(3)GPIO相关的寄存器介绍:我们当前要操作的硬件是LED,但是LED实际是通过GPIO来间接控制的,所以我们要操作的硬件是SoC的GPIO,要操作这些GPIO,必须通过设置它们的寄存器(见图1)。
(4)真正操控LED的硬件主要为GPJ2CON和GPJ2DAT,点亮LED编程步骤:1.操控GPJ2CON寄存器中,选中output模式;2.操控GPJ2DAT寄存器,相应的位设置为0。


15.3.从零开始手写汇编点亮LED
(1)GPxCON和GPxDAT寄存器分析:GPJ2端口共有8个引脚(GPJ2_0~GPJ2_7),相关的重要寄存器为GPJ2CON和GPJ2DAT;GPJ2CON寄存器可设置8个引脚的工作模式(32/8=4,每个引脚对应4bit,譬如GPJ2_0对应的bit位为bit0~bit3);譬如给bit0~bit0写入0b0001,GPJ2_0引脚就工作在输出模式。
(2)从零开始写代码操作寄存器:1.硬件接法和引脚(GPJ2_0、GPJ2_1、GPJ2_2、GPJ2_3),低电平亮/高电平灭;2.GPJ2CON(0xE0200240)寄存器和GPJ0DAT(0xE0200244)寄存器;3.工程管理Makefile、mkv210_image.c、write2sd.sh等文件。
(3)编译下载运行:编译时用我们的工程管理,直接make编译得到led_usb.bin和led_sd.bin;下载运行可使用usb启动dnw下载,也可以用sd卡烧录下载。


15.4.汇编实现LED闪烁效果
(1)闪烁效果原理分析:闪烁 = 亮 + 延时 + 灭 + 延时 + 亮 + 延时…。
(2)延时函数原理:在汇编中实现延时即用一些没有目的的代码来执行消耗时间,达到延时的效果。
(3)汇编编写延时函数:用某个寄存器存放某个数字,然后在循环中每个循环里给数字减1,然后再判断这个数字的值是否为0.如果为0则停止循环,如果不为0则继续循环。
(4)汇编编写及调用函数:汇编中整个汇编的主程序是死循环,该死循环是我们汇编程序的主体,类似于C中的main函数;其它函数必须写在该主死循环程序外面,不然会出错。
(5)总结:汇编编写delay延时函数时,要注意函数的初始化和函数体的位置,不能把初始化写在了循环体内;汇编中调用函数用bl指令,子函数中最后用mov pc, lr来返回。


15.5.汇编实现流水灯效果
(1)流水灯原理分析:流水灯又叫跑马灯,即挨着的LED依次点亮熄灭(同时只有1颗LED亮)。
(2)流水灯编写:用位取反操作符来轻松愉快的实现单颗LED点亮流水效果。
(3)编程操控某个硬件的步骤:1.分析硬件工作原理;2.分析原理图;3.分析数据手册;4.找到相关的SFR;5.写代码设置寄存器得到想要的效果。


15.6.反汇编的原理和objdump工具
(1)arm-linux-objdump -D led.elf > led_elf.dis(-D表示反汇编;>左边的是elf的可执行程序;>右边的是反汇编生成的反汇编程序);objdump是gcc工具链中的反汇编工具,作用是由编译链接好的elf格式的可执行程序反过来得到汇编源代码。
(2)反汇编的原因:1.逆向破解,黑客大神常用的手段;2.调试程序时,反汇编代码可以帮助我们理解程序(我们学习时使用objdump主要目的是这个),尤其是在理解链接脚本、链接地址等概念时;3.把C语言源代码编译链接生成的可执行程序反汇编后得到对应的汇编代码,可以帮助我们理解C语言和汇编语言之间的对应关系,有助于深入理解C语言。
(3)反汇编文件的格式:汇编(assembly)反汇编(dissembly);标号地址(00000000)、标号名字(<_start>:)、指令地址(标号地址+偏移量(00000000+0))、指令机器码(e59f0060)、指令机器码反汇编到的指令(ldr r0, [pc, #96]);ARM汇编中用地址池方式来实现非法立即数。
(4)初识指令地址:下载烧录执行的bin文件,内部其实是很多条指令机器码,每条指令机器码都有对应的地址,该地址是链接时ld指定的(ld根据程序员提供的链接脚本来指定)。
(5)反汇编工具帮助我们分析链接脚本:反汇编的时候得到的指令地址是链接器考虑了链接脚本之后得到的地址,而我们写代码时通过指定连接脚本来让链接器给我们链接合适的地址;但有时候我们写的链接脚本有误(或者我们不知道该链接脚本执行效果如何),此时可通过阅读反汇编文件来分析该链接脚本的效果,确认是否达到了我们的目的。



15.led_s_v1.0/
led.S
/** 公司:XXXX* 作者:Rston* 博客:http://blog.csdn.net/rston* GitHub:https://github.com/rston* 项目:编写LED程序及反汇编工具* 功能:汇编实现点亮第1个和第3个LED灯。*/#define GPJ2CON 0xE0200280
#define GPJ2DAT 0xE0200284.global _start                      // 把_start链接属性改为外部,则外部其它文件可看见_start
_start:// 第1步:将0x00001111写入0xE0200280位置(GPJ2CON)// 即设置GPJ2CON0~GPJ2CON3共4个引脚为输出模式ldr r0, =((1<<0) | (1<<4) | (1<<8) | (1<<12))   ldr r1, =GPJ2CON                // 通过=号看出使用的是ldr伪指令,因为编译器可判断该立即数str r0, [r1]                    // 是合法立即数/非法立即数。// 寄存器间接寻址,把r0中的数写入到以r1中的数为地址的内存中去// 第2步:将0b00001010写入0xE0200284位置(GPJ2DAT)// 即设置GPJ2DAT0~GPJ2DAT3为0b00000101ldr r0, =((1<<0) | (0<<1) | (1<<2) | (0<<3))ldr r1, =GPJ2DATstr r0, [r1]b .                             // 死循环,程序停留在这里,.表示当前指针的地址// 裸机程序是直接在CPU上运行的,CPU会逐行运行裸机程序直至CPU断电关机// 如果裸机程序全部被执行完了CPU就会跑飞(跑飞结果未定义)// 为了不让CPU跑飞即在整个裸机程序执行完后添加死循环

15.led_s_v2.0/
led.S
/** 公司:XXXX* 作者:Rston* 博客:http://blog.csdn.net/rston* GitHub:https://github.com/rston* 项目:编写LED程序及反汇编工具* 功能:汇编实现4个LED灯的闪烁。*/#define GPJ2CON 0xE0200280
#define GPJ2DAT 0xE0200284.global _start                      // 把_start链接属性改为外部,则外部其它文件可看见_start
_start:// 第1步:将0x00001111写入0xE0200280位置(GPJ2CON)// 即设置GPJ2CON0~GPJ2CON3共4个引脚为输出模式ldr r0, =((1<<0) | (1<<4) | (1<<8) | (1<<12))   ldr r1, =GPJ2CON                // 通过=号看出使用的是ldr伪指令,因为编译器可判断该立即数str r0, [r1]                    // 是合法立即数/非法立即数。// 寄存器间接寻址,把r0中的数写入到以r1中的数为地址的内存中去
flash:  // 第2步:点亮4个LED灯ldr r0, =((0<<0) | (0<<1) | (0<<2) | (0<<3))ldr r1, =GPJ2DATstr r0, [r1]// 第3步:延时bl delay                        // 使用bl调用延时函数,会将返回地址保存在lr寄存器中// 第4步:熄灭4个LED灯ldr r0, =((1<<0) | (1<<1) | (1<<2) | (1<<3))ldr r1, =GPJ2DATstr r0, [r1]// 第5步:延时bl delay                        // 使用bl调用延时函数,会将返回地址保存在lr寄存器中b flash                         // 继续循环,使用b跳转,不保存返回地址到lr寄存器中// 延时函数,函数名为delay
delay:ldr r2, =9000000ldr r3, =0x0
delay_loop:sub r2, r2, #1                  // r2 = r2 - 1cmp r2, r3                      // cmp会影响CPSR中的Z标志位,若r2等于r3,则Z标志位置1,下句中的bne不成立bne delay_loopmov pc, lr                      // 函数调用返回

15.led_s_v3.0/
led.S
/** 公司:XXXX* 作者:Rston* 博客:http://blog.csdn.net/rston* GitHub:https://github.com/rston* 项目:编写LED程序及反汇编工具* 功能:汇编实现4个LED流水灯。。*/#define GPJ2CON 0xE0200280
#define GPJ2DAT 0xE0200284.global _start                      // 把_start链接属性改为外部,则外部其它文件可看见_start
_start:// 第1步:将0x00001111写入0xE0200280位置(GPJ2CON)// 即设置GPJ2CON0~GPJ2CON3共4个引脚为输出模式ldr r0, =((1<<0) | (1<<4) | (1<<8) | (1<<12))   ldr r1, =GPJ2CON                // 通过=号看出使用的是ldr伪指令,因为编译器可判断该立即数str r0, [r1]                    // 是合法立即数/非法立即数。// 寄存器间接寻址,把r0中的数写入到以r1中的数为地址的内存中去
flash:  // 第2步:点亮LED0ldr r0, =~(1<<0)ldr r1, =GPJ2DATstr r0, [r1]bl delay                        // 第3步:点亮LED1ldr r0, =~(1<<1)ldr r1, =GPJ2DATstr r0, [r1]bl delay                        // 第4步:点亮LED2ldr r0, =~(1<<2)ldr r1, =GPJ2DATstr r0, [r1]bl delay                        // 第3步:点亮LED3ldr r0, =~(1<<3)ldr r1, =GPJ2DATstr r0, [r1]bl delay                        // 使用bl调用延时函数,会将返回地址保存在lr寄存器中b flash                         // 继续循环,使用b跳转,不保存返回地址到lr寄存器中// 延时函数,函数名为delay
delay:ldr r2, =9000000ldr r3, =0x0
delay_loop:sub r2, r2, #1                  // r2 = r2 - 1cmp r2, r3                      // cmp会影响CPSR中的Z标志位,若r2等于r3,则Z标志位置1,下句中的bne不成立bne delay_loopmov pc, lr                      // 函数调用返回

15.编写LED程序及反汇编工具相关推荐

  1. python程序分析,用Python编写分析Python程序性能的工具的教程

    用Python编写分析Python程序性能的工具的教程 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  用Python编写分析Python程序性能的工具的教程.tx ...

  2. 15款Java程序员必备的开发工具(转)

    如果你是一名Web开发人员,那么用膝盖想也知道你的职业生涯大部分将使用Java而度过.这是一款商业级的编程语言,我们没有办法不接触它 对于Java,有两种截然不同的观点: 一种认为Java是最简单功能 ...

  3. 15款最佳的MySQL管理工具和应用程序

    [转]15款最佳的MySQL管理工具和应用程序@TOC 工欲善其事,必先利其器.几乎每个开发人员都有最钟爱的 MySQL 管理工具,它帮助开发人员在许多方面支持包括 PostgreSQL,MySQL, ...

  4. 推荐给入门级的程序员,15款不一样的编程工具,易上手!

    俗话说:巧妇难为五米之炊,程序员也要有好的软件,才会更高效率的提高自己的工作效率,那作为入门级别的程序员,几款趁手的编程软件是最需要的.除了几款基本的软件,其实还有很多很很酷的编程工具.接下来就为大家 ...

  5. Java黑皮书课后题第5章:*5.15(显示ASCII码字符表)编写一个程序,打印ASCII字符表从‘!‘到‘~‘的字符。每行打印10个字符。ASCII码表如附录B所示。数字之间用一个空格字符隔开

    *5.15(显示ASCII码字符表)编写一个程序,打印ASCII字符表从'!'到'~'的字符.每行打印10个字符.ASCII码表如附录B所示.数字之间用一个空格字符隔开 题目 题目概述 '!'到'~' ...

  6. 程序员的吸星大法-IDA反汇编工具初探

    看过<<笑傲江湖>>的朋友一定知道吸星大法吧,这是一种可以吸取他人内功来使自己功力增长的神功,(段誉的北冥神功也是这样, 扯远了...).对于程序员来说,增长自己编程功力的一个 ...

  7. 银联银行卡卡号java_编写Java程序,使用单例模式,创建可以生成银联借记卡号的工具类...

    编写Java程序,使用单例模式,创建可以生成银联借记卡号的工具类 编写Java程序,使用单例模式,创建可以生成银联借记卡号的工具类,银联借记卡号是一个 19 位的数字,卡号以"62" ...

  8. 12.15有一种数叫回文数,正读和反读都一样,如12321便是一个回文数。编写一个程序,从命令行得到一个整数,判断该数是不是回文数

    有一种数叫回文数,正读和反读都一样,如12321便是一个回文数.编写一个程序,从命令行得到一个整数,判断该数是不是回文数 package Text6;import java.util.Scanner; ...

  9. (转)逆向与反汇编工具

    第 1 章           逆向与反汇编工具 了解反汇编的一些背景知识后,再深入学习IDA Pro之前,介绍其他一些用于二进制文件的逆向工程工具,会对我们学习有所帮助.这些工具大多在IDA之前发布 ...

  10. 《例说51单片机(C语言版)(第3版)》——1-5 MCS-51的开发流程与工具

    本节书摘来异步社区<例说51单片机(C语言版)(第3版)>一书中的第1章,第1.5节,作者:张义和,王敏男,许宏昌,余春长,更多章节内容可以访问云栖社区"异步社区"公众 ...

最新文章

  1. 报错解决:alueError: When using data tensors as input to a model, you should specify the `steps_per_epoch
  2. Node安装node-sass总是下载超时问题解决
  3. 页面中color颜色值_HTML+CSS 基础知识-入门概括-颜色与单位
  4. 江苏省二级c语言考试软件下载,江苏省二级c语言上机考试例题集1-20
  5. windows下bash终端--git-bash总汇
  6. mysql怎样查询表的信息!
  7. 387. First Unique Character in a String QuestionEditorial Solution
  8. 华为mate40RS能升级鸿蒙,mate40Pro和40RS能用上鸿蒙系统吗
  9. BugkuCTF-WEB题web16备份是个
  10. 单播、多播(组播)和广播的区别
  11. java后端尝试使用WebOffice在线编辑
  12. chm文件打开中文乱码
  13. 以Skyline问题来看hard问题在面试的时候如何解决?
  14. 商标注册流程和周期是什么
  15. 一级计算机基础不小心关掉了怎么重新打开,电脑不小心覆盖了文件该如何恢复-电脑自学网...
  16. 谷歌浏览器将ssd盘上的缓存目录迁移至机械硬盘
  17. 计算机术语bootstrap,Bootstrap及jackknife刀切法中文讲义.pdf
  18. Win10 批量修改文件名
  19. 数学建模笔记——插值拟合模型(二)
  20. 腾讯2021年第六届「共 见」运维技术沙龙

热门文章

  1. gdb 查看是否 栈溢出_64位Linux栈溢出教程
  2. linux系统工具栏调整,Ubuntu 7.10任务栏不见了的解决办法
  3. Codeforces Round #507 (Div. 2) B - Shashlik Cooking(模拟)
  4. 浏览器下载文件的方法总结
  5. 解决 Could not find common.jar (android.arch.core:common:1.0.0). 错误
  6. 微信网页授权接口 对象存储
  7. c#语言输出字符串长度,C#获取字符串长度(string.Length)
  8. Hadoop2.7.1+Hbase1.2.1集群环境搭建(5)hbase安装
  9. matlab实现转换音频格式文件,mp3到wav的转换
  10. 联想裁员与全球化背景下的知识阶层失业