IAR EW8051-8.1集成开发环境详解与实战指南

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:IAR EW8051是一款专为8051微控制器设计的集成开发环境,由IAR Systems公司开发,提供编程、调试和优化功能,是8051开发者的关键工具。IAR EW8051-8.1版本包含特定优化和改进。本指南详细介绍如何使用IAR EW8051进行8051开发,包括项目管理、C编译器、汇编器、调试器、模拟器、兼容性、库和外设驱动、代码大小优化、版本控制、文档和支持等核心功能。同时强调合法使用的重要性。 IAR EW8051-8.1集成开发环境详解与实战指南_第1张图片

1. IAR EW8051-8.1集成开发环境概述

集成开发环境(Integrated Development Environment, IDE)是开发者进行软件开发的重要工具。IAR EW8051-8.1作为针对8051微控制器的开发平台,为开发人员提供了从项目管理到代码编译、调试、测试的全链条开发体验。本章将对IAR EW8051-8.1的基本功能、特点和优势进行概述。

1.1 IAR EW8051-8.1功能亮点

IAR EW8051-8.1整合了代码编辑器、编译器、调试器等多个开发组件,支持微控制器的开发需求。它提供了高效的C/C++编译器,能够生成紧凑的代码,确保了在资源有限的8051微控制器上进行优化部署。

1.2 IAR EW8051-8.1的用户界面

用户界面是用户与开发工具交互的第一站,EW8051-8.1的界面设计考虑到了直观易用性。界面中包含了项目管理器、代码编辑窗口、编译状态栏等,这些都旨在帮助开发者更快地熟悉环境。

1.3 IAR EW8051-8.1开发流程概览

使用IAR EW8051-8.1进行软件开发的一般流程包括:创建项目、编写代码、编译生成可执行文件、以及使用内置的调试工具进行程序测试和调试。在项目创建之后,用户可以通过高级编辑功能和项目配置选项来定制开发环境,进一步优化开发过程。

2. 项目管理使用指南

2.1 项目创建与配置

2.1.1 新项目设置向导

当启动IAR EW8051-8.1集成开发环境(IDE)时,通常会遇到创建新项目的提示,或者可以通过"File"菜单下的"New"选项来创建一个新项目。创建项目的过程涉及一系列步骤,这些步骤被集成在一个向导中,简化了项目的初始化配置。

新项目设置向导主要分为几个步骤:

  1. 选择项目模板 :用户可以从预设的模板中选择一个与项目需求相符的模板。这包括空白项目或特定于8051微控制器系列的特定配置项目。

  2. 配置微控制器 :向导会要求用户选择特定的微控制器型号,因为不同的微控制器有各自特定的寄存器和内存结构。

  3. 指定项目名称和路径 :用户需要输入项目的名称,并选择存储位置。名称和路径是以后项目组织和管理的基础。

  4. 配置项目属性 :用户可以设置编译器、调试器的参数和项目特定的选项,如优化级别和代码生成选项。

以下是一个创建新项目的示例代码块:

// 示例:项目创建与配置的伪代码
void createNewProject(string projectName, string mcuType, string projectPath) {
    ProjectTemplates template = selectTemplate(projectName);
    selectMicrocontroller(mcuType);
    projectProperties.setProjectName(projectName);
    projectProperties.setProjectPath(projectPath);
    projectProperties.setMicrocontrollerType(mcuType);
    // 还可以添加更多配置...
}

在上述代码块中,我们定义了一个 createNewProject 函数,它接受项目名称、微控制器类型和项目路径作为参数。该函数首先选择模板,然后选择微控制器类型,设置项目名称和路径,最后配置微控制器的类型。

2.1.2 项目设置与选项

创建新项目后,用户需要进一步细化项目设置和选项。这些设置影响项目的编译行为、目标程序的输出、调试器的行为以及内存使用等。

项目设置可大致分为以下几个方面:

  1. 编译器选项 :包括优化设置、警告级别、代码生成选项等。选择合适的优化级别可以显著影响最终代码的执行效率。

  2. 链接器选项 :涉及如何分配内存、生成输出文件(如Hex或Bin文件)等。适当的链接器设置能帮助避免内存溢出和地址冲突等问题。

  3. 调试器选项 :用户可以指定是否要使用模拟器或实际硬件进行调试。同时设置断点、追踪点和内存视图的配置。

  4. 版本控制选项 :如果团队协作或需要跟踪代码更改,配置版本控制系统(如SVN或Git)是很有必要的。

2.2 文件和目录管理

2.2.1 源文件的添加与删除

在任何项目中,源文件管理都是核心任务之一。IAR EW8051 IDE提供了一整套工具来管理源文件和头文件。

  • 添加源文件 :可以通过"Project"菜单下的"Add New Item"选项来添加新的源文件或头文件。

  • 删除源文件 :选择项目资源管理器中的文件,并右键选择"Remove"可以删除不再需要的文件。

源文件的添加和删除需要特别注意,因为不正确的文件管理可能会导致编译错误和项目构建失败。以下是一个管理源文件的示例代码:

// 示例:添加和删除源文件的伪代码
void addSourceFile(string projectPath, string fileName) {
    // 添加文件到指定项目路径
    fileSystem.copyFile(sourceFilePath, projectPath + fileName);
    projectManager.addFileToProject(projectPath, fileName);
}

void removeSourceFile(string projectPath, string fileName) {
    // 从项目中删除指定文件
    fileSystem.deleteFile(projectPath + fileName);
    projectManager.removeFileFromProject(projectPath, fileName);
}

在这个示例中,我们定义了两个函数 addSourceFile removeSourceFile ,分别用于添加和删除源文件。这两个函数都接受项目路径和文件名作为参数,并通过文件系统和项目管理器API来完成任务。

2.2.2 目录结构的组织与优化

良好的目录结构可以帮助项目维护和团队协作。IAR EW8051 IDE支持自定义目录结构,以适应项目的需要。

  • 创建新目录 :在项目资源管理器中,右键点击项目名称选择"Add" -> "Folder"来创建新目录。

  • 移动文件到新目录 :将文件拖放到新创建的目录中即可将它们移动到该目录。

目录结构的优化对于项目的可维护性和扩展性至关重要。一个合理的目录结构应该反映项目的设计和逻辑结构,使得文件的查找和管理更为方便。优化目录结构的示例代码如下:

// 示例:优化目录结构的伪代码
void optimizeDirectoryStructure(string projectPath, string oldDir, string newDir) {
    // 复制旧目录到新目录路径
    fileSystem.copyDirectory(projectPath + oldDir, projectPath + newDir);
    // 删除旧目录及其内容
    fileSystem.deleteDirectory(projectPath + oldDir);
    // 更新项目文件引用
    projectManager.updateProjectReferences(projectPath, oldDir, newDir);
}

在这段代码中,我们定义了一个函数 optimizeDirectoryStructure ,它将旧目录的内容复制到新目录并删除旧目录。然后,更新项目中的文件引用以反映新的目录结构。这要求项目管理器支持相应的引用更新操作。

2.3 版本控制集成

2.3.1 配置版本控制系统

为了有效管理源代码,IAR EW8051-8.1 IDE集成了版本控制工具。通过"Project"菜单下的"Options",用户可以配置版本控制系统。

配置版本控制系统需要进行以下步骤:

  1. 选择版本控制工具 :用户可以选择Git、SVN或其他支持的版本控制系统。

  2. 设置版本控制参数 :输入版本控制服务器的地址、用户名、密码等参数,以及本地工作副本的位置。

  3. 指定版本控制的项目文件 :IAR EW8051 IDE允许用户指定哪些文件将被版本控制所跟踪。

版本控制系统集成的关键代码块示例:

// 示例:配置版本控制系统的伪代码
void configureVersionControl(string versionControlType, string serverUrl, string userName, string password, string localPath) {
    // 配置版本控制类型
    systemSettings.getVersionControlSettings().setType(versionControlType);
    // 设置服务器地址和认证信息
    systemSettings.getVersionControlSettings().setServerURL(serverUrl);
    systemSettings.getVersionControlSettings().setUserName(userName);
    systemSettings.getVersionControlSettings().setPassword(password);
    // 指定本地副本路径
    systemSettings.getVersionControlSettings().setLocalPath(localPath);
    // 应用配置并保存设置
    systemSettings.saveSettings();
}

在这段代码中,我们定义了一个 configureVersionControl 函数来处理版本控制配置。函数接受版本控制类型、服务器URL、用户名、密码和本地路径作为参数,并更新系统设置。

2.3.2 项目版本的跟踪与管理

一旦版本控制系统配置完成,IAR EW8051 IDE将帮助用户跟踪代码更改,并进行版本控制操作,如提交更改、创建分支或标签等。

跟踪和管理项目版本的步骤包括:

  1. 提交更改 :在项目中进行更改后,用户可以提交这些更改到版本控制系统。

  2. 查看版本历史 :通过IDE可以查看文件或项目的版本历史,包括谁、何时做出了哪些更改。

  3. 差异比较 :用户可以比较两个版本之间的差异,以了解对项目所做的具体更改。

  4. 分支和合并 :在进行较大规模的改动或实验时,使用分支可以避免主分支产生混乱。一旦改动完成,可以将分支合并回主分支。

版本跟踪和管理的关键代码块示例:

// 示例:提交更改到版本控制系统的伪代码
void commitChanges(string message) {
    // 获取版本控制接口
    versionControlInterface vcInterface = systemSettings.getVersionControlInterface();
    // 提交所有更改的文件
    ***mitAll(message);
    // 推送更改到远程服务器
    vcInterface.push();
}

在此代码块中,我们定义了一个 commitChanges 函数,它接受一条提交信息作为参数,并通过版本控制接口来提交所有更改并推送至远程服务器。

通过以上配置和管理,IAR EW8051 IDE与版本控制系统的集成可以极大地提高开发效率,简化团队协作流程。

3. 高效C编译器的特点

C编译器作为集成开发环境中的核心组件,其性能直接影响到最终代码的效率和质量。高效的C编译器不仅能够生成优化的机器代码,还能通过警告和错误处理帮助开发者识别潜在问题。

3.1 编译器优化技术

编译器优化技术是衡量C编译器性能的重要指标之一。它通过多种策略减少程序的运行时间,减小程序的大小,提高程序的运行效率。

3.1.1 代码优化策略

代码优化策略通常分为编译时优化和运行时优化。编译时优化主要是在编译过程中对源代码进行分析,利用各种算法对代码进行等价变换,以达到提高代码效率的目的。运行时优化则依赖于特定的硬件和运行环境,如通过指令重排减少CPU缓存未命中。

优化策略通常包括:

  • 死代码消除 :去除程序中永远不会被执行的代码段。
  • 公共子表达式消除 :发现并消除重复计算的表达式。
  • 循环优化 :包括循环展开和循环融合,减少循环控制开销,提高并行性。
  • 寄存器分配 :优化变量存储,减少内存访问次数,提高效率。

3.1.2 优化级别的选择与效果

编译器通常提供多个优化级别供开发者选择。每个级别会对代码进行不同程度的优化,从而在编译时间和生成代码的效率之间找到平衡。

  • 级别0 :无优化,快速编译,适合开发和调试。
  • 级别1-2 :基本优化,减少简单问题,提升编译速度。
  • 级别3 :中等优化,适用于需要平衡编译速度和代码效率的场景。
  • 级别4及以上 :高级优化,可能大幅提高代码效率,但会显著增加编译时间。

开发者需要根据项目需求选择合适的优化级别,以达到最佳开发效率和程序性能的平衡。

3.2 编译器警告和错误处理

编译器警告和错误处理为开发者提供了代码中可能存在的问题的反馈,是保证程序质量的重要环节。

3.2.1 常见编译错误分析

编译器在编译过程中遇到语法错误会停止编译并给出错误提示。常见的编译错误类型包括但不限于:

  • 语法错误 :比如缺少分号、括号不匹配等。
  • 类型错误 :比如使用了错误的数据类型。
  • 链接错误 :比如函数未定义或重复定义等。

这些错误需要开发者逐一排查并解决,有时错误提示可能非常晦涩,需要开发者有较高的经验和对编译器的熟悉度。

3.2.2 警告信息的解释与处理

除了错误之外,编译器还会产生警告信息。警告信息表明代码可能存在问题或潜在的性能问题,但不会阻止编译过程。如:

  • 未使用的变量 :可能是因为逻辑错误。
  • 函数参数未使用 :可能函数调用错误。
  • 优化建议 :提供代码优化的建议。

