- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是JLink命令行以及JFlash对于下载算法的作用地址范围认定.
最近痞子衡在给一个 RT1170 客户定制一个 Infineon MirrorBit 类型 64MB Flash 的 SEGGER 下载算法,做完之后在 JFlash 下测试小数据下载没有问题,但是大数据下载就报了地址范围不适用的错误,所以今天我们就来深挖一下自制下载算法时作用地址设定问题:
- Note: 本文所测试 JLink 版本为 V7.94f
关于 SEGGER 下载算法制作,痞子衡之前写过两篇文章:《串行NOR Flash下载算法(MDK工具篇) 一文讲得是如何制作 FLM 算法文件(MDK 算法与 SEGGER 算法是通用的),《串行NOR Flash下载算法(J-Link工具篇)》 一文讲得是配套 XML 文件写法.
XML 文件里的 BaseAddr 和 MaxSize 参数设定的地址范围主要用于选定适用的 FLM 算法文件(即 Loader),而生成 FLM 算法文件源工程里的 FlashDev.c 文件里的 FLASH_BASE_ADDRESS 和 FLASH_BASE_SIZE 参数则是算法在运行过程中用于判断的有效下载数据地址范围.
- Note:关于 XML 添加方法详见痞子衡旧文 《从JLink V7.62开始优化了手动增加新MCU型号支持方法》
有了以上理论基础,现在我们测试一下地址范围设定对下载的影响。我们基于恩智浦 MIMXRT1170-EVKB 评估板,选用一颗 64MB NOR Flash 连在 FlexSPI1 外设上(AHB 映射起始地址为 0x3000_0000,FLM 下载算法里 FLASH_BASE_ADDRESS 固定设为 0x3000_0000).
先在 JLink 命令行下用 LoadFile 命令做测试,该命令支持所有主流格式的程序文件。为了方便设定下载起始地址,我们就用 .bin 格式做测试.
命令格式 LoadFile <FileName>, [<Addr> (.bin only)].
命令解释 Load data file into target memory. Supported ext.: *.bin, *.mot, *.hex, *.srec, *.elf, *.out, *.axf
如果 XML, FLM, LoadFile 地址范围都设定无误,命令执行时后台会弹出下载进度条窗口,表明 FLM 算法被成功调用且在正常擦写 Flash.
现在我们尝试设定不同地址范围(下表里设定的非 0x3000_0000 - 0x33FF_FFFF 有效 64MB Flash 空间范围之外的测试地址需要是真正的无效存储空间地址,不能是 MCU 片内的 SRAM 映射地址),做更多测试,结果如下:
XML范围设定 | FLM范围设定 | LoadFile地址 | 测试结果 |
---|---|---|---|
0x3000_0000 - 0x33FF_FFFF | 设定范围内 | 正常下载 | |
设定范围外 | Writing target memory failed. | ||
0x4000_0000 - 0x43FF_FFFF | 0x3000_0000 - 0x33FF_FFFF | XML范围内 | Writing target memory failed. |
FLM范围内 | Writing target memory failed. | ||
0x3000_0000 - 0x37FF_FFFF | 0x3000_0000 - 0x33FF_FFFF | XML且FLM范围内 | 正常下载 |
XML范围内但FLM范围外 | Writing target memory failed. | ||
0x3000_0000 - 0x33FF_FFFF | 0x3000_0000 - 0x31FF_FFFF | XML且FLM范围内 | 正常下载 |
XML范围内但FLM范围外 | Writing target memory failed. | ||
0x3000_0000 - 0x31FF_FFFF | 0x3000_0000 - 0x33FF_FFFF | XML且FLM范围内 | 正常下载 |
XML范围外但FLM范围内 | Writing target memory failed. | ||
0x3000_0000 - 0x37FF_FFFF | 0x3000_0000 - 0x33FF_FFFF内 | 正常下载 | |
0x3400_0000 - 0x37FF_FFFF内 | 实际下载到Addr-0x4000000处 |
上述测试结果表明,仅当程序下载地址在 XML 和 FLM 共同指向的范围内,且属于有效的 Flash 空间时,下载才正常进行。此外,表格最后一项测试表明,即使超出实际连接的 Flash 最大空间,下载也没有报错,这是因为 MCU 发送给 Flash 操作命令地址溢出了,地址溢出部分被 Flash 自动忽略了.
- Note:要实现表格最后一项测试效果,在制作 FLM 下载算法时,配置 MCU 存储接口外设(对于 i.MXRT1170 来说是 FlexSPI)的 AHB 空间必须与 FlashDev.c 里设定一致,且这个空间不超过芯片系统分配给外设的最大 AHB 空间。
再在 JFlash 界面下做测试,打开软件,创建工程时 Target Device 需要设定为 XML 文件 ChipInfo 中 Name,这样可指定使用自制 FLM 文件。这里也可以看到界面里 Flash banks 自动就识别到了 XML 所设定的地址范围.
- Note1:JFlash 认定的起始地址一定是 XML 中 BaseAddr。
- Note2:当 XML 中 BaseAddr 与 FLM 中 FLASH_BASE_ADDRESS 一致时,JFlash 认定的空间长度由 XML 中 MaxSize 和 FLM 中 FLASH_BASE_SIZE 共同决定,两者取其小。
- Note3:当 XML 中 BaseAddr 与 FLM 中 FLASH_BASE_ADDRESS 不一致时,JFlash 认定的空间长度由 XML 中 MaxSize 决定。
JFlash 下测试结果本质上其实和 JLink 命令下行为一致,我们可以理解为 JFlash 底层调用得就是 JLink 命令实现,只不过界面里做了更多检查与附加功能。且上述 Note 表明 JFlash 在加载算法时对地址空间长度做了预处理,所以当程序下载地址超出 JFlash 认定范围时,JFlash 会弹框提示:
至此,JLink命令行以及JFlash对于下载算法的作用地址范围认定痞子衡便介绍完毕了,掌声在哪里~~~ 。
文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上.
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦.
最后此篇关于痞子衡嵌入式:JLink命令行以及JFlash对于下载算法的作用地址范围认定的文章就讲到这里了,如果你想了解更多关于痞子衡嵌入式:JLink命令行以及JFlash对于下载算法的作用地址范围认定的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
这个问题困扰了我几天。 这是我的相关 Storyboard布局: 我已经将阳光下的每个布局都设置为所有三个 View Controller ,并且仍然得到一个在横幅 View 上方有一个“间隙”的结果
我正在我的 C++ 程序中嵌入一个网页。我遇到的问题是,在嵌入式页面的 javascript 中,我可以捕获 onkeypress,但不会触发 onkeydown 和 onkeyup。 如果我在非嵌入
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 5年前关闭。 Improve this qu
我有一个 java web 应用程序。我想创建一个嵌入式 LDAP 服务器,当 web 应用程序运行时,我将向 LDAP 插入一些记录,并且有另一个 web 应用程序将访问此 LDAP 以获取信息。可
我正在尝试通过 tomcat maven 插件将 war 部署到嵌入式 tomcat 服务器。控制台显示服务器启动正常。 看来 war 还没有展开。当我访问 http://localhost:9090
假设我有如下函数: bigrams=[(k,v) for (k,v) in dict_bigrams.items() if k[:pos_qu]==selection[:pos_qu
我读过一些关于 python 嵌入式 C++ 的教程。我曾引用过 python 对象。 https://docs.python.org/3/c-api/function.html Python 脚本:
我正在使用嵌入式应用程序,在调试期间,调试器无法解析宏符号(我的理论:因为宏在预处理中丢失了)。我最终不得不先在源代码中找到宏,然后使用定义来监视变量。 我的问题是:有没有办法将宏定义合并到 elf
首先我要说的是我开发的是基于cortex m4的嵌入式设备应用。 我有引导加载程序和主应用程序通用的功能。现在我为引导加载程序和应用程序编译源文件 2 次。但是我的双库 dfu 空间不足,我想在 RO
作为嵌入式 C 编程的初学者,我很好奇每个(根据我的经验)程序执行是如何从 main() 函数开始的?这就像链接器识别 main() 并将那个“特殊” 函数的地址放入重置 vector 指向的地址。
在我的实时嵌入式处理器固件中,我需要十进制数字的格式化打印。标准 printf/sprintf 在工具链中不可用,所以我需要自己实现它。 我使用了除以十并取余的天真方法。但是我的目标处理器本身不支持除
我有编程经验,但在软件开发方面了解不多。我目前正在为我工作的公司编写一个软件,我开始挑战自己代码的可读性。 我想知道这是否是嵌入式 if 语句的“有效”替代方案,或者我是否可以使用更好的方法。 假
我有一个运行嵌入式 Linux 的嵌入式目标,我想计算以下时间: 1) 高速缓存读/写时序2) uncache 内存读/写时序 Linux 中是否有任何标准测试来计算上述时间? 我已经编写了自己的测试
大多数嵌入式设备都是为了在通常资源受限或低规格的设备上执行特定任务而构建的。 因此,大多数嵌入式开发人员需要去除不必要的库和模块,并为其特定设备和用例创建自定义分发。我们先来了解一下嵌入式 Linu
我正在嵌入式处理器上编写一个简单的裸机应用程序。作为此应用程序的一部分,它必须使用 malloc 在大约 256kB 的堆上分配一些内存。注意:最初这是在 main 中静态分配的,但在一定的大小限制下
我正在尝试为我 friend 的婚礼建立一个网站。我使用的是 Bootstrap 5,嵌入的视频没有填满屏幕大小。这是一个 live test page HTML: 您还需要代码吗?我想让视频的全宽
我有一个项目,我尝试为微 Controller 构建固件并尝试更好地控制所使用的优化标志。我想,而不是使用 -O flag 分别指定不同的优化标志。不幸的是,-O 似乎发生了一些优化魔法。我无法使用单
我正在使用双核设备,并且要求核心 A 创建一个数据结构,其中包含在核心 B 上运行的函数列表的参数,定期更新它并通知核心 B。参数和类型的数量可以改变在运行期间。 我的计划如下.. 创建一个 Para
我们有一个 Microsoft.Phone.Controls.WebBrowser内嵌控件 StackPanel , 在 PivotItem 内在 Windows Phone 8 上。以简化的形式,它
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 2 年前。 Improve this ques
我是一名优秀的程序员,十分优秀!