搜索
bottom↓
回复: 20

【分享】K60(Cortex-M4)开源开发探索——转载

[复制链接]

出0入0汤圆

发表于 2014-8-28 22:50:36 | 显示全部楼层 |阅读模式
本帖最后由 cn_x 于 2014-8-28 23:07 编辑

一、Cortex-M4内核
简介
                        ARM Cortex-M4 处理器是由 ARM 专门开发的最新嵌入式处理器,用以满足需要有效且易于使用的控制和信号处理功能混合的数字信号控制市场。

         高效的信号处理功能与 Cortex-M 处理器系列的低功耗、低成本和易于使用的优点的组合,旨在满足专门面向电动机控制、汽车、电源管理、嵌入式音频和工业自动化市场的新兴类别的灵活解决方案。

      

        Cortex‐M4是一个32位处理器内核。内部的数据路径是32位的,寄存器是32位的,存储器接口也是32位的。CM4 采用了哈佛结构,拥有独立的指令总线和数据总线,可以让取指与数据访问并行不悖。这样一来数据访问不再占用指令总线,从而提升了性能。为实现这个特性, CM3内部含有好几条总线接口,每条都为自己的应用场合优化过,并且它们可以并行工作。但是另一方面,指令总线和数据总线共享同一个存储器空间(一个统一的存储器系统)。换句话说,不是因为有两条总线,可寻址空间就变成8GB 了。
        比较复杂的应用可能需要更多的存储系统功能,为此CM4提供一个可选的MPU,而且在需要的情况下也可以使用外部的cache 。另外在CM4中,Both小端模式和大端模式都是支持的。
        CM4内部还附赠了好多调试组件,用于在硬件水平上支持调试操作,如指令断点,数据观察点等。另外,为支持更高级的调试,还有其它可选组件,包括指令跟踪和多种类型的调试接口。

        复位状态后,CM4的第一件事就是读取下列两个 32位整数的值:
       (1)从地址0x0000,0000处取出 MSP 的初始值。
       (2)从地址0x0000,0004处取出 PC的初始值——这个值是复位向量,LSB 必须是1 。

        然后从这个值所对应的地址处取指。

         

        注意,这与传统的ARM 架构不同——其实也和绝大多数的其它单片机不同。传统的RM 架构总是从 0 地址开始执行第一条指令。它们的 0 地址处总是一条跳转指令。在 CM3中,0 地址处提供 MSP 的初始值,然后就是向量表(向量表在以后还可以被移至其它位置)。
        向量表中的数值是32位的地址,而不是跳转指令。向量表的第一个条目指向复位后应执行的第一条指令。
        参考文献:《Cortex-M3权威指南》

二、K60简介   
        Kinetis是基于ARM Cortex-M4具有超强可扩展性的低功耗、混合信号微控制器。第一阶段产品由五个微控制器系列组成,包含超过两百种器件,在引脚、外设和软件上可兼容。每个系列提供了不同的性能,存储器和外设特性。通过通用外设、存储器映射和封装的一致性来实现系列内和各系列间的便捷移植。
       Kinetis 微控制器基于飞思卡尔创新的90纳米薄膜存储器(TFS)闪存技术,具有独特的Flex存储器(可配置的内嵌EEPROM)。Kinetis微控制器系列融合了最新的低功耗革新技术,具有高性能、高精度的混合信号能力,宽广的互连性,人机接口和安全外设。飞思卡尔公司以及其他大量的ARM第三方应用商提供对Kinetis 微控制器的应用支持。

        






阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2014-8-28 22:51:29 | 显示全部楼层
本帖最后由 cn_x 于 2014-8-28 23:04 编辑


一、嵌入式软硬件开发现状          
        随着电子技术的不断发展,各类硬件的性能不断提升,而成本和使用难度却在不断下降。硬件的日益成熟和稳定,让嵌入式软件成为了,嵌入式开发中的关键问题。但是纵观现在的嵌入式开发现状,虽然占据了系统开发的大部分时间,可还是显得有点力不从心,很难满足用户的需求,主要表现在以下几个方面:


        (1)开发复杂:传感器、驱动器等硬件功能越来越多,用户的需求越来越复杂,造成软件规模不断增加,开发成本和复杂度提升。
        (2)移植困难:软件质量层次不齐,移植性差,很难在不同硬件设备之间移植,无法应付日益丰富的硬件市场。
        (3)缺少工具:使用商业化的软件开发工具有很多限制,商业化的调试器不适功能不够就是价格太贵。


