ARM Coresight 及 DS-5 介绍 5 - ARM Cortex-M DS-5 加载 ELF 文件运行

news2024/11/16 6:41:32

文章目录

      • 1.1.1 DS-5 工程创建
      • 1.1.2 DS-5 加载 ELF 脚本创建
      • 1.1.3 DS-5 脚本读写 Memory
      • 1.1.4 DS-5 扫描脚本

1.1.1 DS-5 工程创建

在使用ARM DS-5 连接 board(或者PFGA)之前首先需要能够扫描到相应的硬件信息,比如对应的cpu的相关信息:coresight 相关组件信息,Cache信息等。

创建好工程项目后按照下图黄线的指示进行扫描操作(通常是完成扫描后才会去执行 “build platform”):
在这里插入图片描述

如果更换平台之后,最好先进行 clean platfom 操作,然后再重新 build platform 操作。

在扫描完成后在DS-5的console中会打印相关的信息,扫描完成后的操作是进行连接操作(见图 1-1)。

1.1.2 DS-5 加载 ELF 脚本创建

通常我们会使用uart或者SPI来烧写镜像到flash,然后再从flash启动,这个过程在实际的debug场景中比较耗时,尤其是当串行时钟比较低的时候。所以我们可以直接使用DS-5通过JTAG接口来烧写镜像到对应的 memory 中,然后再配置好 PC 指针,直接跳转过去既可以启动对应的固件。
在这里插入图片描述

图 1-1

上图 1-1 中对应的脚本代码如下:

# Filename: load_rtos_schan.py
 
import sys
import os
import time
from arm_ds.debugger_v1 import Debugger
from arm_ds.debugger_v1 import DebugException
 
debugger = Debugger()
ec = debugger.getCurrentExecutionContext()
#value = ec.getRegisterService().getValue('PC')
#print("The PC is %s" %value)

 # 下面是对对板子做reset 操作
os.system("D:\\demo\\USBRelay\\CommandApp_USBRelay.exe QAAMZ open 1")
os.system   ("D:\\demo\\USBRelay\\CommandApp_USBRelay.exe QAAMZ close 1")
time.sleep(1)
print ec.executeDSCommand('stop')
 
print ec.executeDSCommand("load X:\\demo_soc\\rtos\\rt-thread\\rt-thread\\bsp\\\\demo_soc\\demo_soc_fpga\\rtthread.elf")
print ec.executeDSCommand('run')

创建 rtos 加载脚本时需要注意以下几点:
1)需要先固件启动汇编部分的 data 段的 copy 部分 注释掉,因为 DS-5 去加载 elf 文件时会自动根据 elf 符号表data 段加载到对应的地址,例如我们当前是将 data 段放到 DTCM中的,再加载 elf 时 DS-5 会将 data 段数据 load 到对应的 DTCM 地址,所以再编译的时候就需要将启动汇编阶段的 data 段的 copy操作去掉。

2)为了保证硬件内容的 “干净”, 在执行 DS-5 脚本的时候会先进行SoC reset 操作,reset之后系统会自动从bootrom重启,DS-5接入,然后执行 stop 命令,再 load elf(会自动解析 entry point) ,然后再执行 run 命令即可。

bootrom中的代码主要时做循环检测外部接入信号

1.1.3 DS-5 脚本读写 Memory

以写读 0x48000000 地址为例,如下代码:

# Filename: load_rtos_schan.py
  
import sys
import os
import time
from arm_ds.debugger_v1 import Debugger
from arm_ds.debugger_v1 import DebugException
  
debugger = Debugger()
ec = debugger.getCurrentExecutionContext()
#value = ec.getRegisterService().getValue('PC')
#print("The PC is %s" %value)
  
os.system("D:\\demo\\USBRelay\\CommandApp_USBRelay.exe QAAMZ open 1")
os.system   ("D:\\demo\\USBRelay\\CommandApp_USBRelay.exe QAAMZ close 1")
time.sleep(1)
print ec.executeDSCommand('stop')
#ec.getExecutionService().stop()
 
  
print ec.executeDSCommand("load X:\\demo_soc\\rtos\\rt-thread\\rt-thread\\bsp\\demo\\demo_soc\\demo_soc_fpga\\rtthread.elf")
print ec.executeDSCommand('run')
#ec.getExecutionService().resetTarget()
 
