您的位置:首页 > 其它

15.编写LED程序及反汇编工具

2016-04-05 16:16 288 查看
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)反汇编工具帮助我们分析链接脚本:反汇编的时候得到的指令地址是链接器考虑了链接脚本之后得到的地址,而我们写代码时通过指定连接脚本来让链接器给我们链接合适的地址;但有时候我们写的链接脚本有误(或者我们不知道该链接脚本执行效果如何),此时可通过阅读反汇编文件来分析该链接脚本的效果,确认是否达到了我们的目的。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: