Microsoft Word - EWARM快速入门指南-ST.doc

Similar documents
EK-STM32F

言1.PDF

epub83-1

untitled

目 录

ICD ICD ICD ICD ICD

第1章 IAR EWARM入门

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor

NEXT SDT2.51 C:\ARM251 SDT2.51 ARM SDT 2.51 ARM PROJECT MANAGER SDT 2

untitled

Abstract arm linux tool-chain root NET-Start! 2

ARM JTAG实时仿真器安装使用指南

Microsoft Word - 11.doc

Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE "Project Properties" IDE makefile 1.

Using STM32 Software Library

IAR Embedded Workbench用户指南

AL-M200 Series

untitled

Oracle Oracle Solaris Studio IDE makefile C C++ Fortran makefile IDE Solaris Linux C/C++/Fortran Oracle IDE "P

手册 doc

WebSphere Studio Application Developer IBM Portal Toolkit... 2/21 1. WebSphere Portal Portal WebSphere Application Server stopserver.bat -configfile..

1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F B. 1(VCC/GND) SH79F6431 C. VDDIO SH79F6431 P4 P5 P0.6 P0.7 VDDIO VDDIO=5V D. 2 V 1.0

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

专注于做最好的嵌入式计算机系统供应商

Microsoft Word - 在VMWare-5.5+RedHat-9下建立本机QTopia-2.1.1虚拟平台a.doc

Guide to Install SATA Hard Disks

K7VT2_QIG_v3

Microsoft Word - template.doc

51 C 51 isp 10 C PCB C C C C KEIL

ebook140-9

Microsoft Word zw

Cadence SPB 15.2 VOICE Cadence SPB 15.2 PC Cadence 3 (1) CD1 1of 2 (2) CD2 2of 2 (3) CD3 Concept HDL 1of 1

els0xu_zh_nf_v8.book Page Wednesday, June, 009 9:5 AM ELS-0/0C.8

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

Symantec™ Sygate Enterprise Protection 防护代理安装使用指南

audiogram3 Owners Manual

ARM Cortex-M3 (STM32F) STMicroelectronics ( ST) STM32F103 Core: ARM 32-bit Cortex -M3 CPU 72 MHz, 90 DMIPS with 1.25 DMIPS/MHz Single-cycle multiplica

WinMDI 28

Chapter 2

麻 省 理 工 學 院 是 在 西 元 2013 年 12 月 3 日 推 出 MIT App Inventor 2 網 站, 提 供 免 費 的 雲 端 服 務, 使 用 者 可 以 透 過 瀏 覽 器 來 開 發 Android 裝 置 應 用 程 式, 該 網 站 的 網 址 為 : http

基于UML建模的管理管理信息系统项目案例导航——VB篇

KT-SOPCx开发套件简明教程

SMART 7P 0 HR7P OTPMCU A/D I/O OTP ROM RAM HR7P HR7P HR7PPMB MSOP0 7+input HR7PPSC HR7PPSD SOP SOP6 +input input HR7PERB SSOP0 7

68369 (ppp quickstart guide)

C语言的应用.PDF

Simulator By SunLingxi 2003

CC213

IP505SM_manual_cn.doc

GoFlex Home UG Book.book

0 配置 Host MIB 设备 V ( 简体版 ) 0 Update: 2016/1/30

目 錄 版 次 變 更 記 錄... 2 原 始 程 式 碼 類 型 之 使 用 手 冊... 3 一 安 裝 軟 體 套 件 事 前 準 備... 3 二 編 譯 流 程 說 明

LSI U320 SCSI卡用户手册.doc

Microsoft Word - InoTouch Editor编程软件手册 doc

JTAG ICE PC JTAG ICE JTAG ISP... 5 IDE AVR STUDIO JTAGICE JTAGICE... 12

F515_CS_Book.book

Microsoft Word - QTP测试Flex.doc

目次 

USB解决方案.ppt

Microsoft Word - Codewarrior IDE快速入门.docx

Windows XP

f2.eps

Microsoft Word - Front cover_white.doc

P4VM800_BIOS_CN.p65

新建 Microsoft Word 文档.doc

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

简 介 本 白 皮 书 高 度 概 述 了 支 持 移 动 互 联 网 设 备 (Mobile Internet Device) 的 Intel C++ Software Development Tool Suite for Linux* OS, 目 标 读 者 主 要 是 技 术 决 策 制 订

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

P4V88+_BIOS_CN.p65

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

Windows 2000 Server for T100

Bus Hound 5

第七章 中断

ebook140-8

untitled

典型自编教材

rz_Newsletter2016_en_ indd

