在windows下的嵌入式开发环境

2025-12-17 19:48:31
推荐回答(4个)
回答1:

嵌入式开发是个很宽泛的概念,嵌入式开发一般分为软件和硬件两大块。
软件方面又可以分为linux方向和非linux方向,如果做linux方向的话一般host侧选择linux,不过也可以在windows上安装linux虚拟机实现;而非linux方向的话,一般操作系统提供商都会提供自己的开发环境,而这种开发环境一般都是基于windows上的,不过要付费,比如Vxworks的Tornado,再如WinCE下的eMbedded Visual C++ 和wince with platform bulid。
还有就是dsp芯片这块,blackfin用的Visual DSP,TI 系列DSP所用的CCS,这些都是Windows下的集成开发环境。

回答2:

德国segger公司的嵌入式开发环境Embedded Studio安装与测试.

回答3:

有winCE uCOS 或者无操作系统的 都在windows下编的啊

回答4:

本文适用于

ADI Blackfin系列DSP

优视科技BV561EVB开发板

gcc-4.3.1

binutils-2.18

codeblocks-8.02

Skyeye-1.2.5

bfin-uclinux-2008r1-rc8

Cygwin gcc 3.4.4

Visual studio 2005

Visual DSP++ 5.0

在准备好gmp和mpfr之后,就可以开始构建gcc编译器了。gcc编译器的构建可以分为host和target两部分,host部分是可以在宿主机下运行的交叉编译器,target部分则是可以在目标板上运行的库。Target部分的生成需要用到host部分生成的交叉编译器。在此我们只生成host部分的编译器。

1.1 libiberty.lib
在cygwin下编译时要求生成的目标为libiberty.a,这是一个静态库,在vs2005下相应的改为libiberty.lib静态库,它的作用是提供一些c library中未提供的辅助函数。其Makefile分析参见《host-i686-pc-cygwin/libiberty/Makefile解析》这篇文章。

在vs2005下编译时,需要根据需要修改动态生成的config.h文件,根据vs2005提供的库函数进行适当修改(其实就是将一些#define语句改为#undef或者直接注释掉就行了)。然后加入一些vs2005下未提供但libiberty目录下提供了的函数代码。比如ffs.c,strcasecmp等等。

编译时未发现有不兼容的代码。

1.2 libz.lib
这是一个静态库,它的作用是提供压缩算法。其Makefile分析参见《host-i686-pc-cygwin/zlib/Makefile分析》这篇文章。

这个库的生成不需要修改任何代码。编译时未发现有不兼容的代码。

1.3 libcpp.lib
这也是一个静态库,其Makefile分析参见《host-i686-pc-cygwin/libcpp/Makefile分析》这篇文章。

在编译这个库时,需要根据需要修改config.h。同时还要使用到一个头文件dirent.h,这个文件在vs2005下没有,但是有移植过的版本。参见《vs2005下的dirent.h》这篇文章。

1.4 libdecnumber.lib
这是一个静态库,其Makefile分析参见《host-i686-pc-cygwin/libdecnumber/Makefile分析》这篇文章。

在编译这个库时,需要根据需要修改config.h,主要是将一些define语句改为undef。然后要在config.h中加上几个定义:

typedef int int32_t;

typedef unsigned int uint32_t;

typedef unsigned char uint8_t;

typedef unsigned short uint16_t;

typedef unsigned __int64 uint64_t;

1.5 backend.lib
gcc编译器的设计将具体语言的语法语义等分析做为前端,它们将生成相同的中间表示,然后共用一个相同的后端,将这些中间表示转换为CPU相关的汇编文件。Backend.lib中就封装了后端处理所需要的文件。

在编译这个库时,需要修改auto-host.h这个文件中的定义。

1.6 cc1.exe
这是个C语言的编译器,它将C代码转换为bfin的汇编。但是它本身不会调用as进行汇编工作。其makefile分析参见《bfin-xxx-gcc中cc1.exe的生成》。

在编译这个目标时,需要修改auto-host.h这个文件中的定义。

1.7 cc1plus.exe
这是个C++语言的编译器,它将C++代码转换为bfin的汇编代码。但是它本身不会调用as进行汇编工作。其makefile分析参见《bfin-xxx-gcc中cc1plus.exe的生成》。

在编译这个目标时,需要修改auto-host.h这个文件中的定义。

1.8 f951.exe
这是个fortran语言的编译器,它将fortran代码转换为bfin的汇编代码。但是它本身不会调用as进行汇编工作。其makefile分析参见《bfin-xxx-gcc中fortran目标的生成》。

在编译这个目标时,需要修改auto-host.h这个文件中的定义。

1.9 gcov.exe
gcov程序可以用来测试代码的覆盖度,其生成比较简单。仅需要gcov.c,errors.c和version.c即可,没什么可说的。也不需要做什么修改。

1.10 collect2.exe
这个程序的生成也比较简单,但是需要修改auto-host.h。其生成过程参见《bfin-xxx-gcc中collect2目标的生成》。

1.11 xgcc.exe
这个程序可以提供编译,汇编,链接的一条龙服务,但是在vs2005下编译时会有一个问题。

在gcc.c中定义了一些模板:

static const struct compiler default_compilers[] =

{

/* Add lists of suffixes of known languages here. If those languages

were not present when we built the driver, we will hit these copies

and be given a more meaningful error than "file not used since

linking is not done". */

{".m", "#Objective-C", 0, 0, 0}, {".mi", "#Objective-C", 0, 0, 0},

{".mm", "#Objective-C++", 0, 0, 0}, {".M", "#Objective-C++", 0, 0, 0},

{".mii", "#Objective-C++", 0, 0, 0},

{".cc", "#C++", 0, 0, 0}, {".cxx", "#C++", 0, 0, 0},

{".cpp", "#C++", 0, 0, 0}, {".cp", "#C++", 0, 0, 0},

{".c++", "#C++", 0, 0, 0}, {".C", "#C++", 0, 0, 0},

{".CPP", "#C++", 0, 0, 0}, {".ii", "#C++", 0, 0, 0},

{".ads", "#Ada", 0, 0, 0}, {".adb", "#Ada", 0, 0, 0},

{".f", "#Fortran", 0, 0, 0}, {".for", "#Fortran", 0, 0, 0},

{".fpp", "#Fortran", 0, 0, 0}, {".F", "#Fortran", 0, 0, 0},

{".FOR", "#Fortran", 0, 0, 0}, {".FPP", "#Fortran", 0, 0, 0},

{".f90", "#Fortran", 0, 0, 0}, {".f95", "#Fortran", 0, 0, 0},

{".F90", "#Fortran", 0, 0, 0}, {".F95", "#Fortran", 0, 0, 0},

{".r", "#Ratfor", 0, 0, 0},

{".p", "#Pascal", 0, 0, 0}, {".pas", "#Pascal", 0, 0, 0},

{".java", "#Java", 0, 0, 0}, {".class", "#Java", 0, 0, 0},

{".zip", "#Java", 0, 0, 0}, {".jar", "#Java", 0, 0, 0},

/* Next come the entries for C. */

{".c", "@c", 0, 1, 1},

{"@c",

/* cc1.exe has an integrated ISO C preprocessor. We should invoke the

external preprocessor if -save-temps is given. */

"%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\

%{!E:%{!M:%{!MM:\

%{traditional|ftraditional:\

%eGNU C no longer supports -traditional without -E}\

%{!combine:\

%{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \

%(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i} \n\

cc1.exe -fpreprocessed %{save-temps:%b.i} %{!save-temps:%g.i} \

%(cc1_options)}\

%{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\

cc1.exe %(cpp_unique_options) %(cc1_options)}}}\

%{!fsyntax-only:%(invoke_as)}} \

%{combine:\

%{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \

%(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i}}\

%{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\

cc1.exe %(cpp_unique_options) %(cc1_options)}}\

%{!fsyntax-only:%(invoke_as)}}}}}}", 0, 1, 1},

