精华内容
下载资源
问答
  • 移植性是什么意思?
    千次阅读
    2018-07-16 15:49:23

    所谓可移植性就是:

    所编写的代码可以在多个系统中运行

    更多相关内容
  • 代码移植

    千次阅读 2016-07-05 17:27:42
    准备工作: 首先是一些准备工作,在Windows平台上面安装上Cygwin的最新版本,在Cygwin中安装好GCC等开发工具。 同样也需要一个Windows开发环境。可以使用最新版本Visual ...源代码包。 解开压缩包之后,进入 tar-1.13

    准备工作:

    首先是一些准备工作,在Windows平台上面安装上Cygwin的最新版本,在Cygwin中安装好GCC等开发工具。 同样也需要一个Windows开发环境。可以使用最新版本Visual Studio, Microsoft Visual Studio .NET 2003。

    在Cygwin下面解开tar-1.13.tar.gz.源代码包。

    解开压缩包之后,进入 tar-1.13目录,在当前的目录下面输入./configure命令,运行完毕之后,再次输入make命令。开始编译tar的Cygwin版本。编译基本上不会有问题,进入src目录,可以看到新编译好的Tar程序tar.exe。

    接下来就是构造Windows工程。先用Visual Studio .NET 2003创建一个空的工程(Project),命名为WinTar。根据Cygwin中的编译输出信息,Tar主要的代码在Src和lib两个目录中。把这两个目录复制到新工程里,并把代码加入到工程中。然后复制Config.h到WinTar工程目录下面。

    移植:

    第一个目标:使得WinTar能编译过(Compiler)

      第一个目标的完成主要围绕Config.h来实现。Linux下开发环境和Windows开发环境很大的不同是CLibrary头文件和各种类型的定义不同。而Config.h提供了完整编译开关来处理因为不同平台间开发环境不同带来的不同之处。现在需要手工去修改这个文件,以便Tar源代码能适应Windows平台。

      首先调整各种C Library头文件(Header File)的包含问题。在Config.h中定义了很多类似HAVE_XXXX_H。比如定义HAVE_CONFIG_H为1表示工程中可以使用config.h。

      #define HAVE_MALLOC_H 1表示可以在工程中使用Malloc.h头文件。通过调整这些定义值,可以去除一些Windows平台下面没有的头文件包含。也许其他地方还有很多头文件包含关系需要处理,但是这里的定义基本上解决了大部分的头文件包含问题。

      

    /* Define if you have the <linux/fd.h> header file. */ 
    /* #undef HAVE_LINUX_FD_H */ 
    
    /* Define if you have the <locale.h> header file. */ 
    #define HAVE_LOCALE_H 1 
    
    /* Define if you have the <malloc.h> header file. */ 
    #define HAVE_MALLOC_H 1 
    
    /* Define if you have the <memory.h> header file. */ 
    #define HAVE_MEMORY_H 1 
    
    /* Define if you have the <ndir.h> header file. */ 
    /* #undef HAVE_NDIR_H */

      第二步,调整各种数据类型的定义,可能在linux下面会有很多特殊的数据类型定义,Config.h文件中也包含了一部分可以变动的数据类型定义项。这些定义一般都是基本数据类型的重定义。可以根据Windows平台下的数据类型定义情况进行修补。比如在Cygwin的开发环境中有个数据类型mode_t, Visual Studio的C Library中却(作者 很土,联系方法 jackforce at 163 dot com)找不到这样数据类型。Tar代码中使用了大量的mode_t数据类型. config.h中提供了修改项来让开发人员自己修改mode_t的定义,并提示如果mode_t在中没有定义的话,可以把他定义为int型。所以在config.h加上#define mode_t int。这样mode_t没有定义的问题就解决了。其他的数据类型也是同样对待处理。

      

    /* Define to `int' if <sys/types.h> doesn't define. */ 
    #define mode_t int  
    
    /* Define to `long' if <sys/types.h> doesn't define. */ 
    /* #undef off_t */ 
    
    /* Define to `int' if <sys/types.h> doesn't define. */ 
    #define pid_t int

      第三步,调整各种函数定义。在Config.h中除了HAVE_XXXXX_H之外还有一种预定义,HAVE_XXXX。 这是一些可选用函数定义开关。#define HAVE_MEMSET 1 表示工程中可以使用memset函数。也就是说工程用到的类库中已经实现了这个函数。如果没有,那么就需要#undef HAVE_MEMSET,当然也可以自己提供这些函数。

    /* Define if you have the memset function. */ 
    #define HAVE_MEMSET 1 
    
    /* Define if you have the mkdir function. */ 
    #define HAVE_MKDIR 1 
    
    /* Define if you have the mkfifo function. */ 
    #define HAVE_MKFIFO 1 
    
    /* Define if you have the munmap function. */ 
    #define HAVE_MUNMAP 1


     最后,Config.h文件中除了上面的头文件,函数,数据类型编译选项之外,还有其他一些东西,比如环境变量,其他编译选项。这些内容会根据不同的项目而有很大的不同。但是可以从Config.h基本看出移植的工作量有多大。

      经过上面的调整之后,势必因为Windows环境下没有某些头文件,比如poll.h,就会没有poll函数,没有dirent.h 就会没有dirent 结构体。而继续使得WinTar编译不过。这个时候就需要根据具体的编译错误信息进行细节修饰。当需要使用Windows下一些特殊的定义的时候请不要忘了在Config.h的最前面加入#include .

      关于细节修饰,举个例子来说明。比如有个选项HAVE_INTTYPES_H

      

    /* Define if <inttypes.h> exists, doesn't clash with <sys/types.h>, 
    and declares uintmax_t. */ 
    #define HAVE_INTTYPES_H 1

      通过分析代码可以发现,代码并不是需要一个完整的inttypes.h文件,而是为了一个uintmax_t的定义。在Visual Stdio的C Library中并没有inttypes.h这个文件,也没有uintmax_t这个定义。回溯Cygwin的include目录的inttypes.h文件,发现了uintmax_t的定义

      

    typedef unsigned long long uintmax_t;

      很简单的数据类型重定义。这么简单定义,完全可以从Cygwin的Include目录中单独拿出来做一个专用版本的inttypes.h加入到WinTar项目中。这样编译过程中uintmax_t没有定义的问题就解决了。解决这类问题的一般的做法也就是从Cygwin的Include目录里面拿出相关的头文件进行修改或者单独复制到WinTar的目录下面。[本文于2003年完成. 如需要转载 请联系jackforce at 163 dot com ]修改或者复制代码的原则是不再引入更多的定义或者头文件,仅取所需部分。其他类似的问题还有direct结构定义和相关函数。

      在编译过程中,很多错误是有由lib目录下的文件产生的,但是lib目录下的文件不是完全都需要的。lib目录只是一个对Tar的补充库。需要的代码才需要编译。 具体判断的方法一个是参考Windows C Library库的内容。如果同样的函数,数据类型已经定义,就不需要Lib目录中的相同数据类型的定义和函数实现了。还有一个方法是尽量去掉lib目录中的C文件,只保留头文件,并使得编译能够通过,根据link的错误信息去检查那些lib中的C文件是需要的。

      除了修改外围的各种头文件之外,还不要忘了修改工程的编译选项,特别是预定义选项。在Tar的移植过程就需要以下的预定义HAVE_CONFIG_H,_POSIX_SOURCE,MSDOS。HAVE_CONFIG_H 表示程序编译需要config.h文件。为了方便期间,在tar移植过程中就放到工程的预编译选项中了。MSDOS,移植的是Linux下的控制台程序,而Windows平台最接近Linux控制台就是DOS,特别是一些环境变量设置和全局常量的定义。Tar的有些代码针对MSDOS环境已经做了一部分修正,这点在移植过程中可以利用起来。还有一个可选项是__CYGWIN__。有些Linux程序会针对Cygwin平台做出代码上的特殊设定。当遇到这样的代码的时候,一定要加上__CYGWIN__预定义项,能够大大减少移植需要的工作量。还有就是移植过程引入的各种Cygwin代码中也可能需要__CYGWIN__定义(有时候是其他的定义,比如_POSIX_SOURCE,或者__INSIDE_CYGWIN__)。

      经过上述的几个步骤。第一个目标,代码能够编译通过基本上是不会有什么问题的。只要把握好二个修改代码的基本原则,第一。引入新的代码,而不修改原有的代码。在没有办法进行调试前修改源代码是不允许的,修改的不好就会引起最后代码运行逻辑的混乱,而且在代码能够运行之前是很难发现问题的。所以除非非常有把握,否则不要修改被移植工程的源代码。第二,引入新的代码之后,不能因为这次引入而需要再次引入新的代码。这样子,就进入死循环了。为了解决某个数据类型的定义,而引入了新的不能解释的数据类型。这样还不如不引入新的代码。所以引入新的代码,特别是很多头文件。引入之前一定要做修改,只保留工程本身需要的部分,去除那些不需要的代码。直到能编译通过为止。 三:第二个目标,使得代码能够链接过(Link)

      完成了第一个目标之后,就会有大量的link错误。原因是前面引入了很多外部函数,外部全局常量只有定义而没有实体,于是就会产生link错误。现在需要的是为代码提供引入的函数实体,外部全局变量实体。一般都是函数link(本文于2003年完成. 如需要转载 请联系jackforce at 163.com)不到的比较多。

      要解决link错误就需要了解不同平台上面函数操作的区别,特别是某些概念的区别。这里最好的参考资料有两个。一个是Windows Services for UNIX (SFU)的帮助文件,一个是MSDN中的一篇文章《UNIX Application Migration Guide》。SFU是微软提供一个Unix兼容环境,有点像Cygwin。在安装上SFU之后有一个帮助文件。其中有一部分就是Unix,Linux函数的说明,有些函数提供了信息说明可以用Windows Library中那些函数来替代。这点对于移植是很重要的(省事)。UNIX Application Migration Guide应该不算文章而是有点像书了。它说明了很多windows和Unix系统(类Unix系统)中很多概念不同之处,针对这些不同的概念提供了很多相关的信息来说明如何进行模拟这些不同之处。比如Unix系统中Signals概念可以使用Windows环境中的Event来替代。SIGALRM用Windows Message来替代等。

      SFU的帮助文件提供了一部分信息来说明Windows平台中哪些低阶函数(C 函数库)可以替代相关Unix函数。《UNIX Application Migration Guide》则提供了一种方法来转换Unix平台上的一些OS级的概念到windows上。实际上Cygwin下面也做了很多这样的转换。具体解决link问题的时候可以参考Cygwin本身的实现。

      不过有些概念,比如安全权限方面的概念。在Linux平台和windows平台上面是完全不能互换的。而且windows平台中的权限函数操作(本文于2003年完成. 如需要转载 请联系jackforce@163.com)的过于复杂。这样对于某些linux函数。比如getuid处理可以参考Cygwin的处理办法。什么也不做直接返回0 (return 0)。当代码中遇到这些函数的时候可以从Cygwin的代码中复制一个getuid出来。放入工程中去。

      利用这些资料,并通过相关的工具比如sourceinsight来搜索Cygwin本身的源代码,Link问题并不难处理。只是有可能在处理link问题的过程中会回复到上面的问题,编译不过。这个时候的代码修改还是一定要注意不要引入太多的新的代码,免得问题越来越复杂。

    代码运行正常:

      实际上当link问题解决之后,程序可以在windows环境中运行时,一切就尽在掌握了。如果不考虑做多平台的程序的话,这个时候就可以任意去修改程序了。不过在代码调试过程可能需要一个参照,看看正常的程序运行流程是怎么样的。刚刚移植过来的程序在很多地方并不能马上就能正常的运行。回到Cygwin中,重新编译一个可以调试的版本(在GCC编译选项加上-g3),在需要的时候可以在Cygwin中调试程序。调试可以用GDB或者Insight。如果习惯Windows 平台下面编程,可以使用Insight,这是一个TCL/TK脚本程序,它提供了一个Windows界面以方便用户调试程序,不过Insight最终还是调用GDB。在这里具体调试就不细说明了。

    多平台代码:

      移植后的代码(本文于2003年完成. 如需要转载 请联系jackforce@163.com)如果需要在多个平台上面运行,就要在lib目录里面大做文章了。提供自己的函数库,并根据各个平台进行调整。Tar的代码由Config.h和一些编译选项来控制如何在各个不同的平台上面做编译。Lib则提供了很多C Library函数或者不同平台下面的其他函数的替代版本。这样Tar在编译过程中就不会因为某些平台下某些函数的缺失而编译不过。多平台支持,一般都是在代码中加上很多编译开关,在编译期间去分隔Linux,Windows或者其他平台下面的特殊代码。比如utime.h头文件的包含问题。因为文件在Linux(gcc)下面和Windows(cl)下所处的C Library目录不同。包含的处理办法就不一样。可能需要这样写才能完全正确的包含。

      

    #if HAVE_UTIME_H &#61663;---- 如果有utime.h 文件 
    # ifdef WIN32 &#61663;-----如果是win32环境  
    # include <sys/utime.h> &#61663;-----包含sys/utime.h 
    # endif 
    # ifdef LINUX &#61663;---- 如果是Linux环境 
    # include <utime.h> &#61663;---- 包含utime.h  
    # endif 
    #else &#61663;--- 如果没有utime.h定义出需要的结构  
    struct utimbuf 
    { 
    long actime; 
    long modtime; 
    }; 
    #endif

      在其他的代码中基本上也是这样的处理。根据编译环境的不同来编译不同的代码。 这样的define的区隔,主要就是为了区隔不同平台的不同细微区别。有的区别也许是某些常量没有定义,有些区别是某些函数不存在。如果代码中调用函数在某些平台下面不存在,就需要提供一个lib去提供这些函数。Tar的Lib的作用也是如此。

      基本上代码的移植是前难后易。前期首先要保证源代码本身的逻辑不能变动,所以在修改代码方面只能尽量修改外围的代码,而不是修改源代码本身。如果link过了之后,则就是一般的Windows下面的编程了,可以根据需求任意修改移植后的代码了。最难的地方可能就是OS级不同概念的替换了。C Library虽然在各个平台上有不同之处,但是总是比较接近,不同的地方可以提供自己编写的代码来替换。但是OS级的概念,和平台相关性太大,一般不太容易替换。

    扩展问题,待解决的问题:

      如果需要把移植过来的代码改成DLL或者lib给其他的工程调用。比如给其他的工程提供一个解包Tar文件的功能。如果不加修改,那么移植过来的代码有很多缺陷。

      首先是多线程支持问题。如果代码中有很多全局变量,那么改成DLL或者lib之后就不能在多线程下面调用。

      其次,DLL接口表。移植后的代码入口是main函数,虽然整个工程里面有很多独立功能,但是这些独立功能的调用都是通过使用不同的参数来实现。如何输出接口表给其他工程使用,需要做些功夫

      三、控制 原始的控制台程序在下了运行参数之后,一般都是一头运行到底的,也有可能在中间有些要求输入某些信息的。这样的程序如何集成到其他的工程中并受到其他工程的控制?比如遇到某些错误要返回等等。在Tar代码中遇到错误就直接退出程序。显然这些地方就不合DLL设计要求。可能需要重新设计代码的结构。

      四,输出信息。Tar工程里面很多向控制台输出的信息。这些信息输出需要重新定向或者屏蔽。

      第三第四部分可以参考Linux下面的FrontEnd程序,即只是为某个特殊的程序提供的一个GUI界面的程序。FrontEnd程序就是控制了主程序的运行并重新定向输出信息到GUI界面上。

      注1. Cygwin,是Windows平台下面的一个Linux模拟环境。可以从www.Cygwin.com上下载全部内容。

      注2. Windows Services for UNIX (SFU)的SDK可以从微软网站上获得 http://www.microsoft.com/windows/sfu/ ;

      注3. UNIX Application Migration Guide 可以从MSDN中取得,如果没有MSDN可以从微软MSDN网站上取得。 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnucmg/html/ucmglp.asp ;

      注4. Tar, Cygwin下面有Tar。但是只能在Cygwin下面运行 或者必须提供Cygwin的平台DLL才能在windows下面单独使用Tar程序。

      注5. CL是微软的C/C++编译器,包含在Visual Studio各个版本中。

    相关链接点击打开链接


    展开全文
  • stm32代码移植的方法

    千次阅读 2019-07-13 21:55:44
    这里以stm32f103zet6移植到stm32f103c8t6为例: 1、点开魔术棒–>device中修改芯片型号为stm32f103c8t6 2、点击编译 会提示有一大堆错误和警告 点击第一个错误进入到stm32f10x.h头文件中的#define STM32F10X_HD ...

    这里以stm32f103zet6移植到stm32f103c8t6为例:

    1、点开魔术棒–>device中修改芯片型号为stm32f103c8t6
    2、点击编译 会提示有一大堆错误和警告 点击第一个错误进入到stm32f10x.h头文件中的#define STM32F10X_HD 将这个宏定义全部屏蔽 这时在编译则没有问题
    3、若烧录的时候丢失CORTEX-M3则点击魔术棒中 Utilities中的setting 将 ADD加入stm32f10xmed-density 128K 的安装包,如果之前存在则需要先remove这个包,再重新加入这个包。这样便可以烧录进去。
    4、完成移植

    展开全文
  • 从字面上理解,可移植性说的就是,在一个平台上开发的代码,通过比较少的改动就能够在另外一个平台上使用。不同的平台可以指具有不同的处理器架构,比如x86和arm;或不同的操作系统,比如windows和linux。程序语言...

           从字面上理解,可移植性说的就是,在一个平台上开发的代码,通过比较少的改动就能够在另外一个平台上使用。不同的平台可以指具有不同的处理器架构,比如x86和arm;或不同的操作系统,比如windows和linux。程序语言最终会被编译器编译成处理器可以理解的指令,不同的平台编译器或有差别,因此要将代码从一个平台移植到另一个平台,有时会需要对代码做些修改。一般来说,高级的语言具有比较好的可移植性,因为没有太多依赖于处理器的约束。在开发程序的时候,需要有很好的分层思想,或者对于一些可能不好移植的代码也可以通过写成独立模块的方式,便于未来进行移植。

           对于android操作系统,不同的芯片厂商可能会有不同的底层实现,但最终会依据行业标准提供统一的接口。因此,基于c或c++开发的程序只需要利用android ndk编译成库(.so)打包进android apk,就可以在不同的平台上(x86 + android / arm + android)使用了。

          若原本的c代码是为x86 + windows平台开发的,而最终需要移植到arm + android平台上。则首先需要针对c程序进行修改以适配linux系统,比如一些多线程的操作可能在windows下的写法会和在linux下的不同。接着再利用android ndk将修改后的c代码编译成库打包进android apk...就算完成来代码的移植了。

          对于生活中的例子,比如华为和小米手机,都可以从app store上下载同一个app,因为这些app都是为android系统开发的,而华为和小米都是在android平台上,支持同一标准的;google daydream平台也将有可能会为vr移动端提供统一的标准,而华为小米htc等手机厂商也都已经加入daydream平台。

         

          

    展开全文
  • Linux拥有丰富各种源代码资源,但是大部分...本文将以一个实际的例子(Tar)来说明如何把Linux代码移植到 Windows平台上。移植过程将尽量少修改代码,以便代码的运行逻辑不会发生任何变动。保留绝大部分软件主要功能。
  • C和C++ Windows代码移植到Linux

    热门讨论 2014-08-13 11:26:37
    其中包含两个东东: 一个windows数据类型在Linux下进行转换的头文件,在需要时直接引入此头文件(#include "WinToLinux.h")即可,比较实用。...一个从Windows向Linux的C和C++代码移植的文档说明,也很有用。
  • STM32F407代码移植到STM32F401
  • FS4412系统移植uboot移植实验代码,包括uboot2013源码,三星加密文件,移植需要修改的代码移植好的能用的代码
  • CPU源代码分析与芯片设计及Linux移植,关注CPU,关注嵌入式
  • 在STM32F407IG开发板上移植了最新的FreeRTOS 10.0.1和LWIP 2.1.0成功,开发板当服务器,电脑当客户端,客户端发送数据,服务器收到了全部返回。连续长时间收发数据无问题。
  • 基于此,来自华为智能计算专家张汝涛带来了“90%代码如何实现自动移植到鲲鹏平台”的主题分享活动,他主要从鲲鹏开发套件实现基于C/C++软件的高效代码移植,加速开发者实现跨平台软件移植两个层面进行分享。...
  • 4.下载移植代码包。 复制秘钥,因为下载需要填写。 如下图生成代码包。 下载代码包: 下载后解压,将下图俩个复制到自己的工程。 5.导入代码包到STM32工程。 记得包含头文件位置。 注意:路径地址因人而.
  • 什么是JAVA的可移植

    千次阅读 2021-01-17 15:43:14
    JAVA的可移植性:1.JAVA作为一种编程语言:源代码可移植性作为一种编程语言,JAVA提供了一种最简单同时也是人们最熟悉的可移植性–源代码移植。这意味着任意一个JAVA程序,不论它运行在何种CPU、操作系统或JAVA...
  • 从字面意思理解,就是你的代码里已经嵌入了别的代码,这些代码可能是你引入过的框架,也可能是你通过接口继承得来的(比如:java中的继承),这样你就可以拥有侵入代码的一些功能。所以我们就称这段代码是侵入式代码...
  • 《Android底层驱动分析和移植》一书的源代码
  • STM32 FreeRTOS 源代码+移植教程

    热门讨论 2013-07-11 14:18:37
    STM32 FreeRTOS移植教程,有详细的文档说明和移植步骤。通过创建LED 跑马灯任务验证操作系统移植成功。移植过程给予MDK环境
  • GD32的性价比和稳定性都很高。我更喜欢用GD32.。但不是100%兼容的。需要注意一些细节。
  • 在STM32上移植FreeModbus(工程文件,移植笔记),有源代码,有详细注释,
  • 什么是SDK? SDK是什么意思?(转)

    千次阅读 2019-03-11 19:28:39
    为了使用 DLL 中的 API 函数,我们必须要有 API 函数的声明(.H)和其导入库(.LIB),函数的原型声明不难理解,那么导入库又是做什么用的呢?我们暂时先这样理解:导入库是为了在 DLL 中找到 API 的入口点而使用的...
  • Apollo6.0规划核心代码移植到Ros工程,可编译移植分享
  • 基于STM32F1自写移植代码分享系列之0.96寸OLED模块

    千次阅读 多人点赞 2019-05-15 01:52:40
    基于STM32F1的0.96寸OLED模块自写移植代码分享 OLED模块体积小巧,使用方便,是一个很优秀的显示器。在我们调试代码中是一个很方便的使用的模块,在我们每次创建一个新的工程,都需要从商家给的oled模块驱动代码...
  • 从x86架构移植c代码到arm架构上

    千次阅读 2020-05-31 18:55:50
    安装Porting Advisor代码移植工具,进行C代码移植,从x86到arm 1.下载安装包 2.解压 tar cd 3.安装web模式 sh install.sh web 移植postgresql,从x86到arm 1.下载postgresql源码包 2.解压 3.将解压包放在/opt/portadv...
  • freemodbus RTU移植stm32过程代码

    热门讨论 2013-05-20 14:37:49
    该程序我已测试通过.详细代码分析请到http://blog.csdn.net/skill_cheng/article/details/8950319查看.
  • IMU —— MPU9250_DMP原代码移植

    千次阅读 多人点赞 2019-03-13 19:19:21
    最近在使用MPU9250来学习姿态解算,查询了非常多的网上关于MPU6050和MPU9250的资料,发现内置的DMP可以计算出姿态角,可原代码是用在MSP430和STM407上的,手上有块F429的野火板子,移植过程越到非常多的巨坑,现在想...
  • STM32F103ZET6代码移植到F103C8T6上的方法及注意事项

    千次阅读 多人点赞 2020-11-03 21:08:14
    注:以上代码例子来源参考于正点原子,仅供学习交流。 3.总结 1.型号更换 2.C/C++配置选项更改 3.启动文件的更换 4.主函数里加入SystemInit()初始化【针对于C8T6】 5.系统文件夹里的函数可以修改,但对初学者还是...
  • 文章目录前言一、Hi3861是什么?二、使用步骤1.写一个STM32程序2.如何转移到Hi3861总结把一些工程发上来给大家,仅供参考~ 前言 目前正在打大学生嵌入式大赛,本人负责的部分是对Hi3861开发板进行开发,因为以前玩...
  • uip0.9移植cc2530代码

    热门讨论 2013-03-21 10:02:20
    将uip0.9成功移植到cc2530平台的示例代码 具体移植细节可以去 http://blog.csdn.net/crystal736去参考
  • 一、打开STM32F103ZET6的库函数版本的蜂鸣器的代码历程 二、打开C/C++选项卡 1、将STM32F10X_HD,USE_STDPERIPH_DRIVER换成USE_STDPERIPH_DRIVER。 2、将STM32F10X_HD,USE_STDPERIPH_DRIVER换成USE_STDPERIPH_...
  • linux中bash是什么意思

    千次阅读 2021-05-13 15:45:25
    Bash (GNU Bourne-Again Shell) 是大多数...它能运行于大多数类Unix风格的操作系统之上,甚至被移植到了Microsoft Windows上的Cygwin系统中,以实现Windows的POSIX虚拟接口。此外,它也被DJGPP项目移植到了MS-DO...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 407,694
精华内容 163,077
关键字:

代码移植是什么意思