开发者应该重视这些警告,通过阅读编译器文档和相关资料,理解每个警告的含义,并据此修改代码。正确处理这些警告可以有效提升代码质量和减少程序运行时的不稳定因素。

通过细致的编译器优化和对警告及错误处理的重视,开发者可以显著提升代码的整体质量,为后续的项目维护和扩展打下坚实的基础。下一章节将探讨汇编语言编程支持,这在嵌入式系统开发中同样具有重要意义。

4. 汇编语言编程支持

4.1 汇编指令集与编程

4.1.1 汇编语言基础

汇编语言是一种低级语言,它为特定的微处理器架构设计,因此与机器语言密切相关,但使用更接近人类语言的符号(助记符)来表示机器指令。每条汇编指令对应一条或多条机器指令。由于汇编语言与硬件平台紧密相关,编写汇编程序需要对目标处理器的指令集架构(ISA)有深入了解。

汇编语言的组成
  • 指令集 : 定义了处理器可以理解和执行的所有指令。
  • 寄存器 : 处理器内部的数据存储区,用于指令执行和操作。
  • 操作数 : 指令操作的源和目标,可以是寄存器、内存地址或立即数(常数值)。
汇编语言的优势
  • 性能 : 汇编语言可以精确控制硬件,实现最优的性能。
  • 资源利用 : 可以编写紧凑的代码,充分利用处理器资源。
  • 特定功能实现 : 对于特定硬件功能,汇编语言可以提供直接的控制手段。

4.1.2 指令集的应用实例

为更好地理解汇编指令集在实际编程中的应用,以下是一个简单的汇编语言程序实例,该程序使用了8051微控制器的汇编指令集来实现一个简单的LED闪烁功能。

ORG 0000H                ; 程序起始地址
MOV P1, #0FFH            ; 将P1端口的值设置为全1
MAIN: MOV P1, #00H       ; 将P1端口的值设置为全0
      CALL DELAY          ; 调用延时子程序
      MOV P1, #0FFH       ; 将P1端口的值设置为全1
      CALL DELAY          ; 再次调用延时子程序
      SJMP MAIN           ; 无限循环

DELAY: MOV R2, #20        ; 延时循环计数器
DELAY_LOOP: MOV R1, #255  ; 内层延时循环计数器
INNER_LOOP: DJNZ R1, INNER_LOOP ; 内层循环
           DJNZ R2, DELAY_LOOP   ; 外层循环
           RET                    ; 返回主程序

END
代码逻辑解读分析
  • ORG 0000H 指定程序加载的起始地址。
  • MOV P1, #0FFH 将P1端口输出设置为高电平(1),关闭所有LED灯(假设LED灯连接方式为正逻辑)。
  • MAIN 标签下是LED闪烁的主要循环,其中 MOV P1, #00H 将P1端口输出设置为低电平(0),打开所有LED灯,之后调用 DELAY 子程序进行延时。
  • DELAY 子程序使用了两个嵌套循环来实现延时效果, DJNZ 是一个带有自动减一操作的跳转指令,当寄存器值不为0时跳转回循环开始处。
  • RET 指令用于从子程序返回到主程序继续执行。
  • END 指令标识程序的结束。

以上代码展示了如何使用汇编语言直接控制硬件资源实现特定功能。在实际开发中,了解和掌握汇编语言对于系统底层的性能优化和硬件控制非常重要。

4.2 C与汇编混合编程

4.2.1 混合编程的优势

C与汇编混合编程是一种高效的开发方式,它允许开发者在C语言中嵌入汇编代码来优化关键部分的性能,同时利用C语言的高级特性进行大部分开发工作。这种混合编程模式结合了两种语言的优点:

  • 性能优化 : 对于性能要求极高的代码段,通过汇编语言优化可以达到C语言无法实现的性能水准。
  • 硬件直接控制 : 直接操作硬件资源,实现底层硬件特性或特定功能。
  • 安全性 : 在C语言提供的安全环境中使用汇编,避免了直接编写汇编时可能出现的一些错误。

4.2.2 混合编程的实践技巧

在实际项目中,混合使用C语言和汇编语言需要遵循一些最佳实践以确保代码的可读性和可维护性。