print "######## read and write memory test #######"
#base_adr = 0x56020000
base_adr = 0x48000000
 
for i in range(0, 5):
    print('i=%d, addr=0x%x, default value:0x%x'  %(i, base_adr + i*4, ec.getMemoryService().readMemory32(base_adr + i*4, {})))
     
    if base_adr == 0x56020000: #ipcm source register
        value = 0x1
    else:
        value = i * 4
    ec.getMemoryService().writeMemory32(base_adr + i*4, value, {'width': 32, 'verify': 0})
    print('i=%d, addr=0x%x, write value:0x%x'  %(i, base_adr + i*4, ec.getMemoryService().readMemory32(base_adr + i*4, {})))
    #print ec.getMemoryService().readMemory32(base_adr + i*4, {})
    #ec.getExecutionService().resume()

对于 write only 外设寄存器地址需要加上 flag “verify=0” ,命令行的话可以使用 “memory set <verify=0>:0x46020004 32 1”

TIPS: "alt+/ " 调出 commands 栏 help命令说明
在这里插入图片描述

1.1.4 DS-5 扫描脚本

通常芯片回来后软件同学需要做的第一件事就是完成寄存器扫描,保证系统及各个IP的寄存器可以正常写读,通常会按照各个Subsystem进行扫描,一般情况下每个 IP 都少扫描1-2个寄存器,按照先写再读的方式进行扫描。
扫描脚本首先需要保证以下几点:

  • 各个模块供电正常;
  • 各个模块 clk 正常;
  • 在扫描过程中如果出现有的寄存器有问题可以先跳过。

下面给出了一个简单的DEMO, 该demo 使用的是Python 脚本完成的。

# Filename: DS5_Reg_Scan.py
    
import sys
import os
import time
from arm_ds.debugger_v1 import Debugger
from arm_ds.debugger_v1 import DebugException
    
debugger = Debugger()
ec = debugger.getCurrentExecutionContext()
#value = ec.getRegisterService().getValue('PC')
#print("The PC is %s" %value)
# TO DO: reset SoC     
time.sleep(1) # wait bootrom start
ec.executeDSCommand('stop')
  
def read32(addr):
    return ec.getMemoryService().readMemory32(addr)
  
def write32(addr, val):
     return ec.getMemoryService().writeMemory32(addr, val, {'width': 32, 'verify': 0})
  
demo_aon_subsystem = [
#       reg_adr         write_val       ip name
        0x66004000,     0x55,           "hrtimer0",
        0x66004014,     0x55,           "hrtimer1",
        0x66004028,     0x55,           "hrtimer2",
        ]
peri_subsys = [
#       reg_adr          write_val      ip name
        0x6c002004,      0xdf,          "uart0",
        0x60011010,      0x1,           "uar1",
        0x60009004,      0x11,          "spi1",
        0x60008000,      0x55,          "spi2",
        0x60008014,      0x55,          "spi3",
        0x60008028,      0x55,          "spi4",
        ]
        
def demo_subsys_scan(subsys, subsys_name, mode):
    ret = 0xdeadbeef
    list_len = len(subsys) / 3
    print("Total Registers:%d in %s" %(list_len, subsys_name))
     
    for i in range(0, int(list_len)):
        addr = subsys[i*3]
        val = subsys[i*3 + 1]
        name = subsys[i*3 + 2]
         
        try:
            write32(addr, val)
            if mode == 0: # write-only registers no check return value
                ret = read32(addr)
                if ret != val:
                    print("DS-5 Scan %s reg:0x%x failed!!!, read:0x%x" %(name, addr, ret))
                    if subsys_name == "demo_peri_subsystem" or subsys_name == "demo_aon_subsystem":
                        continue
                    else:
                        return -1
                # else if mode == 1:
                 
        except DebugException, e:
            print("Excetpion: DS-5 Scan %s reg:0x%x failed!!!, read:0x%x" %(name, addr, ret))
            if subsys_name == "demo_peri_subsystem" or subsys_name == "demo_aon_subsystem":
                continue
            else:
                return -1
  
    return 0
 
