使用 Trace32 对 FLASH 编程
from: http://www.ibm.com/developerworks/cn/linux/l-trace32/
随着软硬件复杂性的增加,在嵌入式系统开发中,调试器对项目的开发进度、质量起着越来越重要的作用。在众多的调试器中,Lauterbach 公司的 Trace32 凭借其强大的功能,出色的性能,成为目前嵌入式系统开发中,尤其是高端系统中普遍采用的调试工具。
Trace32 除了具有对代码设置断点、跟踪调试等常规的功能以外,还能够控制对目标系统的 FLASH 进行编程。本文首先对比了 Trace32 FLASH 编程的两种方式:"Emulator controlled flash programming" 和 "Target controlled flash programming",指出"Target controlled flash programming"方式的优点;然后介绍了与 FLASH 编程相关的 Trace32 脚本命令,以及 Trace32 脚本命令与 FLASH 编程软件之间的通信机制;最后,给出了 "Target controlled flash programming" 方式的控制流程。
注:本文中使用的"编程"一词,除了具有对 FLASH 烧写的含义外,还包括擦除、校验等其它对 FLASH 的操作。
一、FLASH 编程的两种方式
对目标系统中的 FLASH 有两种方式进行编程,分别是 "Emulator controlled flash programming" 和 "Target controlled flash programming"。
在 "Emulator controlled flash programming" 方式下,所有对 FLASH 编程的操作都是由 Emulator 完成的,不使用目标系统的资源。Trace32 软件支持市面上几乎所有的 FLASH芯片(可以访问 http://www.lauterbach.com/ylist.html 查询 Trace32 支持的 FLASH 型号),只要在脚本命令 FLASH.Create 中指明目标 FLASH 的型号,地址范围以及总线的配置,用户就可以使用脚本命令直接将数据烧写到 FLASH,不需要编写任何对 FLASH 操作的代码。
在 "Target controlled flash programming"方式下,对 FLASH 的编程控制是由运行在目标系统上的 FLASH 编程软件完成的,而这个软件必须由用户自行开发。此时,Trace32通过使用脚本对目标系统内存地址空间的访问,向 FLASH 编程软件传送控制参数和数据。
由于直接在目标系统的处理器上运行,采用 "Target controlled flash programming" 方式可以获得比 "Emulator controlled flash programming"方式快得多的编程速度。这对于烧写大的文件,以及生产线等场合来说十分重要。另外,只要编写相应的 FLASH 编程软件,用户选择的任何 FLASH 都能够被支持。
因此,对于 FLASH 编程的内容较少,或者对编程的时间要求不高的情况下,可以使用"Emulator controlled flash programming" 方式;但是,对于需要编程较大的文件,而且对速度要求较高的情况下,"Target controlled flash programming" 方式是唯一的选择。本文中只讨论 "Target controlled flash programming" 方式。
![]() ![]() |
![]()
|
二、Trace32 脚本
在 Trace32 的界面中,可以使用菜单,鼠标完成操作,也可以完全使用命令操作。事实上,Trace32 内嵌了强大的命令和脚本处理功能。使用 Trace32 的命令不仅可以完成所有的功能,而且可以获得比菜单方式更大的操纵性和灵活性。脚本以 .CMM 为后缀。
下面就介绍 Trace32 中与 FLASH 操作相关的命令,见下表:
这里列出后面需要使用到命令的详细格式,以便参考。
1. FLASH.Create
格式:
FLASH.Create <unit_number> <physical_range> <sector_size> <family_code> |
例如,定义Am29LV640(16 bit mode, 16 bit bus, 128 sectors, 64Kbyte/sector)
FLASH.RESet
FLASH.Create 1. 0x0 -- 0x7FFFFF 0x10000 AM29LV100 Word
对于采用 "Target controlled flash programming" 方式,familiy_code 必须选择为TARGET。与 FLASH 编程软件的连接由 FLASH.Target 完成。
2. FLASH.Erase
格式:
FLASH.Erase <unit> | <address_range> | ALL |
例如:
FLASH.Erase 0x0 -- 0x1FFFF
FLASH.Erase ALL
3. FLASH.Program
格式:
FLASH.Program [<unit> | <address_range> | ALL | OFF ] |
一旦激活了编程模式,任何对 FLASH 地址空间的写访问操作将会导致对 FLASH 的编程。例如:
FLASH.Program ALL |
4. FLASH.TARGET
格式:
FLASH.TARGET <code_address> <data_address> [<buffer_size>] [<file>] <code_address> |
运行在目标系统上的 FLASH 编程软件被下载到的 RAM 起始地址,占用的大小为FLASH 编程软件本身的大小,另外再加上 32 字节。
- <data_address>
参数块的起始地址,大小为 32 字节(参数块)+ <buffer_size> + 256 字节(stack)。 - <buffer_size>
从 Trace32 软件一次传递给 FLASH 编程软件的数据字节数。建议的缓冲大小为 4KB。 - <FLASH_algorithm>
二进制形式的 FLASH 编程软件。
使用上面这些命令进行 FLASH 编程的一般步骤是:
1) 首先使用 FLASH.Create 定义目标 FLASH 的地址空间,类型,及总线配置。
2) 对于"Target controlled flash programming"方式,必须向目标系统加载 FLASH 编程软件。FLASH.Target 命令把 FLASH 编程软件的起始地址,参数块的起始地址,以及缓冲区大小等信息通知 Trace32。FLASH.Program 和 FLASH.Erase 命令就会调用确定的 FLASH 编程软件,并传递合适的参数。
3) FLASH.Program 启动编程模式后,如果有数据传输命令执行(如 Data.Set 或者Data.LOAD),Trace32 会检查数据传输的地址是否落在 1)中定义的 FLASH 地址空间内。如果是,Trace32 会根据缓冲区的大小,把部分数据填充到数据缓冲区中,初始化参数块,设置目标系统的 PC 为 FLASH 编程软件的起始地址,并开始执行。执行结束后,控制权回到 Trace32。Trace32 检查返回的信息(也在参数块中),如果正常,继续处理剩余的数据。
下面通过一个例子来说明:
目标系统的配置了的 FLASH 为 Intel Strata FLASH 28F320J3A(16 bit mode, word access),CPU 为 ARM core。
目标系统的内存影像(memory map)为:
- FLASH: 0x0 - 0x3FFFFF
- RAM 起始地址:0xA0000000
相应的 Trace32 脚本为:
FLASH.RESet |
首先,通过 FLASH.Create 创建一个 FLASH 区域1,地址范围为 0x0 到 0x3FFFFF,Sector 的大小为 0x20000,对此 FLASH 区域的编程软件由 TARGET 指定。WORD 参数则指明目标系统 CPU 访问 FLASH 的数据宽度(还可以是 BYTE, LONG, QUAD)。
FLASH.Target 指定对 FLASH 区域编程软件的位置在 0xA0000000,参数块在0xA0001000。参数块后面一般紧跟着数据缓冲区,缓冲区的大小为 0x1000。编程软件是~~/demo/arm/FLASH/word/i28f200j3.bin。
接着擦除 FLASH 区域 1,然后启动 FLASH 编程模式。
Data.load.elf 命令将 my_application.elf 装载到 FLASH 区域,触发了 FLASH 编程软件,从而被写入到指定的 FLASH 区域中。
最后,关闭 FLASH 编程模式。
![]() ![]() |
![]()
|
三、Trace32 命令与 FLASH 编程软件之间的通信机制
从上面的例子可知,在 Trace32 软件与 FLASH 操作程序之间有一个数据交换区-参数块,用来传递控制命令和数据,并返回操作结果。参数块的位置是由FLASH.Target命令中的data_address指定的。紧跟着参数块是缓冲区。
参数块的定义如下:
操作结束后,参数块存放操作的返回结果:
参数块以及紧跟的缓冲区的相应 C 语言定义如下:
struct { |
![]() ![]() |
![]()
|
四、Target controlled flash programming 流程
开发基于"Target controlled flash programming" 方式的一般流程为:
1. 编写在目标系统上运行的 FLASH 编程软件
2. 将 FLASH 编程软件装载到目标系统的 RAM 中(使用 Data.LOAD 命令)
3. 通过命令 FLASH.Create 和 FLASH.Target 命令将 Trace32 连接到目标系统上的FLASH 编程软件
4. 使用命令 FLASH.Program,FLASH.Erase 等命令控制对目标系统上 FLASH 的操作,这些命令会调用 FLASH 编程软件中相应的功能,并传递合适的参数
实例(AM29F800)
目标系统上有两块型号为 AM29F800 的 FLASH,每块 FLASH 的数据宽度为 16bit,两块合并成 32bit 宽度。每块 FLASH 有 1MB 的大小,它们的起始地址为 0x200000。
目标系统上还配置了 SRAM,大小为 8kB,地址范围是 0H 到 1FFFH。
为目标系统开发的 FLASH 编程软件为 FLASHprog.bin(大小为 450H 字节,二进制格式)。参数块被安排在 SRAM 的地址 0H 开始。
需要烧入目标系统 FLASH 的应用程序为 application.elf(ELF 格式,起始位置为0x200000)。这里需要说明的是,在联接产生 application.elf 时,必须通过联接脚本 - SCL 文件指定其起始位置为 0x200000。这样"Data.load.elf application.elf "命令就会将 application.elf 装载到从 0x200000 开始的地址空间。
对于这样的应用,需要编写一个控制脚本(CMM 文件),同时还要开发一个 FLASH的编程软件。下面首先介绍控制脚本的内容,然后给出了 FLASH 编程软件的流程。
控制脚本
控制脚本的内容如下:
1) 进行必要的目标系统设置,特别是片选配置,使得 SRAM 和 FLASH 都落在安排的地址空间中
2) 将 FLASH 编程软件 FLASHprog.bin 装载到 SRAM 中地址 0x1200 处: Data.LOAD.B FLASHprog.bin 1200
3) 在 FLSAH 编程软件的结束位置设置断点(break.set swbp),这样在执行结束后,控制可以交回给 Trace32
4) 通知 Trace32 关于 FLASH 的配置,FLASH 编程软件的位置,参数块以及数据缓冲区的位置
FLASH.Create 200000--3fffff TARGET LONG
FLASH.TARGET 1200 0 1000
此时 SRAM 的内存安排为:
5) 擦除整个 FLASH
FLASH.Erase ALL
6) 编程应用程序 application.elf
FLASH.Program ALL
Data.LOAD.elf application.elf
FLASH.Program OFF
执行 FLASH.Erase ALL 命令时,调用 FLASH 编程软件的擦除功能,相应的参数块填充为:
此时,数据缓冲区没有内容。
擦除结束后,遇到设置的断点,控制权交回给 Trace32,参数表中为返回的状态:
执行 Data.LOAD.bin application.bin 时,调用 FLASH 编程软件的编程功能,相应的参数块填充为:
此时缓冲区中填充了需要编程的数据。
编程结束后,控制权交回给 Trace32,参数表中为返回的状态:
如果没有错误发生,以上的编程过程会一直下去,直到 application.bin 中的数据全部传输完毕。
FLASH 编程软件
FLASH 编程软件的流程为:
1) 定义参数块的数据结构:
struct FlashParameter flash_param;
FlashParameter 的定义见上文。
2) 定义每个功能对应的功能号:
#define FLASH_PROGRAM 0x00000001 |
3) 主控制流程:
switch ( flash_param.status ) |
4) SCL 文件
RAM 0x200000
{
CODE 0x200000
{
main.o (+RO)
* (+RO)
}
APP_RAM +0x0
{
* (+RW, +ZI)
}
}
相关文章:

Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明
导航目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:没有了 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置 前言V1.x版本终于到来了。本次版本的开发从3月份开始,花了一个月的时间完成了概念版本设…