关键点
  • 编译器约定 : 了解并遵循编译器的调用约定,确保C函数和汇编代码之间的正确参数传递和栈平衡。
  • 代码分离 : 将混合编程的代码逻辑分离,将汇编代码放在独立的文件或模块中,以简化管理和维护。
  • 文档注释 : 为汇编代码提供详尽的文档注释,解释其工作原理和目的,以便其他开发者理解。
示例

考虑一个8051微控制器的场景,假设我们需要优化一个执行频率非常高的数学计算函数,可以考虑使用汇编语言重写关键部分的计算。

// C 函数声明
unsigned int add(unsigned int a, unsigned int b);

// C 函数定义
unsigned int add(unsigned int a, unsigned int b) {
    return a + b;
}

// 调用 C 函数的汇编代码
// 假设这段代码写在另一个汇编文件中
    ; 假设使用的是某个假想的汇编器语法
    MOV A, #a_value     ; 将参数 a 加载到累加器 A
    MOV B, #b_value     ; 将参数 b 加载到寄存器 B
    ACALL add           ; 调用 C 函数
    MOV result, A       ; 将返回值存储到 result 变量

在上述示例中, add 函数被设计为可以被汇编代码调用。这里的汇编代码片段展示了如何使用寄存器传递参数,并调用 C 函数。该方法允许在不改变原有C函数接口的前提下,对C代码进行性能上的优化。

混合编程策略是嵌入式系统领域中一个强大的工具,它使得开发者能够在保证高级语言易用性的同时,利用低级语言来实现对性能和资源的精细控制。正确使用混合编程可以极大提升嵌入式应用的性能和效率。

5. 内置调试器功能

调试器是开发过程中的关键工具,能够帮助开发者理解程序执行过程中的行为,定位和修正程序中的错误。IAR EW8051-8.1提供的内置调试器功能强大,能够覆盖软件开发生命周期的各个阶段。

5.1 调试器界面与操作

调试器的界面设计直观,提供了丰富的视图和窗口,允许开发者从多个角度观察程序的行为。这里我们将重点探讨调试视图的定制和断点及单步调试的技巧。

5.1.1 调试视图的定制

调试视图包括调用栈窗口、寄存器窗口、内存窗口等,它们可以被拖动和调整大小以适应不同的开发需求。在调试过程中,根据需要定制视图能够更加方便地监控程序的运行状态。

- 调用栈窗口:显示当前函数调用堆栈,方便理解函数调用层级关系。
- 寄存器窗口:实时显示寄存器的值,帮助了解程序对寄存器的操作。
- 内存窗口:监视内存地址范围内的数据变化,可以手动输入内存地址查看其值。

开发者可以通过 View 菜单选择需要打开的调试窗口,也可以通过快捷键快速切换。此外,可以将常用的窗口组合保存为用户自定义的工作空间。

5.1.2 断点和单步调试技巧

断点的设置与管理是调试过程中的核心操作,IAR EW8051-8.1允许用户在代码行、内存地址或者特定条件上设置断点。通过断点,可以暂停程序执行,从而检查程序在某个特定时刻的状态。

在单步调试时,可以使用 Step Over (F10)、 Step Into (F11)、 Step Out (Shift+F11)等快捷键操作。这些操作可以按顺序执行每条指令,并在进入函数调用时提供控制。

// 示例代码段,演示如何设置断点并进行单步调试
void function_to_debug() {
    int i = 0;
    i++;
    // 在此处设置断点
}

int main() {
    function_to_debug();  // 开始单步调试
    return 0;
}

5.2 性能分析与优化

在完成代码调试后,通常需要对程序性能进行分析,以确认程序是否在资源使用上达到了最优化。性能分析与优化是确保嵌入式系统高效运行的关键步骤。

5.2.1 CPU和内存使用情况分析

内置调试器能够提供实时的CPU和内存使用情况的分析功能,帮助开发者了解程序的资源消耗情况。开发者可以通过性能分析器对程序进行采样,分析哪些代码段占用的CPU时间最多,哪些函数分配了大量内存,从而进行针对性的优化。

5.2.2 瓶颈定位与性能调优

性能瓶颈通常由程序中效率低下的代码部分引起,使用内置调试器的分析工具能够帮助开发者快速定位到这些瓶颈。一旦定位到瓶颈,开发者就可以通过优化算法、改进数据结构、调整资源分配策略等方法来进行性能调优。