通 用 申 请 填 写 流 程 简 图 首 次 登 陆 已 注 册 用 户 登 录 ( 最 终 提 交 前 可 无 限 次 登 录 修 改 ) 注 册 账 户 College Search 中 添 加 New York University Common App 填 写 ( 包 含 两 篇 写 作

2 2 3 DLight CPU I/O DLight Oracle Solaris (DTrace) C/C++ Solaris DLight DTrace DLight DLight DLight C C++ Fortran CPU I/O DLight AM

自动化接口

1

4. I/O I/O Copyright 2001, Intellution, Inc. 4-1

PowerPoint Presentation

PPBSalesDB.doc

Microsoft Word - H6800BM_translation base_Update_1_2014_ doc

Microsoft Word - 3D手册2.doc

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

(Guangzhou) AIT Co, Ltd V 110V [ ]! 2

图 片 展 示 : 资 源 简 介 : FPGA Altera CycloneII EP2C5T144C8 (4608 个 LE) 2 路 有 源 晶 振 (50M,25M) AS & JTAG 标 准 接 口 VGA 接 口 UART 接 口 蜂 鸣 器 8bit 并 行 DAC 8 路 按 键

User ID 150 Password - User ID 150 Password Mon- Cam-- Invalid Terminal Mode No User Terminal Mode No User Mon- Cam-- 2

Smart2.doc

ebook71-6

目录目录 32-bit ARM Cortex -M3 MCU 1 简介...5 关于快速入门指南... 5 关于 Keil MDK-ARM 系统要求 软件安装...8 Keil MDK-ARM 安装... 8 安装 Keil HT32 支持包 安装 USB 调

Microsoft Word - MSP430 Launchpad 指导书.docx

Microsoft Word - Datastream5.1_使用說明201110

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

Transcription:

IAR Embedded Workbench for ARM 快速入门指南 Revision 1.00 (for IAR EWARM v5.10 and later versions) 爱亚软件技术咨询 ( 上海 ) 有限公司 www.iar.com 地址 : 上海市黄陂北路 227 号中区广场 2510 室 0

目 录 EWARM 集成开发环境及 J-LINK 仿真器...2 1.IAR EWARM 简介...2 2.IAR J-LINK 仿真器简介...2 3. 下载和安装 EWARM...2 生成一个新项目...7 1. 建立一个项目文件目录...7 2. 生成新的工作区...7 3. 生成新项目...8 4. 给项目添加文件...9 5. 配置项目选项...10 链接器配置文件...14 1. 链接器 ILINK 及其配置文件 ICF...14 2. ICF 格式浅析...14 3. ICF 文件举例...18 编译和链接应用程序...20 1. 编译和链接...20 2. 查看 MAP 文件...21 用 C-SPY 下载和调试应用程序...22 1. 配置 DEBUGGER 选项...22 2. 下载应用程序...23 3. 在源代码上调试...24 4. 查看变量...24 5. 设置和监视断点...26 6. 在反汇编窗口上调试...27 7. 监视寄存器...28 8. 查看存储器...28 9. 观察 TERMINAL I/O...29 10. 执行和暂停程序...29 更多参考信息...30 地址 : 上海市黄陂北路 227 号中区广场 2510 室 1

EWARM 集成开发环境及 J-Link 仿真器 1.IAR EWARM 简介 IAR Embedded Workbench for ARM( 下面简称 EWARM) 是一款针对 ARM 处理器的集成开发环境, 包含项目管理器 编辑器 C/C++ 编译器 汇编器 链接器和调试工具 C-SPY 等所有开发过程中所需的模块 在 EWARM 环境下可以使用 C/C++ 和汇编语言方便地开发嵌入式应用程序 比较其他的 ARM 开发环境, EWARM 具有入门容易 使用方便 编译效率高 生成的代码紧凑等优点 目前 (2008 年 8 月 )IAR EWARM 的最新版本号是 5.20 为了方便用户的学习和评估,IAR 提供两个免费的版本 : 具有 32KB 代码限制的 EWARM KickStart, 和具有 30 天时间限制的 EWARM Evaluation 用户可以到 IAR 公司的网站 www.iar.com/ewarm 去注册和下载 2.IAR J-Link 仿真器简介 IAR J-Link 是为基于 ARM 内核的处理器而推出的 JTAG 调试工具 它能够与 IAR EWARM 集成开发环境无缝集成, 可支持 ARM7/ARM9/ARM11 以及 Cortex-M3 处理器上的代码下载和调试 J-Link for ARM 的主要特点如下 : 支持基于 ARM7/ARM9/ARM11/Cortex-M3 内核的处理器 支持标准 JTAG 接口和 Cortex-M3 所特有的 SWD 接口 下载速度最高可达 800 KB/s 最高 JTAG 频率 12 MHz 目标板电压范围 1.8V 5.0V 自动速率识别 自动监测所有 JTAG 信号和目标板电压 J-Link 本身使用 USB 接口供电, 无需外接电源 J-Link 的一端通过 USB 接口与 PC 相连, 另一端通过标准的 20 芯 JTAG 接头与目标板相连 连接时, 应首先将 J-Link 与 PC 连接, 再将 J-Link 与目标板连接, 最后给目标板供电 3. 下载和安装 EWARM IAR EWARM KickStart 版本具有 32KB 代码限制, 但没有时间限制, 适合入门者学习使用 EWARM Evaluation 版本没有功能上的限制, 但具有 30 天的时间限制, 适合商业用户在购买正式版本之前评估使用 下面以 KickStart 版本为例 用户可以在 EWARM 的产品主页 www.iar.com/ewarm 上注册和下载, 或直接前往 :http://supp.iar.com/download/sw/?item=ewarm-ks32 地址 : 上海市黄陂北路 227 号中区广场 2510 室 2

点击 Continue 继续 : 然后填写注册信息, 并点击 Submit registration 继续 : 地址 : 上海市黄陂北路 227 号中区广场 2510 室 3

完成上述步骤后, 系统会自动生成一封 Email 并发往注册信息中填写的邮箱, 内容类似于 : 在浏览器中打开上面邮件中的下载页面链接 : 然后就可以从上面的链接里下载 EWARM KickStart 版本的安装文件了, 请将其保存到本地磁盘里 ( 例 如 EWARM-KS-WEB-520.exe) 运行该文件, 开始安装 EWARM: 地址 : 上海市黄陂北路 227 号中区广场 2510 室 4

点击 Install IAR Embedded Workbench, 根据提示操作, 直到要求输入 License Number: 填写用户信息, 并将前面 Email 里提供的 License Number 输入 License# 框中, 点击 Next 继续 : 地址 : 上海市黄陂北路 227 号中区广场 2510 室 5

将前面 Email 里提供的 License Key 拷贝粘贴到 License Key 框中, 注意 # 号之前 ( 包括 # 号 ) 的字符 串必须原封不动地拷贝, 不可包含空格或换行符 点击 Next, 根据提示继续前行, 直到安装完成 : 最后, 如果是第一次使用 J-Link 的话还需要安装 J-Link 的 USB 驱动程序 用 USB 电缆将 J-Link 与 PC 机连接, 这时会弹出下图所示的硬件安装向导窗口 : 选择从列表或指定位置安装, 并指向 EWARM 安装路径中的 J-Link 驱动程序目录, 缺省为 : C:\Program Files\\Embedded Workbench 5.0 KickStart\arm\drivers\Jlink 然后根据提示完成安装即可 以后每次将 J-Link 连接到 PC 时, 不会再提示安装驱动程序,J-Link 上的 LED 指示灯应在短暂闪烁之后保持长亮 地址 : 上海市黄陂北路 227 号中区广场 2510 室 6

生成一个新项目 要为某个目标系统开发一个新的应用程序, 必须从建立一个新项目 (Project) 开始 下面我们以 IAR STM32-SK 开发板上的 LCD_Demo 项目为例进行介绍 1. 建立一个项目文件目录 首先应该为新项目创建一个目录, 用来存放与项目有关的各种文件 项目开发过程中生成的一系列文件, 如工作区文件, 项目配置文件, 调试配置文件, 各种列表文件和输出文件等都将被存放在这个目录下 用户也可以选择把各种源文件也放在这个目录下 在下面的例子中, 我们创建一个 C:\Program files\iar Systems\My projects 目录 为了方便起见, 我们把 EWARM 自带的例程 LCD_Demo 文件夹和库函数 library 文件夹都复制到此目录下 ( 可以在这里找到这两个文件夹 :C:\Program Files\\Embedded Workbench 5.0 KickStart\arm\examples\ST\STM32F10x\IAR-STM32-SK) 2. 生成新的工作区 EWARM 虽然是按照项目进行管理, 但是项目 (Project) 必须放在工作区 (Workspace) 内 一个工作区中允许存放一个或多个项目 用户如果是第一次使用 EWARM 来开发新项目, 则必须先创建一个新工作区, 然后才能在该工作区中创建新项目 如果用户过去已经建立了工作区, 并希望把目前要建立的新项目也放在老工作区内, 则可以直接打开老工作区 (*.eww) 并执行第三步来生成新项目 创建新工作区的方法是 : 选择主菜单 File > New > Workspace 命令 如果当前正在开发或调试另一个项目,EWARM 将提示用户保存和关闭当前活跃工作区, 然后开启一个空白工作区窗口, 如图所示 : 注 :EWARM 开发环境在启动时也自动显示上述空白工作区窗口 ( 如果关闭 Startup Screen 的话 ) 地址 : 上海市黄陂北路 227 号中区广场 2510 室 7

3. 生成新项目 1 选择主菜单 Project > Create New Project, 弹出生成新项目的窗口, 如下图 EWARM 提供几种应 用程序和库程序的项目模版 在本例中我们选择最常用的 Empty project 模版, 即所有代码都由用户添加 2 在 Tool chain 下拉框中选择 ARM, 然后点击 OK, 弹出 另存为 窗口 3 在 另存为 窗口中选择新建的 My projects\lcd_demo 目录, 输入新项目的文件名为 STM32_LCD, 然后保存 这时在屏幕左边的 Workspace 窗口中将显示新建的项目名称和配置模式, 如下图 : 地址 : 上海市黄陂北路 227 号中区广场 2510 室 8

项目名称后面的 Debug 表示当前激活的配置模式 EWARM 为每个新项目提供两种缺省的配置模式 : Debug 和 Release Debug 模式生成包含调试信息的可执行文件, 且编译器优化级别较低 ;Release 模式生成不含调试信息的发行版本文件, 且编译器优化级别较高 用户可以从 Workspace 窗口顶部的下拉菜单中选择合适的配置模式, 当然也可以创建自己的配置模式 ( 主菜单 Project > Edit configurations) 本例中我们选择 Debug 现在 My projects\lcd_demo 目录下已经生成一个 STM32_LCD.ewp 文件, 该文件中包含与 STM32_LCD 项目有关的配置信息, 如编译 链接等选项 注 :STM32_LCD - Debug 后面的*号表示当前的工作区和项目经修改后还没有被保存 4 保存工作区新生成的工作区需保存才有效 可选择主菜单 File > Save Workspace, 选择 My projects\lcd_demo 目录, 输入工作区名称 STM32_LCD, 然后保存退出 这时在 My projects\lcd_demo 目录下又生成一个 STM32_LCD.eww 文件, 以及一个 settings 子目录, 该目录下主要存放与诸如窗口设置和断点设置等当前操作信息有关的文件 注 : 保存操作完成后, 项目名称后面的*号已经消失 4. 给项目添加文件 保存工作区之后的下一步就是往项目中添加文件 项目中的文件允许分组, 用户可以根据需要来组织源文件 为举例说明, 我们在下面建立一个 Module 文件组 注 : 往项目中添加文件时只需要添加汇编语言源程序和 C/C++ 源程序, 不需要添加头文件 ; 但必须在配置编译器 汇编器选项时指明包含头文件的其它路径 新建项目 STM32_LCD 位于前面提到的 My projects\lcd_demo 目录下, 其中有 4 个文件夹 :app modules board config app 中有 main.c 和 STM32 的中断处理函数等,modules 包含例子中所用到的 LCD 驱动程序,board 包含了 STM32 的一些汇编宏定义,config 则含有链接器配置文件 STM32F10x_FLASH.icf 添加文件的方法如下: 1 点击工作区窗口中的项目名称 STM32_LCD Debug, 使其高亮 按鼠标右键, 在弹出菜单中选择 Add Group ; 或选择主菜单 Project > Add Group, 执行添加文件组命令, 将文件组起名为 Module 2 点击工作区窗口中刚建立的文件组 Module, 使其高亮 然后按鼠标右键, 在弹出菜单中选择 Add Files ; 或选择主菜单 Project > Add Files, 执行添加文件命令 在添加文件的窗口中选择 My projects\lcd_demo\modules 目录, 从中选择 drv_hd44780_l.c 和 drv_hd44780.c, 点击 Open 按钮, 这两个文件将被添加到工作区窗口的 Module 文件组下 注 : 头文件不需要添加 ; 但为了察看方便起见, 也可以将 drv_hd44780_cnfg.h 一并添加进去 3 其他分组也用类似上面的办法进行组织 全部完成之后, 工作区窗口中的显示如下图所示 : 地址 : 上海市黄陂北路 227 号中区广场 2510 室 9

注 : 本例中还需要用到 STMicroelectronics 提供的 STM32 Firmware Library 中的部份代码, 如上图中 STM32F10xFWLib 文件组中的 stm32f10x_adc.c,stm32f10x_flash.c 等 这些文件应该在第一步中已经被 复制到 My projects\library\src 目录下 5. 配置项目选项 生成新项目和添加源文件之后, 下一步即是配置项目选项 在创建新项目时, 我们选择了 Empty project 模版, 表示采用默认的配置选项 ; 但这些默认的设置还需要根据具体的情况进行修改 下面介绍一些关键选项的设置 : 1 通用选项设置 (General Options) IAR EWARM 允许为项目中的每一个配置模式 ( 例如 Debug 或 Release) 单独设置不同的选项 下面以 STM32_LCD 项目的 Debug 配置模式为例 选中工作区窗口中的项目名称 STM32_LCD Debug, 按鼠标右键, 在弹出菜单中选择 Options ; 或选择主菜单 Project > Options 在弹出的 Options 窗口左边的目录 (Category) 中选择第一项 General Options, 然后在 : Target 页面中,Processor variant 框中选择 Device, 并点击右边的器件选择按钮, 根据所使用的目标硬件, 选择正确的芯片型号, 如 ST STM32F10x, 其他选项保持默认, 如下图 ; 其他页面保持缺省选项 地址 : 上海市黄陂北路 227 号中区广场 2510 室 10

2 C/C++ 编译器选项设置 (C/C++ Compiler) 在 Options 窗口左边的 Category 中选择第二项 C/C++ Compiler, 然后分别在 : Language 页面中, 选择语言类型为 C, 且 Allow IAR extensions; Code 页面无需配置, 因为 Cortex-M3 内核只支持 Thumb-2 指令集 若使用基于 ARM7/ARM9 内核的处理器, 则须在 Code 页面中选择 32-bit 的 ARM 指令集或 16-bit 的 Thumb 指令集, 以及是否允许代码被使用另一种指令集编译的代码所调用 (Generate interwork code) Optimizations 页面中, 根据需要选择优化级别 ; 本例可选择 None 或 Low; Preprocessor 页面中, 列有标准的头文件包含目录 如果用户的头文件既不在标准包含目录下, 也不和 C/C++ 源文件位于同一目录下, 则必须在 Additional include directories 中输入头文件的包含路径, 每个目录占据一行 本例中, 我们添加了全部的头文件路径, 包括 My projects\lcd_demo 及其 app,board,modules 子目录, 以及 My projects\library\inc 目录, 如下图 注 :$TOOLKIT_DIR$ 表示 EWARM 的安装目录 ( 缺省为 C:\Program Files\\Embedded Workbench 5.0 KickStart\arm),$PROJ_DIR$ 表示当前项目文件 (*.ewp) 所在的目录 用这两个宏作为相对路径的根目录, 可以在代码被拷贝到其他电脑上时不至于发生找不到包含路径的错误 地址 : 上海市黄陂北路 227 号中区广场 2510 室 11

3 Assembler 选项设置 (Assembler) Options 窗口左边的 Category 中, 第三项是 Assembler, 表示与汇编器相关的配置选项 ; 本例中保持缺省配置即可 4 Linker 选项设置 (Linker) 在 Options 窗口左边的 Category 中选择第六项 Linker, 然后分别在 : Config 页面中, 给出链接器配置文件 (Linker Configuration File) 的路径 这是链接器选项中最重要同时也是最复杂的设置 链接器配置文件中包含链接器的各项命令行参数, 主要用于控制程序里的各个代码段和数据段在存储器中如何分布 关于这个文件的详细情况在下一章中还要讲述, 这里只要把 config 目录下面的 STM32F10x_FLASH.icf 文件添加到 Override default 设置框中即可, 如下图 ; List 页面中, 选择 Generate linker map file, 以便生成一个描述链接结果 ( 即各个代码段和数据段在存储器里的分布情况 ) 的 map 文件 地址 : 上海市黄陂北路 227 号中区广场 2510 室 12

地址 : 上海市黄陂北路 227 号中区广场 2510 室 13

链接器配置文件 链接器 (Linker) 可以把汇编器和编译器所生成的可重定位的目标文件转换成 ELF/DWARF 格式的输 出镜像 EWARM 从版本 5 开始, 采用了名为 ILINK 的新版链接器, 而不是以往的 XLINK 链接器, 所以配 置文件也有了很大的区别 为了掌握 EWARM 开发环境的使用, 有必要理解链接器配置文件的使用和定义 1. 链接器 ILINK 及其配置文件 ICF EWARM 5.xx 中的链接器称为 ILINK ILINK 可以从 ELF/DWARF 格式的目标文件中提取代码和数据, 并生成可执行的输出镜像 对于 ELF/DWARF 格式而言, 基本的链接单元是 section,section 的类型有 code 和 data, 属性可以是 readonly(ro),readwrite(rw) 和 zeroinit(zi) ILINK 根据 ILINK Configuration File (*.icf) 来分配和定位这些 sections 下面简要介绍 ICF 文件的格式和语法, 详细内容请参考 EWARM 自带的开发指南 (EWARM_DevelopmentGuide.pdf) 2. ICF 格式浅析 一个标准的 ICF 文件可包括下面内容 : 可编址的存储空间 (memory) 不同的存储器地址区域 (region) 不同的地址块 (block) section 的初始化与否 section 在存储空间中的放置 下面介绍几条在 ICF 文件中常用的命令 define [ exported ] symbol name = expr; 作用 : 指定某个符号的值 参数 : exported name expr 导出该 symbol, 使其可以在程序中使用 符号名 符号值 举例 : define symbol RAM_START_ADDRESS = 0x40000000; /* 定义 RAM 起始地址 */ define symbol RAM_END_ADDRESS = 0x4000FFFF; /* 定义 RAM 结束地址 */ 地址 : 上海市黄陂北路 227 号中区广场 2510 室 14

define memory name with size = expr [, unit-size]; 作用 : 定义一个可编址的存储地址空间 (memory) 参数 : name memory 的名称 expr memory 的大小 unit-size expr 的单位, 可以是位 (unitbitsize), 缺省是字节 (unitbytesize) 举例 : define memory MEM with size = 4G; /* 定义一个 4G 字节的地址空间, 名称为 MEM */ define region name = region-expr; 作用 : 定义一个存储地址区域 (region) 一个区域可由一个或多个地址区间组成, 每个区间之内的地址必须连续, 但几个区间之间不必是连续的 参数 : name region 的名称 region-expr memory:[from expr { to expr size expr}], 可定义起止范围, 也可定义起始地址和区域大小举例 : define region ROM = MEM:[from 0x0 size 0x10000]; /* 定义 ROM region, 位于地址空间 MEM 中, 起始地址为 0x0, 大小为 0x10000 字节 */ define region ROM = MEM:[from 0x0 to 0xFFFF]; /* 定义 ROM region, 位于地址空间 MEM 中, 起始地址为 0x0, 结束地址为 0xFFFF */ define block name [ with param, param... ] { extended-selectors }; 作用 : 定义一个地址块 (block); 它可以是个只保留指定大小的地址空间的空块, 比如栈 堆 ; 也可以 参数 : name 包含一系列的 sections, 由 extended-selectors 选择 block 的名称 param 可以是 : size = expr ( 块的大小 ) maximum size = expr ( 块大小的上限 ) alignment = expr ( 最小对齐字节数 ) fixed order ( 按照固定顺序放置 sections) extended-selector [ first last ] { section-selector block name overlay name } 地址 : 上海市黄陂北路 227 号中区广场 2510 室 15

first 最先存放 last 最后存放 section-selector [ section-attribute ][ section sectionname ][object filename ] section-attribute [ readonly [ code data ] readwrite [ code data ] zeroinit ] sectionname section 的名称 filename 目标文件的名称 name block 或 overlay 的名称注 : 这里可以按照 section 的属性, 名称及其所在目标文件这三个过滤条件中, 任意选取一个条件或多个条件进行组合, 来圈定所要求的 sections 举例 : define block HEAP with size = 0x1000, alignment = 4 { }; /* 定义 HEAP block, 大小为 0x1000,4 字节对齐, 没有内容 */ define block MYBLOCK1 = { section mysection1, section mysection2, readwrite }; /* 定义 MYBLOCK1 block, 含有 mysection1,mysection2, 以及所有 readwrite 属性的 sections */ define block MYBLOCK2 = { readwrite object myfile2.o }; /* 定义 MYBLOCK2 block, 含有目标文件 myfile2.o 中所有 readwrite 属性的 sections */ define block MYBLOCK3 = { readonly code object myfile3.o }; /* 定义 MYBLOCK3 block, 含有目标文件 myfile3.o 中所有 readonly 属性的 code sections */ initialize { by copy manually } [ with param, param... ] { section-selectors }; 作用 : 初始化 sections 参数 : by copy 在程序启动时自动执行初始化 manually 在程序启动时不自动执行初始化 param 可以是 : packing = { none compress1 compress2 auto } copy routine = functionname packing 表示是否压缩数据, 缺省是 auto functionname 表示是否使用自己的拷贝函数来取代缺省的拷贝函数 section-selector 同上 举例 : initialize by copy { readwrite }; /* 在启动时初始化所有属性为 readwrite 的 sections */ 地址 : 上海市黄陂北路 227 号中区广场 2510 室 16

do not initialize { section-selectors }; 作用 : 规定在程序启动时不需要初始化的 sections; 一般用于 no_init 声明的变量段 (.noinit) 参数 : section-selector 同上举例 : do not initialize {.noinit }; /* 在启动时不要初始化.noinit section */ place at { address memory [:expr] start of region_expr end of region_expr } { extended-selectors }; 作用 : 把 section 或 block 放置在某个具体的起始地址处, 或者一个 region 的开始或结束处参数 : memory memory 的名称 expr 地址值, 该地址必须在 memory 所定义的范围内 region_expr region 的名称 extended-selector 同上举例 : place at end of ROM { section.checksum }; /* 把.checksum 放在 ROM region 的最后 */ place at address MEM:0x0 { section.intvec }; /* 把.intvec 放在地址 0x0 */ place at address MEM:0x1000 { section.text object myfile.o }; /* the.text section of myfile.o */ place at address MEM:0x1000 { readonly object myfile.o }; /* all read-only sections of myfile.o */ place at address MEM:0x1000 { readonly data object myfile.o }; /* all read-only data sections of myfile.o */ place in region-expr { extended-selectors }; 作用 : 参数 : region-expr extended-selector 把 section 或 block( 按任意顺序 ) 放置在某个 region 中 region 的名称 同上 地址 : 上海市黄陂北路 227 号中区广场 2510 室 17

举例 : place in ROM { readonly }; /* all readonly sections */ place in RAM { readwrite }; /* all readwrite sections */ place in RAM { block HEAP, block CSTACK, block IRQ_STACK }; /* heap and stacks */ place in ROM { section.text object myfile.o }; /* the.text section of myfile.o */ place in ROM { readonly object myfile.o }; /* all read-only sections of myfile.o */ place in ROM { readonly data object myfile.o }; /* all read-only data sections myfile.o */ 下面列举一些系统预定义的 section 和 block 的功能, 及其通常所在的存储空间 : Section/Block 名称 描述 存储空间 CSTACK User 和 System 模式所用到的栈 RAM IRQ_STACK IRQ 模式所用到的栈 RAM HEAP 堆 RAM.intvec 异常向量表 ROM.cstart 初始化代码 ROM.text 程序代码 ROM.data 初始化的静态和全局变量 RAM.bss 未初始化的静态和全局变量 RAM.noinit 由 no_init 声明的静态和全局变量 RAM.rodata 常量 ROM 3. ICF 文件举例 图 3-1 ICF(1) 图 3-1 中首先定义了一些增加可读性的符号, 包括异常向量表的起始地址,ROM RAM 的起止地址和堆 栈的大小等 以前缀 ICFEDIT_ 开头的符号是由图形化编辑工具 ICF Editor 自动定义的, 如果不用 ICF Editor 来编辑 ICF 文件, 这些符号名可以任意定义 地址 : 上海市黄陂北路 227 号中区广场 2510 室 18

图 3-2 ICF(2) 图 3-2 定义了可编址的存储空间为 4G 字节, 以及 ROM_region 和 RAM_region 所对应的地址区域 图 3-3 ICF(3) 图 3-3 中创建了 2 个块 :CSTACK 和 HEAP, 用于栈和堆的放置, 均为 8 字节对齐 图 3-4 ICF(4) 图 3-4 表示对所有 readwrite 属性的 sections( 如.data,.bss 等 ) 进行自动初始化, 而对于.noinit 这个 section 则不做初始化处理 ( 包含用 no_init 修饰的全局或静态变量 ) 图 3-5 ICF(5) 图 3-5 对所有的 sections 和 blocks 在地址空间中所处的位置进行了配置 首先将只读的异常向量表.intvec 放置在 0x08000000 地址处, 然后将余下的只读 sections 以任意顺序存放在 ROM_region 中, 将可读写的 sections 和栈 堆这些 blocks 以任意顺序存放在 RAM_region 中 上面就是一个 ICF 链接器配置文件的基本内容 地址 : 上海市黄陂北路 227 号中区广场 2510 室 19

编译和链接应用程序 1. 编译和链接 选中工作区窗口中的项目名称 STM32_LCD Debug, 再选择主菜单 Project > Make, 或按鼠标右键在弹出菜单中选择 Make,EWARM 将执行编译链接处理, 生成可执行的 ELF/DWARF 文件 在 Build 窗口中将显示编译链接处理过程的信息 编译的结果将生成各个汇编源文件和 C/C++ 源文件所分别对应的目标文件和列表文件 ; 链接的结果将生成一个带调试信息的可执行文件 STM32_LCD.out 和一个存储器分配文件 STM32_LCD.map, 如下图所示 : 从每个源文件前面的 + 号所展开的树型结构中, 可以看到有哪些头文件与它关联, 同时生成了哪些输出文件 因为我们选择的是该项目中的 Debug 配置模式, 所以在 My projects\lcd_demo 目录下自动生成了一个 Debug 子目录 Debug 子目录又包含另外 3 个子目录, 分别为 List Obj 和 Exe, 它们的用途如下 : List 目录存放列表文件和 MAP 文件, 后缀分别是 *.lst 和 *.map; Obj 目录存放编译器和汇编器生成的目标文件, 后缀为 *.o, 可以用作 ILINK 链接器的输入文件 ; Exe 目录存放可执行文件, 后缀为 *.out, 可以用作 C-SPY 调试器的输入文件 地址 : 上海市黄陂北路 227 号中区广场 2510 室 20

2. 查看 MAP 文件 双击工作区窗口中的 STM32_LCD.map 文件, 编辑器窗口中将显示该 MAP 文件 从 MAP 文件中我们 可以了解以下内容 : 文件头中显示链接器版本, 输出文件名,MAP 文件名以及链接器命令行等 RUNTIME MODEL ATTRIBUTES 部份显示 Endian 等属性 PLACEMENT SUMMARY 部份显示各 sections 在存储器中的分布 INIT TABLE 部份显示与初始化有关的 section tables MODULE SUMMARY 部份显示所有被连接的文件信息, 包括目标文件和库文件等 ENTRY LIST 部份给出了所有函数的入口地址及其所在的目标文件 文件尾中显示了总的代码和数据字节数 如果编译链接过程中没有产生任何错误, 则生成 ELF/DWARF 格式的 STM32_LCD.out 可执行文件, 并可以用于在 C-SPY 中的调试 地址 : 上海市黄陂北路 227 号中区广场 2510 室 21

用 C-SPY 下载和调试应用程序 1. 配置 Debugger 选项 在开始调试之前必须配置 C-SPY 调试器的相关选项 选择主菜单 Project > Options, 并在左边的 Category 中选择 Debugger Setup 页面, 在 Driver 下拉菜单中选择 J-Link/J-Trace, 同时选择 Run to main, 见下图 如果用户没有购买 IAR 的 J-Link 仿真器或者其他可被支持的仿真器, 也可选择 Simulator, 进行软件模拟 Download 页面, 选择 Verify download 和 Use flash loader(s), 如下图 要进行应用程序的调试, 必须首先将程序下载到目标系统的 Flash 中 调试器 C-SPY 是通过一个叫做 Flash loader 的程序完成数据传输,Flash 擦除和烧写等任务的 Flash loader 的工作原理以及它和 C-SPY 的互动机制在此不做里介绍, 可以参阅 EWARM 自带的 FlashLoaderGuide.pdf 前面在设置 General Options 选项时, 已经指定目标 MCU 是 ST STM32F10x, 而 EWARM 已经提供了支持该芯片的默认的 Flash loader 如果用户选用的 MCU 不在 EWARM 的 Device 清单中, 或者采用了外扩的 Flash 存储器, 那就必须自己编写对应的 Flash loader 了 地址 : 上海市黄陂北路 227 号中区广场 2510 室 22

2. 下载应用程序 选择主菜单 Project > Debug, 或工具条上的 Debugger 按钮,C-SPY 将开始把程序下载到指定的目标 地址上 屏幕上将通过进度条显示下载和校验的过程 下载完成后,EWARM 即进入 C-SPY 调试状态, 见 下图 退出调试状态可以用工具条上的 Stop Debugging 按钮 地址 : 上海市黄陂北路 227 号中区广场 2510 室 23

3. 在源代码上调试 C-SPY 具有以下基本的调试功能 : 1 检查源文件 : 双击工作区窗口中的 main.c, 编辑器窗口显示该文件 ; 2 用 Debug > Step Over 命令 ( 或 F10) 进行函数级的步进调试 ; 3 用 Debug > Step Into 命令 ( 或 F11) 跟踪进入函数内部 ; 4 还有一些其他调试命令, 如 Step Out(Shift+F11),Go(F5),Next statement,break,reset, Autostep 等 用户可以用这些命令灵活地执行自己的调试任务 详细用法请参考 EWARM 自带的使用指南 EWARM_UserGuide.pdf 4. 查看变量 C-SPY 允许在源程序上查看变量或表达式, 并在执行程序的过程中跟踪它们的值的变化 查看变量的方法有以下几种, 它们的功能有一定区别, 用户可以根据自己的需要和喜好使用这些工具 更详细的信息请查看 EWARM 自带的使用指南 EWARM_UserGuide.pdf 1 Tooltip Watch 在 Debug 状态下, 把光标对准编辑窗口中的变量名, 在该变量的旁边将显示其数据类型和当前的值 : 地址 : 上海市黄陂北路 227 号中区广场 2510 室 24

2 Auto 窗口 Auto 窗口自动显示当前语句及其周围相关的变量和表达式的值, 单步执行程序时可以观察这些变量如何变化 打开 Auto 窗口的方法是双击变量名, 使该变量名变成高亮度, 然后选择主菜单 View > Auto 命令 下图是一个 Auto 窗口的例子 : 3 Watch 窗口打开 Watch 窗口的方法是选择主菜单 View > Watch 命令 把变量添加到 Watch 窗口的方法是双击选中变量 ( 使其变成高亮度 ), 然后用鼠标将其拖进 Watch 窗口 ; 或者在鼠标右键的弹出菜单中选择 Add to Watch Watch 窗口和 Auto 窗口可以平铺显示也可以按书签形式显示 上图是 Watch 窗口的例子, 它与 Auto 窗口以书签的方式显示 Watch 窗口和 Auto 窗口是最常用的变 量观察窗口, 实际上大多数情况下用户运用这两个窗口已经可以方便地进行变量查看了 4 Locals 窗口 打开 Locals 窗口的方法是选择主菜单 View > Locals 命令 此窗口自动显示局部变量, 即当前活跃函 数内部的自动变量和参数 地址 : 上海市黄陂北路 227 号中区广场 2510 室 25

5 Live Watch 窗口 打开 Live Watch 窗口的方法是选择主菜单 View > Live Watch 命令 Live Watch 窗口用于观察静止 位置上的变量的值在程序执行期间如何连续地变化, 如全局变量 5. 设置和监视断点 IAR C-SPY 具有强大的断点功能 设置断点最简单的方法是将光标定位到某条语句, 然后按鼠标右键, 选择 Toggle Breakpoint 命令 1 设置断点点击要设置断点的语句, 按鼠标右键, 选择 Toggle Breakpoint(Code) 也可以按工具条上的 Toggle Breakpoint 按钮 这时该语句上将出现红色的断点标记 选择主菜单 View > Breakpoints 可以打开 Breakpoints 窗口, 观察断点设置情况 C-SPY 本身不限制断点的数量, 但是可设置的断点总数与 ARM 内核的类型和程序所在的存储器类型都有关 程序在 RAM 中运行时, 可以使用软件断点, 因此断点数量没有限制 ; 程序在 ROM 或 Flash 中运行时, 每个断点都要占用一个 ARM 内核里的硬件断点资源, 因此数量是有限的 地址 : 上海市黄陂北路 227 号中区广场 2510 室 26

2 执行到断点按 F5 键, 或工具条上的 Go 按钮都可以让程序执行到断点 Debug Log 窗口将显示关于断点的信息 3 清除断点单击 Breakpoints 窗口中带勾的方框, 可以允许或禁止对应的断点 用主菜单 Edit > Toggle Breakpoint, 或在源代码上按鼠标右键选择 Toggle Breakpoint, 或在 Breakpoints 窗口的断点上按鼠标右键选择 Delete, 都可以直接删除该断点 6. 在反汇编窗口上调试 通常, 在 C/C++ 程序上调试应该更加方便和直接 但是如果用户希望在反汇编程序上调试,C-SPY 也提供了这种功能, 而且允许方便地在这两种模式下切换 反汇编程序的调试方法如下 : 1 如果必要的话, 按工具条上的 Reset 按钮复位应用程序 2 调试时反汇编窗口通常是打开的 如果没打开可选择主菜单 View > Disassembly 打开反汇编窗口 3 反汇编窗口如上图所示, 汇编代码与 C 语句逐一对应 执行单步命令时, 将执行单条汇编语句 4 如果关闭反汇编窗口, 或将源代码窗口重置为当前活动窗口, 则单步命令重新执行单条 C 语句 地址 : 上海市黄陂北路 227 号中区广场 2510 室 27

7. 监视寄存器 C-SPY 允许用户监视和修改目标处理器内部的寄存器 选择主菜单 View > Register, 打开寄存器窗口 : 上图显示的是 Cortex-M3 内核的寄存器 C-SPY 还允许检查目标处理器内部的所有外设寄存器 可以 从寄存器窗口左上方的下拉菜单中选择需要查看的任何寄存器组 8. 查看存储器 用户可以在存储器窗口中察看和修改所选择的存储器区域 1 选择主菜单 View > Memory, 打开存储器窗口, 见下图 2 在编辑器中打开 main.c, 双击某个变量名并用鼠标将其拖到 Memory 窗口中 C-SPY 将自动确定该变量的地址 ( 在 Memory 窗口中反亮显示 ) 单步执行程序, 同时观察存储器的内容是如何变化的 用户可以在 Memory 窗口里直接修改存储单元 (RAM) 的内容, 只需把光标放在希望修改的地方, 然后输入新值就可以了 地址 : 上海市黄陂北路 227 号中区广场 2510 室 28

9. 观察 Terminal I/O 当用户希望在应用程序中使用标准输入输出功能 (stdin 和 stdout), 但又没有实际的硬件支持时,C-SPY 允许用户使用 Terminal I/O 窗口来模拟 stdin 和 stdout 在本例中没有用到此功能 选择主菜单 View > Terminal I/O, 显示 I/O 操作的输入和输出, 见下图 Output 框中显示标准输出的内容, 标准输入的内容可在 Input 框中输入 10. 执行和暂停程序 1 按 F5 键, 或选择主菜单 Debug > Go, 或按工具条上的 Go 按钮都可以直接运行程序 如果没有设置断点, 程序将一直执行到结束 因为在本例中程序设计成无限循环, 用户在需要停止程序运行时可以选择主菜单 Debug > Break Debug Log 窗口中将显示程序运行状态的信息 2 如果要求复位应用程序, 可选择主菜单 Debug > Reset 或按工具条上的 Reset 按钮 3 如果要退出 C-SPY, 选择 Debug > Stop Debugging, 或按工具条上的 Stop Debugging 按钮 C-SPY 还提供许多其他的调试功能, 如宏和中断模拟等, 可参考 EWARM 自带的使用指南 EWARM_UserGuide.pdf 地址 : 上海市黄陂北路 227 号中区广场 2510 室 29

更多参考信息 1. 技术文档 EWARM 的基本使用方法 ( 如创建项目, 配置选项, 文本编辑, 编译和调试等 ): EWARM_UserGuide.pdf -> Part 2. Tutorials EWARM_UserGuide.pdf -> Part 3. Project management and building C-SPY 调试技巧 : EWARM_UserGuide.pdf -> Part 4. Debugging IDE 中的各种设置选项 ( 如各种窗口, 菜单, 对话框等 ): EWARM_UserGuide.pdf -> Part 6. C-SPY hardware debugger systems EWARM_UserGuide.pdf -> Part 7. Reference information 一般的嵌入式应用程序开发技术 : EWARM_DevelopmentGuide.pdf -> Part 1. Using the IAR build tools 代码和数据在存储器中的布置, 链接器配置文件 : EWARM_DevelopmentGuide.pdf -> Part 1. -> Linking using ILINK EWARM_DevelopmentGuide.pdf -> Part 1. -> Linking your application EWARM_DevelopmentGuide.pdf -> Part 2. -> The linker configuration file EWARM_DevelopmentGuide.pdf -> Part 2. -> Section reference IAR 编译器对标准 C/C++ 语言的扩展 : EWARM_DevelopmentGuide.pdf -> Part 2. -> Compiler extensions EWARM_DevelopmentGuide.pdf -> Part 2. -> Extended keywords EWARM_DevelopmentGuide.pdf -> Part 2. -> Pragma directives EWARM_DevelopmentGuide.pdf -> Part 2. -> Intrinsic functions 2. 相关的产品链接 IAR Embedded Workbench for ARM( 集成的编译调试环境 ): http://www.iar.com/ewarm IAR PowerPac for ARM(RTOS, 嵌入式文件系统,USB 设备协议栈,TCP/IP 协议栈 ): http://www.iar.com/pparm IAR visualstate( 基于有限状态机的嵌入式软件建模和设计工具 ): http://www.iar.com/vs 地址 : 上海市黄陂北路 227 号中区广场 2510 室 30