目录
2.2 裸机
到目前为止,您应该对工具和开发过程有所了解。在本节中,我们将切换到真正的硬件;这一过程将基本保持不变。我们继续吧。
2.2.1 了解您的裸板资源
在开始之前,您需要确定目标设备的一些特性,因为这些特性将用于配置项目:
- ARM核,例如我的是Cortex-M3
- ARM核是否包括一个FPU?Cortex-M4F和Cortex-M7F是有FPU的
- 确定Flash和RAM的大小。例如我的stm32f103zet6具有 64KB SRAM、512KB FLASH
- Flash和RAM映射在地址空间中的哪个位置?可以参考芯片手册,例如我的:
以上信息,您都可以通过芯片的datasheet或开发板参考手册中找到。
2.2.2 配置
我们将从一个新的模板实例开始。关于如何使用模板,可以参考《嵌入式 Rust 之书---第二章 入门(QEMU)》
第一步是在.cargo/config中设置默认编译目标。
我用的是Cortex-M3的芯片,所以这里不用修改。如有不同,可以注释掉31行,选择其他target。
第二步是将内存区域信息输入到memory.x文件中。
确保debug::exit()调用被注释掉或删除,它只用于在qemu中运行。
现在可以使用cargo build交叉编译程序,并像前一篇博文那样使用cargo binutils检查二进制文件。 cortex-m-rt
crate 可以处理让芯片运行所需的所有magic,同样,几乎所有Cortex-M CPU都能以同样的方式启动。
2.2.3 调试
调试看起来会有点不同。事实上,根据目标设备的不同,第一步看起来可能不同。在本节中,我们将展示在stm32f103zet6开发板上调试程序所需的步骤。
和前一篇博文一样,我们将进行远程调试,客户机将是一个gdb进程。不过,这次服务器将是openocd。
关于开发板、PC和ST-LINK的连接,与openOCD的使用,可以参考《嵌入式 Rust 之书---第一章 引言》
在终端上运行openocd连接到发现板上的st-link。从模板的根目录运行此命令;openocd将获取openocd.cfg文件,该文件指示要使用的接口文件和目标文件。
在另一个终端上运行gdb,也从模板的根目录运行。
接下来,将gdb连接到openocd,它正在等待端口3333上的TCP连接。
现在,使用LOAD命令将程序flash (加载)到微控制器上。
程序现在已加载。这个程序使用semihosting ,所以在进行任何semihosting 调用之前,我们必须告诉openocd启用semihosting 。 您可以使用monitor命令向openocd发送命令。
您可以通过调用monitor help命令来查看所有openocd命令。
就像前面的博文一样,我们可以使用断点和continue命令一直跳到main。
接着使用next命令,将在openOCD的终端中打印“Hello World!”字符串。
打印完字符串之就是一个死循环函数,再执行next命令,就会进入死循环函数,进入后就只能使用Ctrl+C暂停芯片执行死循环。
不想进入死循环,可以使用quit命令退出gdb。
现在调试需要更多的步骤,所以我们已经将所有这些步骤打包到一个名为openocd.gdb的gdb脚本中。
现在运行<gdb> -x openocd.gdb $program将立即将gdb连接到openocd,启用semihosting,加载程序并启动进程。
或者,您可以将<gdb> -x openocd.gdb转换为自定义运行程序,以使cargo run构建程序并启动gdb会话。 此运行程序包含在.cargo/config中,但已被注释掉,这里去掉注释。
这一节到此结束! 本节与原文有所不同,由于我的软硬件与原文使用的有所不同,所以会所区别。但所演示的步骤都是一样的,效果也是一样的!大家可以根据自己的实际情况作出适当的调整。