- 优化算法:选择更高效的算法来减少时间复杂度。
- 改进数据结构:通过改变数据组织方式来降低空间复杂度。
- 调整资源分配策略:合理分配有限的资源,如内存和CPU时间,以提高程序效率。

性能优化通常涉及到代码重构,这是一个反复迭代的过程,需要开发者不断地进行分析和调试。

通过本章节的介绍,我们了解了IAR EW8051-8.1内置调试器的功能和操作方法,并学习了如何进行性能分析与优化。接下来将探索模拟器在软件开发中的优势及其应用场景。

6. 模拟器测试优势

模拟器是嵌入式软件开发中不可或缺的工具,它允许开发者在没有实际硬件的情况下测试和验证软件。本章节我们将深入探讨模拟器的工作原理以及如何在不同的测试场景中应用模拟器。

6.1 模拟器的工作原理

模拟器的核心概念是创建一个软件环境,该环境能模拟目标微控制器的硬件行为。通过模拟器,开发者可以在PC上运行和测试微控制器的应用程序,就好像程序是在实际的硬件上运行一样。

6.1.1 模拟器与硬件测试的对比

与传统硬件测试相比,模拟器提供了一种更为灵活和成本效益的测试手段。硬件测试需要目标设备,而模拟器可以在早期的设计和开发阶段就开始使用,这大大减少了对物理硬件的依赖。

6.1.2 模拟器在开发中的优势

模拟器的优势包括: - 快速迭代 :在模拟器上运行程序,修改后可以立即重新测试,加快开发周期。 - 资源节约 :不需要购买多个硬件设备进行测试,可以节省成本。 - 风险降低 :在硬件故障高发阶段之前,就可以发现潜在的问题。

6.2 模拟测试的应用场景

模拟器的适用场景广泛,尤其在功能验证、边界测试、性能分析和软件集成测试方面,它为开发人员提供了强大的工具集。

6.2.1 功能验证与边界测试

模拟器能够模拟异常和边界条件,这在现实世界中很难重现。例如,它可以模拟内存不足、输入信号丢失等异常情况,帮助开发者验证程序在极端条件下的行为。

6.2.2 软件集成测试的模拟环境搭建

软件集成测试涉及多个模块或组件的联合测试。在模拟环境中搭建测试场景,可以不受物理接口限制,测试不同模块间的交互,确保整个系统的稳定性。

代码示例和说明

模拟器测试的一个简单示例,考虑一个8051微控制器模拟器和一个运行其上的简单LED闪烁程序:

#include  // 包含8051寄存器定义

void delay(unsigned int count) {
  unsigned int i;
  while(count--) {
    i = 115; // 一个任意的延迟值
    while(i > 0) i--;
  }
}

void main(void) {
  while(1) {
    P1 = 0xFF; // 将P1端口所有位设置为高电平
    delay(1000); // 调用延迟函数
    P1 = 0x00; // 将P1端口所有位设置为低电平
    delay(1000); // 调用延迟函数
  }
}

上述代码模拟了一个让连接到P1端口的LED灯不断闪烁的程序。在模拟器上运行,无需真实硬件,即可验证程序功能。

模拟器使用技巧

  • 模拟器配置 :根据目标微控制器的具体型号配置模拟器,确保所有硬件特性都被正确模拟。
  • 监控和调试 :利用模拟器提供的监控工具跟踪程序执行流程和寄存器状态。
  • 脚本编写 :为了提高测试效率,可以编写脚本自动化重复的测试任务。

模拟器测试为嵌入式软件开发提供了很多便利,不仅可以减少硬件依赖,而且有助于提高软件质量,降低开发风险。无论你是初学者还是资深开发者,掌握模拟器的使用都是一项宝贵的技能。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:IAR EW8051是一款专为8051微控制器设计的集成开发环境,由IAR Systems公司开发,提供编程、调试和优化功能,是8051开发者的关键工具。IAR EW8051-8.1版本包含特定优化和改进。本指南详细介绍如何使用IAR EW8051进行8051开发,包括项目管理、C编译器、汇编器、调试器、模拟器、兼容性、库和外设驱动、代码大小优化、版本控制、文档和支持等核心功能。同时强调合法使用的重要性。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

你可能感兴趣的:(IAR EW8051-8.1集成开发环境详解与实战指南)