# demo_aon_subsystem scan
ret = demo_subsys_scan(demo_aon_subsystem, "demo_aon_subsystem", 0)
if ret == 0:
    print("#######  demo_aon_subsystem scan test finished ######\n")
else:
    print("demo_aon_subsystem scan failed !!!\n")
  
# peri_subsys scan
ret = demo_subsys_scan(peri_subsys, "demo_peri_subsystem", 0)
if ret == 0:
    print("#######  peri_subsys scan test finished ######\n")
else:
    print("demo_peri_subsystem scan failed !!!\n")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/446756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Zblog搭建博客网站】windows环境搭建属于自己的博客并发布上线 - cpolar内网穿透

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转载自远程内网穿透的文章&#xff1a;【Zblog建站】搭建属于自己的博客网站&#…

【C++】初始化列表,explicit 关键字,静态成员

初始化列表 构造函数内可以对于成员的赋值&#xff0c;故不能称为是初始化&#xff0c;初始化只能初始化依次&#xff0c;C中类对象的初始化可由初始化列表完成 内置类型成员可以通过设置缺省值实现初始化&#xff0c;但对于const修饰的成员、引用成员、没有默认构造函数的自…

hive解析json

目录 一、背景 二、hive 解析 json 数据函数 1、get_json_object 2、json_tuple 3、使用嵌套子查询(exploderegexp_replacesplitjson_tuple)解析json数组 4、使用 lateral view 解析json数组 一、背景 我们进行ETL(Extract-Transfer-Load) 过程中,经常会遇到从不同数据…

编码拓展:链接库

一.认识链接库 1.1库 计算机中&#xff0c;有些文件专门用于存储可以重复使用的代码块&#xff0c;例如功能实用的函数或者类&#xff0c;我们通常将它们称为库文件&#xff0c;简称“库”&#xff08;Library&#xff09;。 以 C 语言为例&#xff0c;如下为大家展示的就是…

JUC高级十-并发加锁原理之AbstractQueuedSynchronizer(AQS)

1. 前置知识 公平锁和非公平锁可重入锁自旋锁LockSupport数据结构之双向链表设计模式之模板设计模式 AQS重要性 JAVA ------>JVM AQS ------>AQS 2. AQS入门级别理论知识 2.1 是什么? 2.1.1 字面意思 Abstract Queued Synchronizer----抽象的队列同步器 源码位置: …

【Microsoft Edge】如何彻底卸载 Edge

文章目录 一、问题描述二、卸载 Edge2.1 卸载正式版 Edge2.2 卸载非正式版 Edge2.2.1 卸载通用的 WebView22.2.2 卸载 Canary 版 Edge2.2.3 卸载其他版本2.3 卸载 Edge Update 2.4 卸载 Edge 的 Appx 额外安装残留2.5 删除日志文件2.6 我就是想全把 Edge 都删了 一、问题描述 …

预测模型的局部评价?

预测模型的局部评价 为什么要进行局部评价&#xff1f; 首先是临床决策曲线分析通常会给预测模型的使用规定一个阈值范围&#xff0c;相应地预测模型的评价也应该局限在这个范围之内才是合理的&#xff1b; 其次&#xff0c;全局性地评价往往不够敏感&#xff0c;即好的模型和坏…

本地搭建属于自己的ChatGPT:基于Python+ChatGLM-6b+Streamlit+QDrant+DuckDuckGo

本地部署chatglm及缓解时效性问题的思路&#xff1a; 模型使用chatglm-6b 4bit&#xff0c;推理使用hugging face&#xff0c;前端应用使用streamlit或者gradio。 微调对显存要求较高&#xff0c;还没试验。可以结合LoRA进行微调。 缓解时效性问题&#xff1a;通过本地数据库…

C语言实现银行家算法

一.银行家算法 1.由来 银行家算法最初是由荷兰计算机科学家艾兹赫尔迪杰斯特拉&#xff08;Edsger W. Dijkstra&#xff09;于1965年提出的。当时他正致力于解决多道程序设计中产生的死锁问题。在多道程序设计中&#xff0c;由于不同进程之间共享有限的系统资源&#xff0c;如…

【JavaEE初阶】多线程(一)认识线程 线程的创建 Thread的用法

