Jtag一直是传说中的神器. 以前刷dd-wrt变砖的时候就想用它玩玩,结果当时把无线路由忙刷好了, 买回来的线就一直在抽屉中沉睡. 这几天玩嵌入系统, 把那根简陋的线找出来, 看看原理, 准备施展一番, 没想到居然左右连不上设备...今天终于连接成功, 整理一下遇到的问题. 因为是公司的设备, 还好能找到电路图.
1. JTAG插座引脚标准混乱, 每个厂家板上的接口都不一样, 有5脚的, 有10针, 14针, 20针, 脚距也有2.5和2.0之分, 更要命的针数一样了, 每个针的定义还不一样, 吐血啊. 一定要找来电路图看看清楚再接. 虽然都是弱信号(没电源)烧不坏, 接错了还是挺费神的.
2. 别相信电路板的上JTAG标志. 有的设备有两个三个JTAG接口,有的Jtag结构被隐藏到很多排线中间. 一开始看到一个口就插, 结果后来问问专家, 那个不是cpu的.
3. 别相信网上的软件, 很可能他们对驱动的支持不好. 比如h-jtag就不能识别我的mips设备, 又没log, 报个错误就退出, 看不出哪里的问题. h-jtag可以自定义并口管脚, 但还是不行. 最后还是openocd帮忙搞定, 因为还有源码可以看.
4. 用并口线, 我的因为是当初刷路由用的, 非常简陋, 能肉眼看出接线方法:
TDI: 2
TDO: 13
TCK: 3
TMS: 4
bin\openocd-0.6.0-rc2.exe -f parport.cfg 运行提示如下:
Info : only one transport option; autoselect 'jtag'
parport port = 0x378
adapter speed: 3 kHz
Info : clock speed 3 kHz
Warn : There are no enabled taps. AUTO PROBING MIGHT NOT WORK!!
Error: JTAG scan chain interrogation failed: all ones
Error: Check JTAG interface, timings, target power, etc.
Error: Trying to use configured scan chain anyway...
Warn : Bypassing JTAG setup events due to errors
Warn : gdb services need one or more targets defined
反正看到all ones就是没连接成功.
配置文件如下:
parport_port $_PARPORTADDR
parport_cable wiggler
adapter_khz 3
通过openocd文档可以看到它支持很多类型的并口, 但是并未给出这些并口的接线图.
网上做wiggler的电路图找来看看, 居然跟我不一样, 但是我这个鸟接法属于神马接法呢?
看看源码: http://openocd.sourceforge.net/doc/doxygen/html/parport_8c_source.html
这里面用二维数组定义了设备引脚, 但是这些1/2/4/0x10/0x40/0x80都代表什么脚呢? 特别是TDO, 我接在13脚, 怎么看都没有. 再往后看源码, 原来这些数字代表了IO操作中的bit位.
看这里: http://www.elecfans.com/baike/computer/taishiji/20100309183757.html
第二脚是并口的D0, 是电脑数据寄存器的0位, 掩码是1, 所以tck掩码2, tms掩码4, 并口13脚是select输入信号,对应状态寄存器的bit4, 掩码0x10. 所以去源码里面对应一下, 就tmd是DLC5, 这就是broadcom无线路由常用jtag连线的引脚. 上网一搜, 果然tjtag这个软件支持dlc5和wiggler, 估计早期版本缺省就是dlc5, 所以大家都用这种线救砖. 国内bjtag是不是说也是它?
现在改改配置文件: parport_cable dlc5
然后认真的把线按照机器电路图接上去, 运行openocd, 成功:
Warn : AUTO auto0.tap - use "... -irlen 5"
Warn : gdb services need one or more targets defined
好了, 后面可以慢慢把玩jtag命令, 然后加载cpu配置, 用gdb调试.
折腾了半天, 最好去淘宝买个标准的wiggler接口, 输出5根线做成散的, 想用什么接口自己插, 万能!
bin\openocd-0.6.0-rc2.exe -f parport.cfg -f scripts\board\pic-p32mx.cfg
telnet localhost 4444
reg //可以看到寄存器
halt //很慢, 可以中断系统
resume //恢复执行.
软引用是java中的一个新的特性:软引用(Soft Reference)的主要特点是具有较强的引用功能。只有当内存不够的时候才回收这类内存,因此在内存足够的时候,他们通常不被回收。另外,这些引用 对象还能保证在Java 抛出OutOfMemory异常之前,被设置为null。他可以用于实现一些常用资源的缓存,实现Cache的功能,保证最大限度的使用内存而不引起 OutOfMemory异常。
以下摘自官方文档:
软引用技术的引进使Java应用可以更好的管理内存,稳定系统,防止系统内存溢出,避免系统崩溃。因此在处理一些占用内存大而且声明周期较长,但使用并不 频繁的对象时应尽量应用该技术。但事物总带有两面性的,有利也有弊,在某些时候对软引用的使用会降低应用的运行效率与性能,例如:应用软引用的对象的初始 化过程较为耗时,或者对象的状态在程序的运行过程中发生了变化,都会给重新创建对象与初始化对象带来不同程度的麻烦,有些时候我们要权衡利弊择时应用。
软引用类似于一个包装的集合对象,如果Java虚拟机的内存不足,就会自动的回收掉,集合里面存放的对象应用非常适合做缓存。
面试题:若引用和软引用的区别:
WeakReference:
弱引用对象,它们并不禁止其指示对象变得可终结,并被终结,然后被回收。弱引用最常用于实现规范化的映射。
假定垃圾回收器确定在某一时间点上某个对象是弱可到达对象。这时,它将自动清除针对此对象的所有弱引用,以及通过强引用链和软引用,可以从其到达该对象的针对任何其他弱可到达对象的所有弱引用。同时它将声明所有以前的弱可到达对象为可终结的。在同一时间或晚些时候,它将那些已经向引用队列注册的新清除的弱引用加入队列。
///////////////////
SoftReference:
软引用对象,在响应内存需要时,由垃圾回收器决定是否清除此对象。软引用对象最常用于实现内存敏感的缓存。
假定垃圾回收器确定在某一时间点某个对象是软可到达对象。这时,它可以选择自动清除针对该对象的所有软引用,以及通过强引用链,从其可以到达该对象的针对任何其他软可到达对象的所有软引用。在同一时间或晚些时候,它会将那些已经向引用队列注册的新清除的软引用加入队列。
软可到达对象的所有软引用都要保证在虚拟机抛出 OutOfMemoryError 之前已经被清除。否则,清除软引用的时间或者清除不同对象的一组此类引用的顺序将不受任何约束。然而,虚拟机实现不鼓励清除最近访问或使用过的软引用。
此类的直接实例可用于实现简单缓存;该类或其派生的子类还可用于更大型的数据结构,以实现更复杂的缓存。只要软引用的指示对象是强可到达对象,即正在实际使用的对象,就不会清除软引用。例如,通过保持最近使用的项的强指示对象,并由垃圾回收器决定是否放弃剩余的项,复杂的缓存可以防止放弃最近使用的项
1、配置环境变量。
首先应该安装jdk1.5到sun的官方网站去下载就行 http://www.sun.com 安装jdk 设置(具体值根据自己的计算机上的资源而定): JAVA_HOME=c:\jdk1.5; classpath=%java_home%\lib\tool.jar;%java_home%\lib\td.jar;%tomcat%\lib;%tomcat%\lib\servlet-api.jar;
2、编译servlet程序
注意classpath里要有%tomcat%\lib\servlet-api.jar;,否则会发生编译错误.
3、配置web.xml文件
<servlet> <servlet-name>HelloJsp</servlet-name> <servlet-class>HelloJsp</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloJsp</servlet-name> <url-pattern>/servlet/HelloJsp</url-pattern> </servlet-mapping>
4、把编译好的class文件放在WEB-INF\classes包内或指定的目录下.
5、运行.
源码参考附件