找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 166|回复: 7
打印 上一主题 下一主题

【转载】 JLINKv9在迅为iTOP-4412精英板上的应用

[复制链接]

11

主题

12

帖子

145

积分

二级会员(20)

Rank: 2Rank: 2

积分
145
跳转到指定楼层
1#
发表于 2017-9-12 10:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

您需要 登录 才可以下载或查看,没有帐号?注册

x

! g6 v7 m4 I9 W) M5 m$ y
本文转自:https://www.amobbs.com/thread-5680586-1-1.html
很多人买迅为iTop4412精英板,在Android或Linux+Qt跑起来后学习开发调试应用程序或驱动,但在linux内核运行前发生了什么?能进行什么开发工作?并没有完整资料。其实,只要一根百元价位的JLINKv9,就可以搭建一个实用的boot阶段程序开发环境,使我们可以深入到貌似神秘的史前时代一探究竟。
我的精英板和JLINKv9刚到手一周左右,花了两三天功夫在环境搭建上,也遇到了一些坑,幸运的是都解决了。下面我就总结介绍一下这几天的工作,希望能对感兴趣的人有所帮助,能抛砖引玉就更好了。当然,在解决问题过程中,除了靠自己积累的知识外,也参考学习了网上的一些资料,在此向作者表示谢意,并尽量列出所参考的文章。
还要声明一点,就是boot阶段的开发当然需要一定的底层硬件知识。虽然本文所涉较少,但还是提醒初学者谨慎操作,以免损坏硬件。
正文:
系统环境:win8.1+VMWare+ubuntu14.04LTS
硬件:iTop4412精英板+JLINKv9调试电缆+SD卡及读卡器。JLINKv9电缆常用JTAG接头是2.54mm间距的大头,精英板上的JTAG接口是2mm间距的小头,所以还需要购买或自制转接板和小头电缆(淘宝售价10元以内)。硬件上一个小坑是我买的JLINKv9的JTAG接口的2脚有3.3V输出(SEGGER手册上写明NC,但有3.3V输出不知为什么),而精英板的JTAG口的1脚和2脚是短路的,这就使得如果不做改动直接连接,就使得JTAG1脚的检测电压是自身2脚输出的3.3V,而不是精英版输出的1.8V,使JLINK识别目标失败。改起来很简单,吧转接板大头和小头2脚间的连线划断就可以了。
关于JLINK软件的安装,只要去SEGGER官网下载最新版的Linux版的DEB安装包,用dpkg命令安装就可以了。还应该在Windows宿主机上安装win版的JLINK软件,这样宿主机也可以识别JLINK,出问题时也可和Linux虚拟机作对照。
首先确认JLINK可以识别4412。把JLINK电缆和串口电缆接好,开启Ubuntu虚拟机,在虚拟机Wokstation->虚拟机->可移动设备 菜单下把串口和SEGGER J-link与虚拟机连接好。开启虚拟机串口终端(我用的C-kermit),精英板上电进入u-boot状态。进入JLINK安装目录(缺省/opt/SEGGER/JLink/),运行 JLinkExe,如果没问题应该有VTref = 1.8xxV的目标检测电压输出(如果检测电压为3.3V,说明JTAG转接板未改,参考前面)。由于JLINKv9不直接支持4412,所以不能自动识别目标,需手动连接。按提示输入connect命令,依次输入“CORTEX-A9”,回车,“J”,回车,“-1,-1”,回车,4000,回车。界面如下图。
此时若JLINK和目标板软硬件没问题,则4412的cortex-a9 CPU#0能被识别,这正是我们期待的。截图如下。
在此基础上可以做些实验,发现如下问题:cp15协处理器读写命令无效;只能调试单核;0x02000000物理地址开始的内存无法读取,而这是关键的iROM和iRAM映射区域,史前文明的秘密宝藏就在这里。第一个问题可以在编程时用汇编指令读cp15到通用寄存器然后设置相应断点来一定程度规避。第二个问题对于调试boot阶段程序来说不是问题,因为这时本来只有CPU#0运行。第三个问题就得认真对待了。从上图可以看到此时MMU使能,物理地址已不能直接应用。我还没有深究此版本u-boot源码,不知道该段物理地址是否映射到某个虚拟地址。换个思路,可以重写一个BL2阶段的程序,该程序为目的只是一个无限循环,用JLinkExe的halt命令终止其运行,就可保留BL1刚结束而BL2刚开始时的现场。让我们实现这个思路看看会得到什么。
我利用较新版(建议2017以后)的u-boot源码改造生成SPL的方式产生所需要的BL2程序。ARM交叉工具链用Linaro的arm-eabi-系列。按照上述思路,只要在u-boot源码的arch/arm/cpu/armv7/start.S的第一条指令改为跳转自身地址的指令即可。但经过实验,以此生成的BL2程序在精英板运行后,JLinkExe检测到的VTref为0V,JLINK无法连接目标。由此猜想是BL2程序缺少必要的电源管理设置。参考网上文章http://blog.csdn.net/techping/article/details/69911634,找到该文中arch/arm/mach-exynos/board.c的电源管理部分代码,根据相关4412的寄存器地址,查4412手册知道要设置PSHOLD引脚输出,又对照精英板的原理图,发现PSHOLD信号确实是控制电源管理芯片的,就用汇编实现此功能。修改后的start.S入口处代码如下:
reset:
7 T1 E2 C' w; t' g  |3 q/* Allow the board to save important registers */
/ w( D) L' c' Y; m& n, _# k# r/*b save_boot_params*/
( J3 h8 f  h! C( X$ V6 Zldr r1, =0x1002330c  S, y4 ~2 b' O7 Y* M
ldr r0, [r1]- x% B/ A. d- b2 I. l! a0 Q
dmb0 q7 x  \5 F; V' f
ldr r2, =0x300
; N" r7 z; |0 I* V" Qorr r0, r0, r2
0 {9 l: C7 H/ {9 V$ }! ]dmb. p1 v' j; ]; r. U- T( I! q. t
str r0, [r1]" S* J, l$ D; l* Q

  q' V* ^/ [* W3 @* w8 C$ }) Qldr r1, =0x11000c087 h5 n( e  r" b4 E+ l0 Y! V
mov r0, #07 a) m; l3 o) u- d0 T( s
dmb  E/ |" `+ s  x/ r- Q4 |7 w
str r0, [r1]" g% g1 y9 i) y2 L- f4 }0 g
reset11:
/ o, ~; Q7 ?% b) F: D; }breset11
u-boot的配置用什么?也是这篇网文建议用三星origen板子的配置改。只要把include/configs/origen.h中#define CONFIG_SPL_TEXT_BASE 的值改为0x02023400即可。这个地址是三星提供的BL1程序对它引导的BL2程序的要求。此配置项的作用就是生成SPL程序的lds链接文件的.ram区域的起始地址和设置.TEXT段的起始地址(二者相同),这可在SPL的Makefile文件中看到。然后在新版u-boot目录下运行make origen_defconfig,配置完后交叉编译新版u-boot即可。此时在新版u-boot源码目录下生成spl目录,其中的u-boot-spl.bin就是我们要得到的BL2程序镜像。
下面的工作需要借用精英板光盘提供的CodeSign4SecureBoot_SCP目录文件和旧版u-boot源码。在旧版u-boot源码下有个mkbl2程序是用来生成最终14K大小的bl2.bin文件的,但此程序有问题,用它生成会产生Unsupported szie错误。网上有改过的该程序源码,为方便我直接粘贴如下
/* 5 }4 T0 K3 g) r/ u; {" b
* Copyright (c) 2010 Samsung Electronics Co., Ltd. $ b" k' I- {9 i  g5 R" C/ ~
*              http://www.samsung.com/ 8 o/ B% ^' ^& I
* 5 Y2 n. R+ S! Q5 G) B
* This program is free software; you can redistribute it and/or modify
' X/ P4 p; ]3 v * it under the terms of the GNU General Public License version 2 as
. G7 E& r' M& d2 O) o * published by the Free Software Foundation.
9 h- h! b4 b) }; m9 O, G" j */  
3 |$ _- C+ M) f7 [0 E  2 ^) G# O; Y( @$ H8 f
#include <stdio.h>  3 B0 ~2 z* B6 L* C- F& R
#include <string.h>    ]" K! \3 I& C) H, |/ @6 p" T2 D
#include <stdlib.h>    F4 F, b$ ]8 `, p- ^8 s& b: S
  
  ~: _( G% c7 c' T$ vint main (int argc, char *argv[])  % L) W  N2 Y4 N& a! `( {- g+ _! M
{  5 {  U, d8 n. x% H# V7 Z
    FILE        *fp;  
# n4 n2 M; A$ Q$ ^5 g9 U    unsigned char   src;  : e& q) W4 v; D& A; v
    char        *Buf, *a;  2 d, i! k- j+ E/ |& G! ~  ~
    int     BufLen;  , Z+ x/ ?1 Z% [
    int     nbytes, fileLen;  7 ~1 Z: Q" l& }0 w; W
    unsigned int    checksum = 0;  0 Z4 g# [/ e+ T. J, r* P% W0 j" Z
    int     i;  
, U$ G/ |$ u/ X0 C6 ~1 O  2 x+ }3 V7 t5 Z0 d  f$ J
    if (argc != 4)  $ U/ L, A' S6 G
    {  ; [6 a- ?  d9 }( `5 Z9 k8 Q. A
        printf("Usage: mkbl1 <source file> <destination file> <size> \n");  
0 k; S9 Q2 a+ E0 V: q, w/ R7 F        return -1;  
; I0 [2 E9 ?  D) A: R  y    }  
5 s. o1 Q8 |3 \: ]; A/ \  2 ?# q+ k0 d! |' q# Y3 g% L
    BufLen = atoi(argv[3]);  
' s3 Z. W) J) a5 d/ Q% ^% Q    Buf = (char *)malloc(BufLen);  
; i+ T! p6 ?0 y( i& ]$ X2 p    memset(Buf, 0x00, BufLen);  
" z- z" L2 v. I5 V+ o4 i  2 H& _. a# x8 U- E
    fp = fopen(argv[1], "rb");  
& V: a! u3 d: h    if( fp == NULL)  - c: g2 Y5 B: x; E0 b
    {  * D4 b  Q; u2 }  e
        printf("source file open error\n");  * S3 W& T5 ~2 k7 f7 M" c/ T1 f% |
        free(Buf);  
; P" W4 p  x( {& s# d& Q- T: Y" _        return -1;  9 m: v8 y8 t& ^# ^; ^" w
    }  
6 Q4 P8 F, K+ t6 [  
/ T4 N) t/ w% S& `- L1 G    fseek(fp, 0L, SEEK_END);  5 ~+ W+ w! F! o
    fileLen = ftell(fp);  
/ z4 i8 x8 N5 G! E! @    fseek(fp, 0L, SEEK_SET);  / C) D+ g& j- _0 u6 u4 T
/* # Y" p& ^" B% m1 z$ c! t7 m) j
    if ( BufLen > fileLen ) / L3 ]8 f: a% P! v
    {
4 R' c2 [$ _& K! m, W        printf("Usage: unsupported size\n");
2 }! j! N2 e8 T( z        free(Buf); * G8 q  I! R+ {. ]) D
        fclose(fp);
2 W8 P( @! q  [4 k! j        return -1;
9 {% J& s+ i; q    }
4 t+ s  {) P: c# v2 W' z*/  
) e$ t" m1 A" v9 g. T    //nbytes = fread(Buf, 1, BufLen, fp);  
7 B( i/ E! l$ D7 s! f4 }# D    if(BufLen > fileLen)  2 l8 A: S- e7 F! x: I
        nbytes = fread(Buf, 1, fileLen, fp);  
- w3 A7 v: S0 i8 W    else  
: g1 D1 @& j0 j1 X7 {( H        nbytes = fread(Buf, 1, BufLen, fp);  ; c. p9 }7 e9 j- u0 J9 e
/*
5 ^0 G# z$ b* y7 |1 Y    if ( nbytes != BufLen )
0 C+ @0 h& E9 G    { . ~2 _% J2 e: n- h9 H- C4 I
        printf("source file read error\n"); ; ?. ?) ~/ A+ B" `
        free(Buf); 3 w6 j* o/ U! s
        fclose(fp);   @6 H0 c* q+ W; ?+ d
        return -1;
3 D7 a, R& P! ~2 f9 B( e5 m# w    }
0 q5 S( g& _( M# W/ R*/  
4 `# h9 b, V0 ?    fclose(fp);  & U: t5 L& K& Q) ^
  
) i3 @- Q- {( X% f. S' _: G    for(i = 0;i < (14 * 1024) - 4;i++)  1 i' A6 k, z2 _1 z& ?( [
    {  7 E  g# u: o( V" m$ P
        checksum += (unsigned char)(Buf);  
8 C! Y# X  y- _: K3 O3 X% F    }  
1 X2 ]; D- W) K/ O8 ]( {    *(unsigned int*)(Buf+i) = checksum;  5 q4 M* y3 B: g7 o" B# F4 N- u* K
  . d# P! l9 W$ A! o
    fp = fopen(argv[2], "wb");  : Z" Z& u5 R3 B2 {! E, B# N' x  ~% R
    if (fp == NULL)  
; a/ M! L' f* B7 M    {  - Q" ~) R% j0 F# _( W
        printf("destination file open error\n");  ! M6 t7 {0 F4 p' c
        free(Buf);  
, v0 O3 G' J$ ?* Y* E        return -1;  5 @! _% o. N+ `( `& P! N4 m
    }  
# f* g) ]8 U' U  Y7 `" r5 S  
$ h, H! U+ P& B$ a% P$ R* o: d    a   = Buf;  
( e0 E6 C# G5 G8 w) W' ^- s% ?- }    nbytes  = fwrite( a, 1, BufLen, fp);  ! ~( z& b' N( {0 E
  
! C" L* X6 |$ D- e, {# M    if ( nbytes != BufLen )  + d$ u, h$ m. M! E3 ?9 ~6 n. C
    {  ( m9 }: e1 _9 O7 M+ l' s8 {
        printf("destination file write error\n");  6 m; o- [9 a8 ]1 k; }
        free(Buf);  
' g- z+ q7 |, V, P        fclose(fp);  
4 N7 C6 J: A" S  s4 ~/ H3 h1 V        return -1;  
  D$ p' a9 a" ]    }  
3 h- L% m7 N( N- N  
1 [! d# O  j' {/ Z) w    free(Buf);  + {" N; R4 z7 l7 j1 W
    fclose(fp);  4 u" B8 W0 s' q
  
2 V- U/ P8 Z3 i( T* M! O% W5 s    return 0;  
  V: M; [; u- h& \/ ^}  
读者可用此源码本地编译生成可用的mkbl2程序来代替旧版的。然后把编译新版u-boot生成的u-boot-spl.bin拷贝在旧版u-boot源码下。在旧版u-boot源码目录下运行如下命令
./mkbl2 u-boot-spl.bin bl2.bin 14336 生成可用的bl2.bin镜像。把bl2.bin拷贝到CodeSign4SecureBoot_SCP目录下,并把旧版u-boot目录下的E4412_N.bl1.bin拷贝到CodeSign4SecureBoot_SCP目录下。在CodeSign4SecureBoot_SCP目录下新建一shell脚本文件my_build_bin.sh,内容如下
#!/bin/sh
8 L$ e/ K/ C& o6 Kcat E4412_N.bl1.bin bl2.bin all00_padding.bin > u-boot-iTOP-4412.bin
: W. e" J, Y* a$ T+ Y4 Pmv u-boot-iTOP-4412.bin ~/iTop/iTop4412_uboot/
其中mv命令的目标目录是我的旧版u-boot源码目录,读者应改为自己的相应路径。
CodeSign4SecureBoot_SCP目录下运行./my_build_bin命令,在旧版u-boot目录下就有u-boot-iTop-4412.bin文件生成,该文件大小正好为24k,就是我们要烧到SD卡的启动镜像,包括BL1和BL2阶段的程序。然后参考ITop4412 精英板手册出厂前首次烧录TF卡方法用旧版u-boot目录下的mkuboot命令制作SD卡。把SD卡插入精英板,拨码开关设置为TF卡启动模式,启动精英板,用JLinkExe连接目标板,此时输出部分截图如下
可以看到此时MMU是关闭的。现在用mem再查看0x02000000物理地址区域,可以访问了!貌似JLINK不支持一次读取大量内存内容,我用savebin命令分次读取了iROM在0x02000000的64k映像,合并成一个文件,并用arm-eabi-objdump反汇编之,就可以弄清完整史前时代的来龙去脉了。下面是iROM程序的反汇编成果的开始部分,有兴趣的读者可以留邮箱,我会把完整的64k iROM程序镜像发给你。
irom:     fileformat binary
% I5 P; T2 x2 o  x* n; N- L8 O8 d( V* U- N$ _! V

6 L7 W& V4 p9 aDisassembly of section .data:! G8 O: c0 o. p+ k, d! n

3 n6 I/ w; ^* Y6 x+ e4 i" |# b0 E00000000 <.data>:% m: L3 B# i0 M4 U0 I+ `
       0:   ea000006   b   0x20
8 h3 J! o8 G/ ^" H# |( j- t/ K, K       4:   eafffffe   b   0x4- i! ~$ f' \' v8 [
       8:   eafffffe   b   0x8
2 y" R& r: A& t       c:   eafffffe   b   0xc
7 T! F3 N, ?3 E+ C      10:   eafffffe   b   0x10
* F9 Y3 i7 q7 \" ]3 j) v( _      14:   eafffffe   b   0x14
; }* Q1 H) Z6 Q! ?3 {" q      18:   ea00301a   b   0xc088
3 |$ L0 E/ u4 [( Y. w      1c:   ea00301b   b   0xc0901 l6 l( T/ ]1 J" S' k" d! g
      20:   e59f01a4   ldr r0,[pc, #420]  ; 0x1cc6 d5 [1 k+ T* M$ _
      24:   e3a01000   mov r1,#0
3 Y  O  F, r1 c' i9 V( h* `      28:   e5801000   str r1,[r0]- ^& @* e9 W' {# \6 G4 }8 O
      2c:   e59f019c   ldr r0,[pc, #412]  ; 0x1d0
8 {- y$ P( X6 U0 }( g      30:   e5900000   ldr r0,[r0]' t+ Q& O' @% H
      34:   e200003e   and r0,r0, #62 ; 0x3e
/ R& i! j8 G8 y, p1 b* j      38:   e330003e   teq r0,#62 ; 0x3e
5 T. [: ?1 K0 r% s2 k% w9 U      3c:   1a00000d   bne 0x789 g# K5 y! |0 n: }! ?# H( c3 H
      40:   e59f018c   ldr r0,[pc, #396]  ; 0x1d4
9 c- ~+ ]8 M, f! v      44:   e5900000   ldr r0,[r0]& t8 c2 h) K9 r7 H: Y; \
      48:   e3100001   tst r0,#1/ p1 A* i! a3 H1 U
      4c:   1a000009   bne 0x78
/ N7 M$ d2 Y, }! Z      50:   e59f2180   ldr r2,[pc, #384]  ; 0x1d8% D* y6 `! @7 ?) M9 l$ n
      54:   e5922000   ldr r2,[r2]
' y# R# L$ n  a. y      58:   e3e03000   mvn r3,#0" W# p& j( e+ F5 W
      5c:   e1120003   tst r2,r3
; E/ l# l+ w  e      60:   1a000003   bne 0x74/ {' D$ V; s' K8 S
      64:   e59f0170   ldr r0,[pc, #368]  ; 0x1dc
# n5 H3 m) |7 [( d# }      68:   e59f1170   ldr r1,[pc, #368]  ; 0x1e0+ j) C" g1 Q; b
      6c:   e5801000   str r1,[r0]
: x0 S& ]" V$ p' |) l$ g$ h      70:   e59f2164   ldr r2,[pc, #356]  ; 0x1dc4 @/ u8 D/ O+ m+ L
      74:   e1a0f002   mov pc,r2" Q2 Z) b" g& Q* d: ?, o
      78:   e321f0d3   msr CPSR_c,#211    ; 0xd3: p8 l7 u) b& E4 w1 v
      7c:   ee110f10   mrc 15,0, r0, cr1, cr0, {0}
& F+ E( n; X) I; X- X" w      80:   e3c00001   bic r0,r0, #1+ W5 |+ S% Z% ?( |3 H+ ]  v# q
      84:   e3c00004   bic r0,r0, #4( A9 i1 K, P7 F+ i  y- i- ?' `3 i
     88:   e3a02281    mov r2,#268435464  ; 0x10000008/ M: i& ~) m$ i, T6 u9 S) x
      8c:   e5923000   ldr r3,[r2]
1 f( X% S- W1 H/ ^- d      90:   e3130501   tst r3,#4194304    ; 0x400000
$ n9 `" @8 T$ T+ u( |      94:   0a000002   beq 0xa4
0 u8 M2 G# Y2 e3 Z3 f( T      98:   e3c00a01   bic r0,r0, #4096   ; 0x10002 L0 a& I) o4 G& o. x" }
      9c:   ee010f10   mcr 15,0, r0, cr1, cr0, {0}
: F( Q* E: v2 t. W2 b- }! q      a0:   ea000006   b   0xc0
+ W: u1 e5 S6 F+ D4 c1 E: m7 Q2 O      a4:   e3a00000   mov r0,#0, W4 V* l& C& F
      a8:   ee080f17   mcr 15,0, r0, cr8, cr7, {0}
- C" H8 U/ W7 Y. ]& G( q2 W; K2 s; t      ac:   ee070f15   mcr 15,0, r0, cr7, cr5, {0}  |) G: z) M$ d
      b0:   eb0022ea   bl  0x8c60
- ?3 R' A- |/ B5 Q8 Q      b4:   ee110f10   mrc 15,0, r0, cr1, cr0, {0}. Z- ]3 W5 W+ C
      b8:   e3800a01   orr r0,r0, #4096   ; 0x1000
, e4 z$ H. ^3 O$ q9 I: u7 h0 h6 O      bc:   ee010f10   mcr 15,0, r0, cr1, cr0, {0}. h/ a/ {0 m( D( w" b
      c0:   ee10cfb0   mrc 15,0, ip, cr0, cr0, {5}& v% R. O8 f5 Y  W+ m% L
      c4:   e20cc003   and ip,ip, #3
4 `# G" N, b9 |1 g! X9 ^" U: ?# q$ a      c8:   e59f2114   ldr r2,[pc, #276]  ; 0x1e4
* R  y" O+ s$ G- W6 v$ T; y& O" [  e7 l      cc:   e082010c   add r0,r2, ip, lsl #2
+ m5 g2 T" I* _+ [, a8 g; [" L      d0:   e35c0000   cmp ip,#0( {0 C: g- |% \. a2 g
      d4:   1a0022da   bne 0x8c44
' F* K' c: V  U5 n/ {      d8:   e59f0108   ldr r0,[pc, #264]  ; 0x1e8
2 j" ]* P5 m: W& s. A# I& a      dc:   e5900000   ldr r0,[r0]
" Y2 c# n6 M  h7 T% n% Q4 ]' m      e0:   e3a01102   mov r1,#-2147483648    ; 0x80000000
( c- M3 J$ H/ L      e4:   e1100001   tst r0,r1
9 U5 ]( E7 u- n/ I" [5 y      e8:   0a000024   beq 0x180
, h" M1 x; J8 l, p8 {9 p3 `( O3 o" s      ec:   e59f00f8   ldr r0,[pc, #248]  ; 0x1ec; T( d+ `% r' P( I+ b3 m* d
      f0:   e5900000   ldr r0,[r0]* n6 I; I4 ]0 S/ `( c. V0 n
      f4:   e3100001   tst r0,#1
  z- c5 `. p2 m: s& a      f8:   0a000020   beq 0x180
. b8 P+ s& @5 u( s+ j. s      fc:   e59f00ec   ldr r0,[pc, #236]  ; 0x1f0- P/ Q3 X, s: c( l( s
     100:   e5900000   ldr r0,[r0]
至此,我们的史前时代探险完成了。作为一个有价值的副产品,我们也建立了用JLINK搭建的boot阶段程序调试环境。下面我简要介绍下gdb调试环境的搭建。
退出JLinkExe,运行JLinkGDBServer -device CORTEX-A9 -speed 4000命令,则JLinkGDBServer就与目标建立了连接,并等待gdb连入。在另一个虚拟终端下运行arm-eabi-gdb命令,在(gdb)提示符下输入target remote localhost:2331命令与JLinkGDBServer建立连接,用file命令关联新版u-boot源码spl目录下的u-boot-spl文件,就可以进行源码级调试了。这样,我们就搭建了一个实用的boot阶段程序调试环境,并可以借用新版u-boot源码平台开发属于自己的boot程序了。
附主要参考的文章链接:
http://blog.csdn.net/techping/article/details/69911634
http://www.cnblogs.com/humaoxiao/p/4166230.html
http://blog.csdn.net/lizuobin2/article/details/52832857

& a7 ^) k. G* K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

33

主题

1228

帖子

3259

积分

版务助理

Rank: 6Rank: 6

积分
3259
2#
发表于 2017-9-12 13:41 | 只看该作者

0

主题

4

帖子

56

积分

二级会员(20)

Rank: 2Rank: 2

积分
56
3#
发表于 2017-9-22 10:30 | 只看该作者
多谢分享教程,学习了,好贴

6

主题

8

帖子

87

积分

二级会员(20)

Rank: 2Rank: 2

积分
87
4#
发表于 2017-10-9 15:03 | 只看该作者
1111111111111111,好贴

0

主题

7

帖子

36

积分

二级会员(20)

Rank: 2Rank: 2

积分
36
5#
发表于 2017-10-27 11:17 | 只看该作者
好贴,受益了

25

主题

168

帖子

473

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
473
6#
发表于 2017-10-28 19:16 | 只看该作者
好贴,受益了

13

主题

175

帖子

152

积分

二级会员(20)

Rank: 2Rank: 2

积分
152
7#
发表于 2017-11-25 20:25 | 只看该作者
晕 在我帖里面找偶像啊??

0

主题

2

帖子

14

积分

二级会员(20)

Rank: 2Rank: 2

积分
14
8#
发表于 2018-2-9 10:32 | 只看该作者
赞,,好文章
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-11-27 13:26 , Processed in 0.093261 second(s), 35 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表