• (原创)LEON3入门教程(三):基于LEON3的SOPC设计以及HELLOWORLD和流水灯


    摘要:通过前两篇博客的介绍,Windows下基本的LEON3开发环境就已经搭建好了。这篇博客将要介绍LEON3 SOPC平台的搭建(使用Cygwin+GRLIB)和 LEON3 IDE(eclipse)的使用,并编写我们的第一个LEON3程序 HelloWord +流水灯。

     更多更新请关注我的博客:@超群天晴 http://www.cnblogs.com/surpassal/

    相关阅读

    (原创)LEON3入门教程(一):什么是LEON3?需要哪些开发工具和软件?

    (原创)LEON3入门教程(二):Cygwin和GRtools的安装与配置

    (原创)LEON3入门教程(四):基于AMBA APB总线的七段数码管IP核设计

     

    一、LEON3的SOPC硬件配置

    1 安装GRLIB

    通过下面的方式安装GRLIB。

    1. 启动Cygwin。

    2. 进入grlib-gpl-1.1.0-b4104.zip所在的目录E:\LEON3\

    这里需要用到两个重要的命令 cdls

    cd: 即 Change Directory 切换目录;

    ls:  即 List,列出目录内容。

    输入 cd .. 返回到home(注:cd 后有两点);

    输入 cd .. 返回到根目录,输入 ls 可以查看当前目录下的子目录和文件;

    输入 cd cygdrive ,进入cygdrive目录,输入 ls 查看本地磁盘驱动器;

    由于grlib-gpl-1.1.0-b4104.zip在e盘的LEON3下,故再输入cd e,进入e盘,再cd LEON3。如图 1所示。 

    图 1 cd和ls 命令的应用

    此时输入ls 命令,可以看到E:\LEON3\下有grlib-gpl-1.1.0-b4104.zip。如图2所示。 

    图 2 查看LEON3文件夹下的内容

    3安装GRLIB。使用 unzip命令: unzip grlib-gpl-1.1.0-b4104.zip。如图3所示。 

    图 3 安装GRLIB 

    安装结束。

    可以看到,之前的LEON3目录下生成了新的文件夹grlib-gpl-1.1.0-b4104,在Windows的资源管理器中可以看到如图4所示的内容。 

    图 4 grlib-gpl-1.1.0-b4104中的内容

    2 配置LEON3

    LEON3的硬件移植最重要的一部分就是根据所需要移植的目标芯片和目标测试板对LEON3的配置文件进行修改和配置。本次移植是在GRLIB发布的grlib-gpl-1.1.0-b4104.版本上进行修改的,修改的源文件是ep3c25,在designs目录下新建leon3-altera-ep2c70-sdr文件夹,作为设计文件文件夹,并将leon3-altera-ep3c25文件夹下内容全部拷贝过去;同样,在boards目录下新建altera-ep2c70文件夹,将altera-ep3c25文件夹下的所有文件拷贝过去。

                                      

    图 5 designs 目录下新建的DE2-70的boards和designs文件夹

    2.1修改文件

    在正式配置前需要对表1所列出的文件进行修改:

    (注意:本小节所涉及的修改文件都可以从https://files.cnblogs.com/surpassal/leon3-de2.rar下载,解压密码是 neurcq ) 

    表 1 修要修改的文件

    需要修改的文件

    文件说明

    boards/Makefile.inc

    所用FPGA芯片具体信息

    boards/leon3mp.qsf

    包含了一个Quartus工程的所有约束,包括工程信息、器件信息、引脚约束、编译约束和用于Classic Timing Analyzer的时序约束

    designs/config.in

    配置信息文件

    designs/leonemp.vhd

    顶层文件

     1.Makefile.inc 

    表2 Makefile.inc文件修改内容

    文件名

    Makefile.inc

    位  置

    E:\LEON3\grlib-gpl-1.1.0-b4104\boards\altera-ep2c70

    修改前的内容

    修改后的内容

    修改说明

    TECHNOLOGY=CYCLONEIII

    PART= EP3C25

    PACKAGE= FC324

    SPEED=-8

    SYNFREQ=60

    QSFDEV=EP3C25F324C8

     

    MANUFACTURER=Altera

    MGCPART=$(PART)F324C

    MGCTECHNOLOGY=CycloneIII

    MGCPACKAGE=F324C

     

    TECHNOLOGY= CYCLONEII

    PART= EP2C70

    PACKAGE= F896

    SPEED=-6

    SYNFREQ=50

    QSFDEV=EP2C70F896C6

     

    MANUFACTURER=Altera

    MGCPART=$(PART)F896C6

    MGCTECHNOLOGY=CYCLONEII

    MGCPACKAGE=F896

     

    将使用的芯片更改为EP2C70F896C6

           
     

    2. leon3mp.qsf

    这个文件需要修改很多了,需要将约束信息修改为配套的开发板,包括引脚、工程、器件、引脚、编译等。由于篇幅限制,这里不提供修改后的文件内容。如有需要可以通过https://files.cnblogs.com/surpassal/leon3-de2.rar进行下载,文件的解压密码是 neurcq。

     

    3. config.in

    配置界面文件,在Cygwin中输入make xconfig启动配置界面就是通过对config.in文件进行读取实现的。需要修改的有两个地方:

    12行:

    mainmenu_name "LEON3 Altera EP3C25 Design Configuration"

    修改为:

    mainmenu_name "LEON3 Altera EP2C70-sdr Design Configuration"

    作用:将界面的标题栏改为“LEON3 Altera EP2C70-sdr Design Configuration”

    39、40行:   

    source lib/gaisler/memctrl/ssrctrl.in

        source lib/gaisler/ddr/ddrsp.in

    修改为:

    source lib/gaisler/memctrl/sdctrl.in

    作用:本次设计使用的片外的SDRAM,需要在SOPC上添加SDRAM的控制器。

     4. leon3mp.vhd

             leon3mp.vhd是顶层文件,由于ep3c25使用了DDRAM等这样DE2-70没有的外设或者存储器,而且使用的SDRAM型号也不一样,导致很多地方引脚的声明是多余或者不够的。所以需要按照DE2-70上实际拥有硬件连接关系对顶层文件修改或者重新编写。由于修改较多,篇幅限制,这里只对重要的几个部分的修改作以说明。如有需要可以通过https://files.cnblogs.com/surpassal/leon3-de2.rar进行下载,文件的解压密码是 neurcq。

    ①      SDRAM 的端口说明

    由于DE2-70使用了两片16位的SDRAM,而LEON3的SDRAM控制器使用的是32位或者64位的SDRAM,所以采用两片SDRAM共用地址总线,将数据总线拼接成32位的方式实现32数据宽度。端口说明如下:

     1     sd     : inout std_logic_vector(31 downto 0);
     2     sddqm  : out std_logic_vector (7 downto 0);  -- sdram dqm    
     3     
     4     sa_0     : out std_logic_vector(12 downto 0);    
     5     sdba_0   : out std_logic_vector(1 downto 0);   -- sdram bank address
     6     
     7     sdclk_0    : out std_logic;                       -- sdram clk output
     8     sdcke_0    : out std_logic_vector ( 1 downto 0);  -- clk en
     9     sdcsn_0    : out std_logic_vector ( 1 downto 0);  -- chip sel
    10     sdwen_0  : out std_logic;                     -- sdram write enable
    11     sdrasn_0 : out std_logic;                     -- sdram ras row addr stb
    12     sdcasn_0 : out std_logic;                     -- sdram cas col addr stb
    13 
    14  
    15     sa_1     : out std_logic_vector(12 downto 0);    
    16     sdba_1   : out std_logic_vector(1 downto 0);   -- sdram bank address
    17     
    18     sdclk_1    : out std_logic;                       -- sdram clk output
    19     sdcke_1    : out std_logic_vector ( 1 downto 0);  -- clk en
    20     sdcsn_1    : out std_logic_vector ( 1 downto 0);  -- chip sel
    21     sdwen_1  : out std_logic;                     -- sdram write enable
    22     sdrasn_1 : out std_logic;                     -- sdram ras row addr stb
    23     sdcasn_1 : out std_logic                     -- sdram cas col addr stb

    ②      SDRAM的实例化

             使用的是gaisler提供的sdctrl控制器实例化本设计中的SDRAM控制器,使用元件例化的方式

     1 sdc : sdctrl 
     2             generic map (
     3                             hindex => 3, 
     4                             haddr => 16#400#, 
     5                             hmask => 16#F00#, 
     6                             ioaddr => 1, fast => 0, pwron => 0, 
     7                             invclk => CFG_SDCTRL_INVCLK, 
     8                             sdbits => 32 + 32*CFG_SDCTRL_SD64, 
     9                             pageburst => CFG_SDCTRL_PAGE
    10                         )
    11             port map     (
    12                             rstn, clkm, ahbsi, ahbso(3), sdi, sdo2
    13                         );

             hindex => 3,指明SDRAM控制在AHB总线的索引是3,haddr => 16#400#,指明的是SDRAM的地址空间从0x4000 0000开始,hmask => 16#F00#,表明SDRAM所占用的空间大小是256M

    2.2 配置LEON3系统结构信息

    通过下面的方法可以配置所需要的LEON3系统结构信息,并将所配置的信息保存在config.vhd文件中。

    1. 还是使用cd命令进入目录:

    E:\LEON3\grlib-gpl-1.1.0-b4104\designs\leon3-altera-ep2c70-sdr

     

    2. 运行make xgrlib命令,图形配置界面如图6所示: 

    图 6 GRLIB 的可视化配置界面

            3. 点击xconfig按钮,弹出设计的配置界面,如图7所示。 

    图 7 设计配置界面

    4. 在这里可以对LEON3基本单元进行配置,本次设计需要对目标技术、锁相环、调试方式以及外设等进行配置,其他选项保持默认值即可。

    目标技术(Target Technology):打开综合(Synthesis)界面,将目标技术跟改为Altera-Others。如图8 所示。 

    图 8目标技术选择 Altera-Others

    锁相环设置:在Clock generation选项中,由于板子上的系统时钟是50M,现在将处理器和总线时钟配置成50M。如图9所示。 

    图 9 锁相环设置

           调试方式:Debug Link选项可以对处理器支持的调试功能进行配置,这里选择Jtag调试,不使用串口调试。如图 10所示。 

    图 10 调试方式设置 

    外设和存储器管理:在Peripherals选项中可以配置Memory controller,并可以对系统的各种内存控制器进行配置对片内RAM/ROM、以太网、UART、中断控制器等基本设备进行配置。如图11  所示。 

    图 11外设选项

           其中的存储器控制器选项界面如图12所示。

    图 12 存储器控制器选项

           再点开 Leon2 memory controller选项,打Leon2 memory controller选项界面。由于本次设计只是用SDRAM,没有使用其他存储器,故不需要使能Leon2 memory controller。

    图 13 不使能Leon2 memory controller

           SDRAM控制器:gaisler提供了符合PC133标准接口的SDRAM控制器。配置如图 14所示,使用32位数据总线。

     

    图 14 使用PC133SDRAM控制器

           片上RAM和ROM:不需要使用片上的ROM和RAM。

    图 15不使用片上的ROM和RAM

           其他外设:其他外设可以任意选择,这次设计中使用了UART、TIMER、32位的GPIO和中断控制器。 其中GPIO是作为外设连接到DE2_70板上的17个LED作为流水灯,UART是作为控制台调试输出,系统初始化后默认波特率为38400,数据位为8位,停止位1位,无校验位

    图 16 其他外设的配置

           至此,外设配置结束。最后,在完成配置后点Save and Exit项即可保存退出配置界面。至此,LEON3系统结构配置已完成,配置文件默认保存在config.vhd中。如图17所示。 

    图 17 结束配置

    2.3 生成可综合的工程文件

    LEON3的系统结构信息配置结束后,接下来需要生成可综合的工程文件并使用Quartus II 软件对生成的工程进行综合、布线和下载。

    1. 单击主面板的 scripts 按钮,生成所需要的文件

     1 make scripts
     2 Scanning libraries
     3   grlib: stdlib util sparc modgen amba
     4   altera: simprims
     5   altera_mf: simprims
     6   cycloneiii: simprims
     7   synplify: sim
     8   techmap: gencomp inferred altera_mf cycloneiii maps
     9   opencores: occomp i2c spi ac97
    10   gaisler: arith memctrl leon3 misc uart sim jtag ddr
    11   esa: memoryctrl
    12   cypress: ssram
    13   hynix: ddr2
    14   micron: sdram ddr
    15   work: debug
    16 testbench.mpf
    17 leon3mp_synplify.prj
    18 leon3mp_dc.tcl
    19 leon3mp.rc
    20 leon3mp.xst

     出现以上信息,则生成了Quartus综合布线所需要的所有工程文件。按quit 退出 GRLIB的GUI界面。 

    2. 启动Quartus II ,对E:\LEON3\grlib-gpl-1.1.0-b4104\designs\leon3-altera-ep2c70-sdr下生成的工程进行编译综合。如图 18所示。 

    图 18  Quartus II的编译综合

     

    3. 完成后下载,如图 19所示。 

    图 19 下载

     

    二、 使用LEON IDE建立软件应用程序

           下面将详细介绍使用LEON 的LEON IDE进行软件开发。

           启动 LEON IDE 的方法有以下几种:

    • 选择开始菜单->所有程序->Eclipse->Eclipse。
    • 运行桌面上的Eclipse图标。

    1 创建 C 工程

    LEON IDE 提供了 New Project 向导,用于自动建立C或者C++应用程序工程。使用New Project 向导,能轻松地在LEON IDE 中创建新工程。

    创建新的C应用工程的步骤如下:

    1.新建工程。在LEON IDE中,选择File->New->C Project,开启C工程创建对话框。如图20所示。

     

    图 20 新建C工程

    2. 对新工程进行设定。在C工程创建对话框中,用户可以指定需要建立的工程名、工程的类型模本以及所需要使用的工具链。本例中,新建工程名为Test_1,类型为Empty Project,工具链选择 SPARC Bare C。点击 Next ,打开工程调试配置对话框。如图 21所示。注意:工程名和文件名中不能有空格,所在的路径也不能有空格,以免影响编译。 

    图 21新工程模板和工具链选择

    3.配置。在新工程调试配置对话框中,用户可以选择需要的调试平台和相应的配置。这里将Debug 和 Release 均选择。点击 Finish ,结束工程的建立。如图 22所示。 

    图 22 配置

    4. 至此,新工程建立结束。图 23 所示为LEON IDE的工程设计界面。 

    图 23 工程设计界面

    2 配置新工程系统属性

    新工程建立后,还需要对工程做一些配置:

    1.点击菜单栏里的 Project 选项,在弹出的菜单中点击Build Automatically ,将其前的勾去掉。如图 24所示。 

    图 24 取消Build Automatically 

    2. 右击工程管理窗口中的工程Test_1,在弹出的菜单中选择 Properties ,点击打开如图25所示的工程属性设置(Properties for Test_1)对话框,找到C/C++ Build->Discovery Options,点击打开,在右侧的Configuration中选择Debug,即对调试模式的配置进行修改和设置。将Discovery profiles scope选择为 Configuration-wide ;再点击Complier invocation command 下的Browse…按钮,找到C:\opt\sparc-elf-4.4.2-mingw\bin路径下的的sparc-elf-gcc-4.4.2.exe,点击打开 。再点击Apply按钮。之后对Release模式采用同样的方法进行配置,配置好后点击 Apply按钮。最后点击 Ok 按钮,退出工程属性设置页面。

    图 25工程属性设置

    3. 右击工程管理窗口中的工程Test_1,在弹出的菜单中选择Build Configurations -> Set Active -> Debug,激活编译为Debug模式。

    至此,工程配置结束。

    3 给工程添加源文件

    同样LEON IDE 提供了 New File 向导,用于自动建立C或者C++等源程序。使用New File向导,能轻松地给工程添加源文件。

    1.添加文件。右击工程管理窗口中的工程Test_1,在弹出的菜单中选择New -> Source File,在打开如图4-26所示的New Source File 对话框中,选择模板为 Default C Source template ,并给源文件取名为main.c。 

    图 26给工程添加源文件

    2.编写软件代码。双击工程管理器中的main.c,程序编辑窗口会将main.c的内容显示出来。将下面的代码后写入后保存main.c文件。

     1 /*
     2  * main.c
     3  *
     4  *  Created on: 2011-3-27
     5  *      Author: 超群天晴
     6  */
     7 
     8 
     9 #include "stdio.h"
    10 #include "stdlib.h"
    11 
    12 #define LEDG_BASE 0x80000600
    13 
    14 // REG LEDG
    15 #define LEDG_DATA_IN      (*(unsigned int volatile *)(LEDG_BASE            ))
    16 #define LEDG_DATA_OUT      (*(unsigned int volatile *)(LEDG_BASE + 4        ))
    17 #define LEDG_DIR          (*(unsigned int volatile *)(LEDG_BASE + 8        ))
    18 #define LEDG_INT_MASK      (*(unsigned int volatile *)(LEDG_BASE + 0xC    ))
    19 #define LEDG_INT_POL      (*(unsigned int volatile *)(LEDG_BASE + 0x10    ))
    20 #define LEDG_INT_EDGE      (*(unsigned int volatile *)(LEDG_BASE + 0x14    ))
    21 #define LEDG_BYPASS      (*(unsigned int volatile *)(LEDG_BASE + 0x18    ))
    22 
    23 
    24 void GPIO_init(void);
    25 void delay1s(void);
    26 
    27 
    28 int main(void)
    29 {
    30     unsigned char led1;
    31 
    32 
    33     printf("This is Test_1 of LEON3 SOPC !");
    34     led1=0xf0;
    35 
    36     LEDG_DIR=0xff;//output mode
    37 
    38     while(1)
    39     {
    40         LEDG_DATA_OUT=led1;
    41 
    42         delay1s();
    43 
    44         led1=~led1;//    取反
    45     }
    46 
    47     return 1;
    48 }
    49 
    50 
    51 
    52 void GPIO_init(void)
    53 {
    54     LEDG_DIR=0xff;//output mode
    55 }
    56 
    57 
    58 void delay1s(void)
    59 {
    60     int i,j;
    61     for(i=0;i<1000;i++)
    62         for(j=0;j<500;j++);
    63 }

    4 编译工程

    右击工程管理窗口中的工程Test_1,在弹出的菜单中选择Build Project,LEON IDE便开始编译工程。如果没有错误,信息窗口会提示Build completed信息,表示软件编译成功。

    如果有错误,则会提示错误的原因以及代码的行号,并在程序编辑窗口中只是错误出现的位置。需要设计者修改错误并重新编译,直至编译成功。

     1 **** Rebuild of configuration Debug for project Test_1 ****
     2 
     3  
     4 
     5 **** Internal Builder is used for build               ****
     6 
     7 sparc-elf-gcc -O0 -g3 -Wall -msoft-float -c -fmessage-length=0 -omain.o ..\main.c
     8 
     9 sparc-elf-gcc -msoft-float -oTest_1 main.o
    10 
    11 Build complete for project Test_1
    12 
    13 Time consumed: 1500  ms. 

    注意:如果没有将 Build Automatically 前的勾去掉,右键工程是看不到 Build Project选项的,这时候需要点击 Build Configurations->Build->Select。

    5 运行程序

    工程编译成功后,就可运行程序了。LEON IDE 提供了四种运行模式:

     

    这里我们要使用到的是 LEON C/C++ application。以下为详细的操作步骤。

    1. 修改系统时间。这一步很关键,在正式运行之前需要确保系统时间是“合适”的。

    由于GRTools安装和使用受时间限制,所以如果当前的系统时间超出使用限制时间的话,GRTools的某些功能将不再被支持。本次试验所使用的GRTools版本的使用权限到2010年5月27日,所以为了让GRTools能正常使用,可以将系统时间调至较前一点时间如2010年5月14日。

    2. 新建LEON C/C++ application配置。右击工程管理窗口中的工程Test_1,在弹出的菜单中选择Debug As->Debug Configurations,打开Debug Configurations 设置对话框,如图27所示。双击左侧 LEON C/C++ application ,新建一个LEON C/C++ application的配置。 

    图 27 新建LEON C/C++ application配置 

    3. 设置Target为LEON类型。在右侧的Debugger选项卡中,选择Debugger为LEON Debugger,并点击External Target右侧的New…,新建一个外部目标。在弹出的Target Settings 界面中,可以自定义目标名字,如LEON3_Target;再将Target修改成GRMON,并将Interface选择为Altera Jtag。如图28所示。 

    图 28目标设置 

           4. 点击 Finish ,结束Target Settings,返回Debug Configurations主界面,点击Apply 按钮,应用设置。然后点击 Debug 按钮,开始将程序下载到目标开发板上。

           5. 下载过程中,LEON IDE会提示如下信息

     1  
     2 
     3  GRMONLEONdebug monitor v1.1.39 evaluation version
     4 
     5  
     6 
     7  Copyright (C) 2004-2008 Aeroflex Gaisler - all rights reserved.
     8 
     9  For latest updates, go to http://www.gaisler.com/
    10 
    11  Comments or bug-reports to support@gaisler.com
    12 
    13  
    14 
    15 gdb interface: using port 2222
    16 
    17 connected to port 2222
    18 
    19  This evaluation version will expire on 2/11/2010
    20 
    21  using Altera JTAG cable
    22 
    23  Selected cable 1 - USB-Blaster [USB-0]
    24 
    25 JTAG chain:
    26 
    27 @1: EP2C70 (0x020B60DD)
    28 
    29  
    30 
    31  GRLIB build version: 4104
    32 
    33  
    34 
    35  initialising ..........
    36 
    37  detected frequency:  50 MHz
    38 
    39  
    40 
    41  Component                            Vendor
    42 
    43  LEON3 SPARC V8 Processor             Gaisler Research
    44 
    45  Unknown device                       Gaisler Research
    46 
    47  AHB/APB Bridge                       Gaisler Research
    48 
    49  LEON3 Debug Support Unit             Gaisler Research
    50 
    51  32-bit PC133 SDRAM Controller        Gaisler Research
    52 
    53  Generic APB UART                     Gaisler Research
    54 
    55  Multi-processor Interrupt Ctrl       Gaisler Research
    56 
    57  Modular Timer Unit                   Gaisler Research
    58 
    59  General purpose I/O port             Gaisler Research
    60 
    61  General purpose I/O port             Gaisler Research
    62 
    63  
    64 
    65  Use command 'info sys' to print a detailed report of attached cores

    表明连接成功,识别到目标开发板中的LEON3了。这实际上是GRMON连接信息。从这些信息中可以看出,系统的主频是50M,有PC133SDRAM控制器,已经 APB UART、中断控制器、定时器已经GPIO。系统会自动切换至Debug视图,如图29所示。 

    图 29下载成功 

           6. 运行。将电脑的串口连接到目标开发板上,打开串口调试工助手,选择好串口,设置波特率为38400,数据位为8位,停止位1位,无校验位。运行LEON IDE工具栏上的按钮,开始运行程序。 通过串口助手可以看到从目标板上发送“This is Test_1 of LEON3 SOPC !”,并能看到开发板上的8个绿色LED交替亮灭。程序运行成功。 

    图 30测试结果 

    ===============================================================

    注意:

    1、Gaisler官网不建议使用Windows下的其他软件如WinRAR对其解压,以免破坏文件的结构。但是实际测试使用Windows下的解压软件直接解压,硬件的配置也能正常完成。

    2、为了避免每次都通过cd 命令一层一层的进入目录带来的麻烦,Cygwin支持多重目录进入,如现在根目录下,可以通过

    $ cd E:/LEON3/grlib-gpl-1.1.0-b4104/designs/leon3-altera-ep2c70-sdr

    直接进入目标E:\LEON3\grlib-gpl-1.1.0-b4104\designs\leon3-altera-ep2c70-sdr,注意命令行中是 / 而非 \ 。

    3. 在软件测试时,需要修改系统时间。但是在运行Cygwin对硬件进行配置的时候,系统时间需要修改回来!这样带来的问题就是在修改硬件软的同时需要来回修改系统时间,很是麻烦。所以建议先将硬件配置好后,再配置软件,这样就不需要将系统时间反复地修改了

    4、对于一个新建工程,第一次需要进行Debug Configurations,之后每次可以直接通过点击LEON IDE的主界面上的工具栏上的Debug图标右侧的下拉三角形,选择刚刚建立的LEON C/C++ application 图标即可下载运行,不需要再重新配置。如图31所示。 

    图 31 使用LEON C/C++ application 图标下载

     

    ===============================================================

    配置好的DE2_70 SOPC可以从这获取到:

    https://files.cnblogs.com/surpassal/leon3-de2.rar 

    测试通过的硬件、软件下可以从这获取到:

    https://files.cnblogs.com/surpassal/LEON3-lab1.rar

    解压均为密码:neurcq

     

  • 相关阅读:
    SQL Server 索引的自动维护 <第十三篇>
    SQL Server 索引的图形界面操作 <第十二篇>
    python处理时间戳
    今天又犯了Java/Scala里面substring的错误
    新浪系统工程师笔试--shell
    把DEDE的在线文本编辑器换成Kindeditor不显示问题
    C语言 EOF是什么?
    Windows Server 2012 R2超级虚拟化之七 远程桌面服务的增强
    C++数据结构之最小生成树
    python sqlite 查询表的字段名 列名
  • 原文地址:https://www.cnblogs.com/surpassal/p/LEON3_3.html
Copyright © 2020-2023  润新知