二、软件开发需求      

         根据上面的软件开发现状,结合我主要研究的移动机器人领域,我总结了以下的软件开发需求:
         (1)代码复用性强,消除重复劳动;
          代码在编写的过程中要增强模块化,提高在不同硬件之间的可移植性。
         (2)软件耦合性小,便于分工合作;

           软件开发设计到的领域比较多,需要分工开发,所以需要降低软件的耦合性,否则联调会十分困难。
         (3)系统安全性高,人机交互友好;

           在代码编写的过程中需要注重错误处理,通过人机交互的方式实时跟踪系统状态,提高安全性。
         (4)开发工具合适,利用技术支持。

       寻找合适可靠的开发工具链,虽然针对K60飞思卡尔公司推出了CodeWarrior开发工具,但是使用免费版的限制重重,运行又龟速一样,而且必须要使用BDM,所以还是要寻找更好的开发工具。此外利用各种官方及第三方的库(比如CMSIS、官方驱动库),可以打大提高开发过程中的效率。
  
转自古-月




出0入0汤圆

 楼主| 发表于 2014-8-28 22:52:22 | 显示全部楼层
本帖最后由 cn_x 于 2014-8-28 23:05 编辑


        我是从参加飞思卡尔全国大学生智能汽车竞赛开始接触单片机的,现在的主要研究方向是移动机器人的嵌入式软件开发。飞思卡尔的智能汽车其实就是移动机器人的典型代表,在这个行业当中,软件开发面临着很大的挑战,我在上一篇博客中也进行了详细的分析。为了能满足比赛以及科研的需求,我们准备开发一套完整的K60软件开发平台,建立移动机器人软件开发库,减少今后重复劳动以及不科学调试所浪费的时间。
         以下是我们设计的软件平台整体结构,主要包括三大部分:

       (1)开源交叉编译环境
         windows作为现在比赛开发的主流,存在很多限制,而且不利于程序员了解底层的知识。所以为了今后的可扩展性、通用性以及对人才得培养,我们选用linux作为开发平台。
       (2)嵌入式软件系统
        这一部分主要是针对下载到移动机器人控制器中的软件系统。
       (3)数据分析与仿真环境
        因为没有很好的调试工具以及仿真软件,移动机器人的调试以及仿真工作是现在研究中比较欠缺的部分。所以我们也希望在开源环境下建立一套带有人机交互界面的调试软件。另外仿真软件的使用,可以大大减少调试过程中的体力劳动,能起到事半功倍的效果,尤其是加入物理学的仿真。这也是我们今后研究的重点。


转自古-月



出0入0汤圆

发表于 2014-8-28 22:52:28 | 显示全部楼层
资源好多啊。。。

出0入0汤圆

 楼主| 发表于 2014-8-28 22:53:11 | 显示全部楼层
本帖最后由 cn_x 于 2014-8-28 23:06 编辑



一、开源开发简介      
         windows作为现在桌面系统的主流,在开源开发领域中却存在配置困难、软件支持少等缺点,而本身就是开源系统的linux在这一领域就显示了强大的性能。近几年来,开源软件依靠灵活的特性,已经主宰了嵌入式软件开发,成为了当今嵌入式市场竞争的主要推动因素。为了适应发展,具有更好的可扩展性,我也选用linux作为研究平台。基于linux 的操作系统有很多,现在应用比较广泛的应该是ubuntu,我使用的版本是ubuntu12.04。