{"-",

"%{!E:%e-E or -x required when input is from standard input}\

%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)", 0, 0, 0},

{".h", "@c-header", 0, 0, 0},

{"@c-header",

/* cc1.exe has an integrated ISO C preprocessor. We should invoke the

external preprocessor if -save-temps is given. */

"%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)}\

%{!E:%{!M:%{!MM:\

%{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \

%(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i} \n\

cc1.exe -fpreprocessed %{save-temps:%b.i} %{!save-temps:%g.i} \

%(cc1_options)\

-o %g.s %{!o*:--output-pch=%i.gch}\

%W{o*:--output-pch=%*}%V}\

%{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\

cc1.exe %(cpp_unique_options) %(cc1_options)\

-o %g.s %{!o*:--output-pch=%i.gch}\

%W{o*:--output-pch=%*}%V}}}}}}", 0, 0, 0},

{".i", "@cpp-output", 0, 1, 0},

{"@cpp-output",

"%{!M:%{!MM:%{!E:cc1.exe -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 1, 0},

{".s", "@assembler", 0, 1, 0},

{"@assembler",

"%{!M:%{!MM:%{!E:%{!S:as.exe %(asm_debug) %(asm_options) %i %A }}}}", 0, 1, 0},

{".sx", "@assembler-with-cpp", 0, 1, 0},

{".S", "@assembler-with-cpp", 0, 1, 0},

{"@assembler-with-cpp",

#ifdef AS_NEEDS_DASH_FOR_PIPED_INPUT

"%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\

%{E|M|MM:%(cpp_debug_options)}\

%{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\

as.exe %(asm_debug) %(asm_options) %|.s %A }}}}"

#else

"%(trad_capable_cpp) -lang-asm %(cpp_options) -fno-directives-only\

%{E|M|MM:%(cpp_debug_options)}\

%{!M:%{!MM:%{!E:%{!S:-o %|.s |\n\

as.exe %(asm_debug) %(asm_options) %m.s %A }}}}"

#endif

, 0, 1, 0},

#include "specs.h"

/* Mark end of table. */

{0, 0, 0, 0, 0}

};

当xgcc检测到不同的参数时,它将套用这些模板调用cc1.exe,as.exe等文件,但是在原来的代码中只使用了cc1,as这样的名称,而没有使用完整的文件名,这样导致在后面使用CreateProcess创建进程时失败。将模板中的cc1,as这样的名称改为cc1.exe,as.exe可以解决这个问题。