摄影分享&#xff01; 文章目录 认识线程&#xff08;Thread&#xff09;概念执行多线程编程创建线程的写法1.继承Thread&#xff0c;重写run2.实现Runnable接口3.使用匿名内部类&#xff0c;继承Thread4.使用匿名内部类&#xff0c;实现Runable5.使用Lambda表达式 Thread用法…

C语言模拟银行排队叫号(链队)

一.队列 队列是一种具有先进先出&#xff08;FIFO&#xff09;特性的线性数据结构&#xff0c;它只允许在队列的两端进行插入和删除操作。队列的一端称为队尾&#xff08;rear&#xff09;&#xff0c;另一端称为队头&#xff08;front&#xff09;。新元素总是插入在队列的队…

怎么把m4a转换成mp3,分享几个方法给大家!

录音文件中经常出现m4a后缀的音频格式&#xff0c;但通常只能在特定的音频播放器中播放。如果你想把m4a转换成mp3&#xff0c;下面是四种简单易行的方法&#xff0c;适用于Windows 10操作系统。 方法一&#xff1a;使用记灵在线工具转换m4a成mp3 工具地址&#xff1a;记灵在线…

elsticsearch入门

查看所有索引&#xff08;表&#xff09; 向索引&#xff08;表&#xff09;中添加数据&#xff1a; 自定义id添加数据&#xff1a; 自定义id添加数据&#xff1a;方式二 查询数据&#xff1a; 查询索引&#xff08;表&#xff09;中全部数据&#xff1a; 全量修改单条数据&…

File类与IO流

1. java.io.File类的使用 1.1 概述 File类及本章下的各种流&#xff0c;都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录&#xff08;俗称文件夹&#xff09;&#xff0c;与平台无关。&#xff08;体会万事万物皆对象&#xff09;File 能新…

【Leetcode -剑指Offer 22.链表中倒数第k个结点 -203.移除链表元素】

Leetcode Leetcode -剑指Offer 22.链表中倒数第k个结点Leetcode -203.移除链表元素 Leetcode -剑指Offer 22.链表中倒数第k个结点 题目&#xff1a;输入一个链表&#xff0c;输出该链表中倒数第k个节点。为了符合大多数人的习惯&#xff0c;本题从1开始计数&#xff0c;即链表…

数据结构(三)—— 哈希表

文章目录 一、哈希表积累1.1 哈希map1.2 哈希set 二、哈希表基础三、题3.1 242 有效的字母异位词3.2 349 两个数组的交集3.3 202 快乐数3.4 1 两数之和3.5 54 四数相加II 一、哈希表积累 什么时候想到用哈希法&#xff1a;当要需要查询一个元素是否出现过、判断一个元素是否出…

awvs安装批量扫描

文章目录 安装批量扫描 安装 1.2.AWVS下载   该工具可在官方网站下载&#xff0c;但免费下载的是14天试用版本。   官网下载&#xff1a;AWVS   百度云下载&#xff1a;百度云下载https://pan.baidu.com/s/1UO7GzL0CMemJ_TMQnHNOuA?pwdg1bm 提取码&#xff1a;g1bm 批…

浏览器状态同步和路由-前端路由和服务端路由原理

目录 前端路由和History API 浏览文境&#xff08;Browser Context&#xff09; 会话历史&#xff08;Session History&#xff09; History API history.go()切换当前会话&#xff0c;并不改变会话栈 history.back() history.go(-1) & history.forward() history.…

5.4、服务器编程基本框架和两种高效的事件处理模式

5.4、服务器编程基本框架和两种高效的事件处理模式 1.服务器编程基本框架2.两种高效的事件处理模式①Reactor模式②Proactor模式③模拟Proactor模式 1.服务器编程基本框架 模块功能I/O 处理单元处理客户连接&#xff0c;读写网络数据逻辑单元业务进程或线程网络存储单元数据库、…

18.网络爬虫—Scrapy实战演示

网络爬虫—Scrapy实战演示 Scrapy Shell简介进入shell调试网站启动Scrapy Shell 查看目标网站获取网站源代码常用方法调试xpath提取数据Scrapy请求子页面请求及返回处理创建项目创建爬虫 数据解析写入csv文件后记 前言&#xff1a; &#x1f3d8;️&#x1f3d8;️个人简介&…