电子电路
此分类为PCB学习笔记

Avr Hex 反编译实现

学了大半个月的PCB,突然想对单片机编译好的代码进行反编译。于是对指令集以及操作码(OpCode)进行了对照分析,发现可行。具体的实现方式,按照分析的流程做了一张图。

微信截图_20191126164417.png

实现结果

微信截图_20191126165118.png

BascomAvr waitms 卡住问题

当单片机运行到这个延迟函数的时候会出现卡住的现象,无法继续往下执行。

解决办法:更改m128def.dat为m103def.dat,使用bascom官方的IDE进行编译而不是proteus,即可解决。

原因:atmega128兼容103模式问题,如果你熔丝位勾选了103兼容模式,那么你编写的时候就要用m103def.dat,反之用m128def.dat

屏幕快照 2019-11-27 下午9.02.06.png

这主要是寄存器的一些使用问题,而waitms恰恰用到了这些寄存器。

这个问题的解决办法是我从国外某个论坛看到的,事实证明它是可行的。由于Bascom国内用的很少,所以建议多逛逛国外网站。

时钟周期 机器周期 指令周期

时钟周期:也称之为振荡周期。这里的振荡就像钟表一样,振荡一次走1秒,连续的振荡产生振荡脉冲,钟表持续走下去。所以时钟周期是一个时间向量。具体的计算:时钟频率的倒数,这里的时钟频率指的是晶振的频率,因为时钟周期的产生是依靠晶振实现的,所以一般单片机CPU外围电路必须加晶振,有些CPU内带振荡,实际这个振荡并非晶振产生的,而是由振荡电路产生的,所以它们是不一样的东西。如果说一个晶振的频率是12Mhz(兆赫兹),那么它的时钟周期就是1/12us(纳秒),也就是12的倒数,单位是:纳秒。所以说选择晶振频率越大,CPU执行速度越快。当然也不是可以选择无限大,这里需要具体的参考CPU数据手册,一般都有上限值。晶振产生的波形是正弦波,连续的正玄波就是脉冲,而CPU执行需要这样的脉冲信号来进行指令的读取执行等操作。CPU的时钟周期也是CPU完成一项原子性操作的时间向量,也就是说:CPU在1个时钟周期内只能做一件事,比如说读指令。不过有些CPU架构在一个时钟周期内并不能完成读指令,所以又引进了一个概念:机器周期。


机器周期:1个机器周期内只能做一件原子性操作:取指令,寄存器读、寄存器写、等。1个机器周期等于若干个时钟周期,这里的比例关系需要看具体的CPU架构,比如说51单片机用的CPU就是1个机器周期等于12个时钟周期。然后就可以具体的计量一个原子性操作具体需要多长时间,比如说取指令在某个CPU架构下就可能需要3个机器周期,寄存器读可能需要5个机器周期。


指令周期:一条指令执行所需要的时间,这里的时间指的是机器周期。这里的指令是指的一条完整的指令执行下来。比如说:访问指令:先取指令,然后在进行访问。这样的指令算下来就需要2个机器周期。取指令需要1个机器周期,进行访问需要1个机器周期。这个不是很好理解,就像a=1+2看着是一条指令,但是如果编译器没有优化的前提下,它映射到CPU上指令是非常多的。所以指令周期理解一下就好,意思就是一条指令完整的运行后所花的时间,这里的时间是机器周期。


晶振为什么两端老是加电容:这个是晶振设计上的要求,要想晶振起振,必须有一个负载电容。只有你的外部电路中的电容值等于晶振内部设计的负载电容值时,晶振才会发生振荡。想要深入了解晶振可以Google搜索一下相关说明。


写到这里我突然想起IO堵塞的问题,一个IO堵塞后指令是否会堵塞,不过现在想来,这是不一样的东西,一个是CPU指令的触发,一个是系统的执行问题。而且还有时间片的存在。想来不能一起考虑。


个人理解,如有错误还望指出。

AutoDeskEagle SparkFun

本博客前面文章有介绍SparkFun库,但是发现Arduino有一些电路符号依旧无法打开,比如说排针。在进行右键打开元件库的时候发现是一个叫做SparkFun.lbr的库,所以从网络上下载安装后完美打开。

屏幕快照 2019-11-16 上午1.16.27.png

上述就是SparkFun封装库里的排针。不过我发现和Eagle自带的排针封装Pinhead差不多,连尺寸我量了一下都是一样的。