二、交叉编译环境结构      

        在Linux下进行嵌入式开发已经非常成熟,网上的资料非常多,一般都是使用gcc+eclipse的结构。结合移动机器人的应用,我设计的交叉编译环境的总体结构如下:


        (1)核心:arm交叉编译工具链。
         嵌入式产品的资源往往十分有限,一般采用Host/Target的模式进行开发,既在PC上开发,然后在嵌入式系统中运行的方式。所以在PC上编译出ARM架构可执行文件的交叉编译器就是十分重要了。交叉编译器主要完成的工作如下:


          (2)人机交互:Eclipse


          Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。Eclipse的插件功能十分强大,可以把我们使用到的所有软件工具结合在GUI界面下。CodeWarrior也是基于Eclipse设计的。
          (3)守护进程:OpenOCD


          openocd是一个开源的JTAG上位机,可以将gdb命令转换成jtag使用的电平信号,并且实时监控连接状态。openocd也可以独立访问硬件设备,所以可以在烧写程序之前,通过openocd初始化好硬件。详细资料可以参见官网:http://openocd.sourceforge.net/
           (4)调试器:OpenJTAG
           与BDM和jtag相比,openjtag可以实现前者的所有功能,并且可以多系统通用。而且在官网上(http://www.openjtag.org/)可以下载到PCB等技术资料。


转自古-月




出0入0汤圆

 楼主| 发表于 2014-8-28 22:54:15 | 显示全部楼层
本帖最后由 cn_x 于 2014-8-28 23:10 编辑



       根据之前的设计,现在准备开始一步一步构建交叉编译环境。
      一、ARM工具链       嵌入式设备由于不具备一定的处理器能力和存储空间,程序开发一般用PC来完成,然后将可执行文件下载到嵌入式系统中运行。这是目前嵌入式程序开发的不二选择——Host/target模式。但这引发了一个问题:由于Host和Target的处理器体系结构不同,我们不能直接用PC上既有的程序开发工具,必须使用跨平台开发工具,即在Host上生成能在Target上运行格式的目标文件。   
       交叉编译工具链是嵌入式开发中最核心的工具,它被用来编译、链接、调试程序。在集成开发环境出现之前,我们通常是先使用其他编辑工具(比如记事本、Source Insight等)写好代码,然后通过命令行进行编译、链接。



       Codesourcery G++是Codesourcery公司在GUN工具链基础上制作的ARM交叉工具链,是其公司Codesourcery G++ Lite ARM集成开发工具的编译器。Codesourcery开源了Codesourcery G++编译器,但Codesourcery G++ Lite IDE是收费的。Codesourcery G++更新快,代码编译效率高,支持最新ARM内核,包括CortexA8,CortexA9内核。codesourcery的交叉工具链是很常见的一种,下载地址:
       http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/

       下载对应系统的.bin文件,直接在命令行下:
        ./arm-***-arm-none-eabi.bin

        然后就会跳出图形界面的安装程序,根据提示进行安装即可。安装完毕后,在终端中输入:
       arm-none-eabi-g++    --version

        如果可以成功看到版本号,说明安装没问题了,如果提示命令不存在,应该是环境变量有问题,可以上网查找一下修改环境变量的方法。
二、OpenOCD     
       OpenOCD是德国人的一个开源项目,主要目的是实现一个在线调试器,同时也能够实现程序烧写等目的,目前支持很多种芯片。
       可以从官网(http://openocd.sourceforge.net/ ) 下载最新版0.6.0的源码,然后安装,但是这种方法只能获取最新稳定版的程序,最新版本的需要通过git的方法进行安装。

       具体的安装方法,见我的另一篇博客:http://blog.csdn.net/hcx25909/article/details/7272831
三、OpenJTAG       

        在嵌入式开发中,有很多优秀的调试、仿真工具,比如Keil 、IAR 、Rowley Associates 等。它们的安装、使用都很便利,功能强大,但是价格昂贵( 几百美元甚至更多) ;还要购买相应的硬件,比如J-Link、U-Link等USB到JT AG的转换盒,这也是一笔不小的开支。对于学生,或者是开发预算有限的工程师来说,完全可以使用免费的开发工具Eclipse、OpenOCD,然后通过一些便宜的JTAG转接器(比如并口JTAG等)就可以达到接近、甚至超越上述商业软件的效果。
       我这里用的是百问网制作的一款OpenJTAG(http://www.100ask.net/OpenJTAG.html),官网资料还是比较丰富的,而且质量不错。



        
        将OpenJTAG板子接到PC的 USB 口后,Ubuntu 即会自动加载驱动,在/dev目录下自动创建ttyUSB0设备 :
        ls /dev/ttyUSB0* -l
        crw-rw---- 1 root dialout 188, 0 2013-3-23 18:17 /dev/ttyUSB0

四、Eclipse    
       Eclipse最初是由IBM公司开发的替代商业软件Visual Age for Java的下一代IDE开发环境,2001年11月贡献给开源社区,现在它由非营利软件供应商联盟Eclipse基金会(Eclipse Foundation)管理。Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。Eclipse基本内核包括:图形API(SWT/Jface),Java开发环境插件(JDT),插件开发环境(PDE)等。
        (1)因为Eclipse是基于Java的,所以需要先下载JDK:
        http://www.oracle.com/technetwork/java/javase/downloads/index.html
             下载压缩包的即可,解压之后,修改环境变量etc/enviroment:                                      
       PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/hcx/Java/jdk1.7.0_03/bin"
       JAVA_HOME="/home/hcx/Java/jdk1.7.0_03"
       JRE_HOME="/home/hcx/Java/jdk1.7.0_03/jre"
       CLASSPATH=".:/home/hcx/Java/jdk1.7.0_03/bin/lib"
      (2)下载Eclipse
        http://www.eclipse.org/downloads/packages/release/indigo/sr2
             Eclipse是不需要安装的,直接解压缩后就可以使用了。
       (3)安装插件
        选择菜单“Help -> Install New Software… ”,然后点击add,加入网址:http://gnuarmeclipse.sourceforge.net/updates,安装GNU ARM C/C++ Development交叉编译工具,然后需要把Group items by category取消。
        安装Zylin Embeded CDT调试插件,安装方法同上,网址:http://opensource.zylin.com/zylincdt



转自古-月




出0入0汤圆

 楼主| 发表于 2014-8-28 22:55:27 | 显示全部楼层
本帖最后由 cn_x 于 2014-8-28 23:12 编辑



      OpenOCD需要针对不同的JTAG工具和不同的目标芯片,配置一个配置文档。一般而言,配置文档分为4个部分。
        1、Daemon         
        主要是配置openocd对外的通讯所使用的本地TCP/IP端口,如gdb、telnet所使用的端口。 接口Port的定义一般如下(非特殊情况,无需修改,定义了一些端口号)
[plain] view plaincopy


  • telnet_port 4444  
  • tcl_port 6666  


         在用telnet或gdb进行调试时,将会根据定义的端口号连接到服务程序openocd上。     
         2、Interface          

        就是openocd所操作的连接开发板的调试器。
[plain] view plaincopy


  • # type of debug adapter  
  • interface ft2232   
  • # Provides the USB device description (the iProduct string) of the FTDI FT2232 device. If not specified, the FTDI default value is used.  
  • ft2232_device_desc "USB<=>JTAG&RS232"   
  • # Each vendor’s FT2232 device can use different GPIO signals to control output-enables, reset signals, and LEDs  
  • ft2232_layout jtagkey   
  • # The vendor ID and product ID of the FTDI FT2232 device  
  • ft2232_vid_pid 0x1457 0x5118   


         注: 查看ID的方法:
           lsusb //查看设备的相关简要信息

           获取如下:
[plain] view plaincopy


  • Bus 006 Device 030: ID 1457:5118 First International Computer, Inc. OpenMoko Neo1973 Debug board (V2+)  


           获取更详细的信息:
[plain] view plaincopy


  • sudo lsusb -v -D /dev/bus/usb/006/030  

           详细信息如下:
[plain] view plaincopy


  •    Device: ID 1457:5118 First International Computer, Inc. OpenMoko Neo1973 Debug board (V2+)  
  •    Device Descriptor:  
  •    bLength                18  
  •    bDescriptorType         1  
  •    bcdUSB               2.00  
  •    bDeviceClass            0 (Defined at Interface level)  
  •    bDeviceSubClass         0   
  •    bDeviceProtocol         0   
  •    bMaxPacketSize0         8  
  •    idVendor           0x1457 First International Computer, Inc.  
  •    idProduct          0x5118 OpenMoko Neo1973 Debug board (V2+)  
  •    bcdDevice            5.00  
  •    iManufacturer           1 www.100ask.net  
  •    iProduct                2 USB<=>JTAG&RS232  
  •    iSerial                 0   
  •    bNumConfigurations      1  
  •    Configuration Descriptor:  
  •    bLength                 9  
  •    bDescriptorType         2  
  •    wTotalLength           55  
  •    bNumInterfaces          2  
  •    bConfigurationValue     1  
  •    iConfiguration          0   
  •    bmAttributes         0x80  
  •    (Bus Powered)  
  •    MaxPower              100mA  
  •    Interface Descriptor:  
  •    bLength                 9  
  •    bDescriptorType         4  
  • bInterfaceNumber        0  
  •    bAlternateSetting       0  
  •    bNumEndpoints           2  
  •    bInterfaceClass       255 Vendor Specific Class  
  •    bInterfaceSubClass    255 Vendor Specific Subclass  
  •    bInterfaceProtocol    255 Vendor Specific Protocol  
  •    iInterface              2 USB<=>JTAG&RS232  
  •    Endpoint Descriptor:  
  •    bLength                 7  
  • bDescriptorType         5  
  • bEndpointAddress     0x81  EP 1 IN  
  •    bmAttributes            2  
  •    Transfer Type            Bulk  
  •    Synch Type               None  
  •    Usage Type               Data  
  • wMaxPacketSize     0x0040  1x 64 bytes  
  • bInterval               0  
  •    Endpoint Descriptor:  
  •    bLength                 7  
  • bDescriptorType         5  
  • bEndpointAddress     0x02  EP 2 OUT  
  • bmAttributes            2  
  • Transfer Type            Bulk  
  • Synch Type               None  
  • Usage Type               Data  
  • wMaxPacketSize     0x0040  1x 64 bytes  
  • bInterval               0  
  •    Interface Descriptor:  
  • bLength                 9  
  •    bDescriptorType         4  
  •    bInterfaceNumber        1  
  •    bAlternateSetting       0  
  •    bNumEndpoints           2  
  •    bInterfaceClass       255 Vendor Specific Class  
  •    bInterfaceSubClass    255 Vendor Specific Subclass  
  •    bInterfaceProtocol    255 Vendor Specific Protocol  
  •    iInterface              2 USB<=>JTAG&RS232  
  •    Endpoint Descriptor:  
  •    bLength                 7  
  •    bDescriptorType         5  
  •    bEndpointAddress     0x83  EP 3 IN  
  •    bmAttributes            2  
  •    Transfer Type            Bulk  
  •    Synch Type               None  
  •    Usage Type               Data  
  •    wMaxPacketSize     0x0040  1x 64 bytes  
  •    bInterval               0  
  •    Endpoint Descriptor:  
  •    bLength                 7  
  •    bDescriptorType         5  
  •    bEndpointAddress     0x04  EP 4 OUT  
  •    bmAttributes            2  
  •    Transfer Type            Bulk  
  •    Synch Type               None  
  •    Usage Type               Data  
  •    wMaxPacketSize     0x0040  1x 64 bytes  
  •    bInterval               0  
  •    Device Status:     0x0000  
  • Bus Powered)  

        3、board       (1)jtag速率
        对于常见的arm、arm9,jtag配置的最大速率不能高于于cpu时钟的六分之一。如果所用的cpu时钟为60Mhz,因此jtag最大速率可设置为:
[plain] view plaincopy


  • jtag_khz 10000  

         如果使用
[plain] view plaincopy


  • jtag_rclk 3000  

        即使用自适应时钟,它将会用rclk自己搜索jtag工作频率,速度会很慢。
        (2)芯片复位

        这里配置的为jtag和target cpu可用的复位信号。其中复位jtag中的tap控制器的为trst信号,srst信号用于target cpu复位,它是都是可选的。最好的情况是这两个信号都有,这样openocd就可分别控制tap控制器和cpu的复位。
[plain] view plaincopy


  • reset_config trst_and_srst  

        4、Target        在/usr/local/share/openocd/scripts/target目录下可以找到很多芯片的配置例程,因此参照样本添加配置。
        配置TAP是一个通用的端口,通过TAP可以访问芯片提供的所有数据寄存器(DR)和指令寄存器(IR),配置语法为:

[plain] view plaincopy


  • jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0×1 -irmask 0xf -expected-id $_CPUTAPID  


       配置cpu 此处设置cpu名称以及大小端排列顺序即可。配置如下:
[plain] view plaincopy


  • target create $_TARGETNAME cortex_m3 -endian $_ENDIAN -chain-position $_TARGETNAME  

       在使用openocd下载映像到ram时,为了提高速度,在ram中设置一块工作区域,配置如下:
[plain] view plaincopy


  • $_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0  


       由于K60是Cortex-M4的内核,相比之前的arm系列有很大的不同,openocd针对cortex系列也有很多的特殊配置,所以上面的配置还只是初级的配置文档,更加详细的配置还要待今后对这一内核进入深入研究之后再添加了。
       参考链接:http://a.chinaunix.com/space.php?uid=23947686&do=blog&id=172600



转自古-月




出0入0汤圆

 楼主| 发表于 2014-8-28 22:56:16 | 显示全部楼层
本帖最后由 cn_x 于 2014-8-28 23:12 编辑


           在我们的研究当中,经常会遇到串口发送数据的问题,在linux下有没有一款合适的串口调试助手呢?答案当然是肯定的。

        C-kermit是一款集成了网络通信、串口通信的工具,功能类似于Tera Term,是linux下一款强大的串口调试助手。它有如下多种功能:

       1、支持kermit文件传输协议
  2、自定义了一种脚本语言,它强大而易于使用,可用于自动化工作
  3、无论是网络通信,还是串口通信,操作是一致的,并支持多种硬件、软件平台
  4、有安全认证、加密功能
  5、内建FTP、HTTP客户端功能及ssh接口
       6、支持字符集转换

       在命令行下进行安装:


[plain] view plaincopy


  • sudo apt-get install   

       如果不安装ckermit,在ubuntu下就无法查看串口数据,只能通过虚拟机在windows下查看。

       安装完毕后需要进行配置,首先打开配置文档:


[plain] view plaincopy


  • sudo  gedit  /etc/kermit/kermrc  

       添加如下的配置:      

[plain] view plaincopy


  • set line          /dev/ttyUSB0   
  • set speed         115200   
  • set carrier-watch off   
  • set handshake     none   
  • set flow-control none   
  • robust   
  • set file type     bin   
  • set file name     lit   
  • set rec pack      1000   
  • set send pack     1000   
  • set window        5  

        其中的含义还是很清楚的,大家应该可以理解,下面是一般是用的命令,具体使用命令可以查看帮助文档,功能还是非常强大的。


转自古-月


http://blog.csdn.net/hcx25909




出0入0汤圆

发表于 2014-8-29 21:26:14 | 显示全部楼层
LZ用linux开发cortex-m系列啊

出0入0汤圆

发表于 2014-8-29 21:34:41 | 显示全部楼层
前排收藏,顶

出100入101汤圆

发表于 2014-8-29 21:35:07 | 显示全部楼层
LZ辛苦,图文并茂!

出0入0汤圆

发表于 2014-8-29 21:49:01 | 显示全部楼层
感觉M4内核挺强大的

出0入0汤圆

发表于 2014-9-1 08:38:53 | 显示全部楼层
收藏,谢谢。

出0入0汤圆

发表于 2014-9-1 08:46:53 | 显示全部楼层

收藏,谢谢楼主。

出0入0汤圆

发表于 2014-9-1 08:47:59 | 显示全部楼层
标记,K60(Cortex-M4)开源开发探索,N多资料

出0入0汤圆

发表于 2014-9-1 08:50:40 | 显示全部楼层
K60 M4 火钳留名

出0入4汤圆

发表于 2014-9-1 08:52:40 | 显示全部楼层
看看先 楼主辛苦啦

出0入0汤圆

发表于 2014-9-1 08:56:56 | 显示全部楼层
楼主的资料很犀利啊!!

出0入0汤圆

发表于 2014-9-1 08:57:01 | 显示全部楼层
蛮详细的,感谢露珠的分享。

出0入0汤圆

发表于 2014-9-1 20:43:38 | 显示全部楼层
真够详细的,谢谢楼主分享

出0入0汤圆

发表于 2014-9-1 21:08:45 | 显示全部楼层
讲的很清晰
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-15 10:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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