python - Arm Cortex Bootloader 调试技巧
问题描述
我正在为定制板上的 Cortex-M4 MCU ( ATSAME51N20A ) 编写串行引导加载程序。我目前正在通过 SWD 使用 Jlink 对其进行闪烁/调试。
当前架构:我有一个 python 脚本读取二进制文件,将其分解为 512 字节块,通过 UART 将其发送到 MCU,最后对整个内容进行 CRC32 并检查以确保 CRC 在接收端匹配。这一切正常,数据被发送并且两端的 CRC 匹配。
传入的二进制文件正在保存到 address #define APPLICATION_START_ADDRESS 0x8000
。一旦引导加载程序收到最后一个块,它就会调用以下代码:
void jumpToApplication(void)
{
uint32_t applicationMainStackPointer = *(volatile uint32_t *) (APPLICATION_START_ADDRESS);
__set_MSP(applicationMainStackPointer);
void (*applicationResetHandler)(void);
uint32_t applicationResetHandlerAddress = *(volatile uint32_t *) (APPLICATION_START_ADDRESS + 4);
applicationResetHandler = (void *) applicationResetHandlerAddress;
applicationResetHandler();
}
问题:应用程序在引导加载程序之后没有运行。我应该看到一堆Hello, World!
' 弹出,但没有发生任何事情。
我想也许跳转到仍然连接着 JLink 的应用程序会导致问题,所以我尝试在没有连接 JLink 的情况下运行所有东西,但它仍然无法正常工作。
我的问题:
这里可能出了什么问题?我可以查看什么以继续调试此问题?
我已经测试了我通过 JLink 刷新它发送的二进制文件,但是我实际上正在刷新的文件是一个
.elf
文件。据我了解,该.bin
文件应该也可以正常工作,但也许这就是我出错的地方?在 Python 中,我正在像这样格式化二进制文件:
data = [x for x in open(path, 'rb').read()]
blocks = [data[i:i + PAGE_SIZE] for i in range(0, len(data), PAGE_SIZE)]
这会损坏二进制文件吗?
感谢任何调试提示/建议/见解。
解决方案
推荐阅读
- docker - 为什么要使用共享卷并在 Docker Compose 中复制项目目录
- java - 从可能包含或不包含符号的扫描器令牌中获取整数
- python - 消息:没有这样的元素:无法找到元素:{"method":"xpath","selector":"/html/body/div[2]/div[2]/div/div[3]/div[2 ]/div/div/div[2]/a[1]"}
- c++ - 在 boost r-tree 中存储或访问对象
- c - 如何在流(FILE)中实现“文件位置”?
- mysql - MySql 在单个查询中进行多项选择
- swift - 将按钮放在节页眉/页脚上时,iOS 14 上出现奇怪的 UI 渲染问题
- php - 正则表达式检测尾随逗号和/或空格分隔的数字
- rollupjs - Rollup:使模块全局可访问,无需导入
- javascript - 在另一个选择之后选择和取消选择行 - ReactJS Hooks