Java项目:健身管理系统(Java+ssm+springboot)
源码获取:博客首页 "资源" 里下载! 主要技术:springmvc、 springboot 、mybatis、mysql 、jQuery、layui、css、jsp shiro权限控制 主要功能截图如下: 用户登录、首页主要功能有:会员信息管理、会员到期续费…

计算几何算法概览
为什么80%的码农都做不了架构师?>>> 计算几何算法概览一、引言 计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人们直观看来很容易的问题却需要拿出一套并不简单的通用解决方案,比如几何问题。作为计算…

诚意租房网blog2
(一)数据库设计部分: 创建数据库hourse: 1:关注表 CREATE TABLE guanzhu ( id int(11) NOT NULL AUTO_INCREMENT, uid int(11) DEFAULT NULL, hid int(11) DEFAULT NULL, time datetime DEFAULT NULL, PRIMARY KEY (id) ) ENGINEI…

基于S3C4510B的一个简单BSP的开发报告
系统环境 (一) 硬件环境 CPU:S3C4510B SDRAM:W981216DH 16M FLASH:MX29LV160AB 2M (二) 软件环境 tornado2.01 for arm(AKA的FTP上有tornado2.2需要的可以自己去下载:&#…

Java项目:房屋租赁管理系统(java+SSM+Layui+Maven+Mysql+Jsp)
源码获取:博客首页 "资源" 里下载! 一、项目简述 功能包括: 房屋租赁管理系统是一款方便快捷,易操作的租房和各种物业收费的管理系统,该系统官网包含着用户和管理员分类登录,减少了为使用管理员…

sdtz技术组成
发送短信数据库表到第二天就删除前一天的的内容重新建表是用触发器功能实现的 回款、发标、发短信一些核心功能是用windows服务运行在服务器上自动运行的 sql管理中的维护计划就能设置自动备份数据库转载于:https://www.cnblogs.com/zheng510ke/p/4562812.html

13个 ASP.NET MVC 的扩展
ASP.NET MVC设计的主要原则之一是可扩展性。处理管线(processing pipeline)上的所有(或大多数)东西都是可替换的。因此,如果您不喜欢ASP.NET MVC所使用的约定(或缺乏某些约定),您可以…

javascript实例
数组排序 ①冒泡排序 思路: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤ÿ…

Ubuntu10.04安装Flash插件
1. 从Adobe下载Flash安装程序,并且解压。 tar -xzvf install_flash_player_10_linux.tar.gz 2. 把解压出来的“libflashplayer.so” 复制到 /usr/lib/mozilla/plugins 目录下。 sudo cp libflashplayer.so /usr/lib/mozilla/plugins 3. 执行以下命令&#x…

Java项目:健身俱乐部管理系统(java+SSM+Mysql+Jsp)
源码获取:博客首页 "资源" 里下载! 项目介绍: 基于jspmysqlSpringmybatis的SSM健身房管理系统 运行环境: jdk 1.8 IDE环境: Eclipse,Myeclipse,IDEA都可以 tomcat环境: Tomcat 7.x,8.x,9.x版本均可…

通过代理进行页面传值
A 页面跳转到 B页面,在关闭B页面的时候想将B页面的某些内容回传给A页面 在B页面写代理的相关方法 protocol 控制器的名称 Delegate <NSObject> optional -(void) xxxxxx:(控制器 *) control end interface 控制器 : UIViewController property (weak,nonatom…

Linux系统下如何安装软件包
现在一般是使用 RPM ,YUM 和 APT 来管理软件包。软件包常用的也就是,查找软件包,安装,卸载,升级。这几个功能。RPM 比较经典,但是也比较麻烦,尤其是在软件依赖关系上面,有的时…

自己设计大学排名-数据库实践
今天我们来学习以下有关于数据提取以及数据库的一些知识, 我们知道其实数据库是一个非常神奇的存在,它是是按照 数据结构来组织、 存储和管理数据的仓库 我们可以使用它对数据进行储存和管理! 下面是有关于sqlite3的学习,SQLite3 …

Windows 和 Linux 应用程序从上到下调用层次比较
刚毕业的时候,做了将近一年的Window下的程序开发,主要用MFC,那是也不明白程序在操作系统角度从上到下的整个调用层次。遇到调用库函数,不明白,就查MSDN,每个月1500行代码左右,那时以为这就是软件…

Java项目:药品管理系统(java+swing+Gui+mysql)
源码获取:博客首页 "资源" 里下载! 功能介绍:用户管理、药品库存管理、进销管理、营销管理、药品购入、药品售出、药市信息 系统主页: SuppressWarnings("serial") public class SystemMainView extends JFr…

WEBSHELL跳板REDUH使用说明
原文链接: http://www.fendou.info/network/webshell-proxy-reduh.html reDuh是可以把内网服务器的端口通过http或https隧道转发到本机,形成一个TCP连通回路,用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部端口的工具。 reDuh和LCX类似&…

站立会议(三)
一、会议时间:2014年4月13日 二、会议目的:统计项目进度以及每个人的进度、计划以及问题 三、会议内容: 党云龙: 今天内容 查阅资料,上网搜索,完成API调用; 遇到问题 还是在实现的时候无法阻止…

python celery
celery 一般用于做异步 和定时任务 不过听网上说 celery 坑还是蛮多的,特别定时任务,我们一般用来做定时任务,还有数据导入导出。celery 不支持 redis cluster 集群模式uWSGI 自带了一个简单的 Spooler 可以处理大部分异步任务和周期运行的任…

c语言实现memcpy
今天到I 公司去面试,面试方式比较特殊,没有笔试,就是2 个面试官,一人一句轮番发问,涉及面很广,涉及到操作系统(MMU 、page out 、process/thread 、semaphore 、interrupt), OOP( 多态、design pattern) 、…

Java项目:图书管理系统(java+swing+Gui+Mysql)
源码获取:博客首页 "资源" 里下载! 功能介绍:借阅列表、图书类别管理、图书馆里、用户管理、借阅管理、关于我们 登录服务类: WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet …

十五天精通WCF——第三天 client如何知道server提供的功能清单
通常我们去大保健的时候,都会找姑娘问一下这里能提供什么服务,什么价格,这时候可能姑娘会跟你口述一些服务或者提供一份服务清单,这样的话大 家就可以做到童嫂无欺,这样一份活生生的例子,在wcf中同样是一个…

MySQL Cluster 日常维护
在前面几篇文章已经详细介绍了MySQL Cluster的搭建,配置讲解。而且相信大家都掌握了基本用法。现在我们来看看Cluster的日常维护。熟悉日常维护,将有助于工作中更好的管理和使用Cluster。 一. 数据备份 相信大家都熟悉mysql的日常备份工具,比…

20165219王彦博《基于Cortex-M4的虚拟机制作与测试》课程设计个人报告
20165219王彦博《基于Cortex-M4的虚拟机制作与测试》课程设计个人报告 一、个人贡献 参与课设题目讨论及完成全过程; 资料收集; 负责环境搭建,代码运行下载; 撰写小组结题报告。 二、设计中遇到的问题及解决方法 1 实验六以太网服…

extern数组与extern指针
数组名代表了存放该数组的那块内存,它是这块内存的首地址。这就说明了数组名 是一个地址,而且,还是一个不可修改的常量,完整地说,就是一个地址常量。数组名 跟枚举常量一样,都属于符号常量。数组名 这个符号…

Java项目:医院管理系统(java+javaweb+jdbc+Mysql+lw)
源码获取:博客首页 "资源" 里下载! 功能介绍: 登录、注册、用户/管理员(角色)、用户信息管理、科系信息管理、查看所有科系、新增科系信息、删除指定科系、修改科系信息、病房信息管理、病人信息管理、医生类型管理、病人手术管理…

Mongodb地理空间索引
1、索引: 建立索引既耗时也费力,还需要消耗很多资源。使用{"bakckground":true}选项可以使这个过程在后台完成,同时正常处理请求。如果不包括background 这个选项,数据库会阻塞建立索引期间的所有请求。阻塞的做法会让索…

Juniper的路由器、防火墙、交换机如何恢复出厂配置
Juniper的路由器、防火墙、交换机如何恢复出厂配置有些时候,在正常的业务使用中,逐条删除配置的内容很繁琐,我们可以使用恢复出厂配置,清空设备中的配置;还有的时候,由于设备配置异常,可以使用恢…

【转载】标准输入输出、错误输出、重定向标准输出
【转载】标准输入输出、错误输出、重定向标准输出 原文:标准输入输出、错误输出、重定向标准输出 再来看看 >& 操作符: 重定向操作符描述 > 将命令输出写入到文件或设备(如打印机),而不是命令提示符窗口或…

(Interrupt Latency) 中断延迟
中断延迟 (Interrupt Latency) 中断延迟 是指从硬件中断发生到开始执行中断处理程序第一条指令之间的这段时间。 也就是: 计算机接收到中断信号到操作系统作出响应,并完成换到转入中断服务程序的时间。 不严格地,也可以表述为:…