嵌入式 Rust 之书---第二章 入门(裸机)

目录

 

2.2 裸机

2.2.1 了解您的裸板资源

 2.2.2 配置

2.2.3 调试 


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中,但已被注释掉,这里去掉注释。

这一节到此结束! 本节与原文有所不同,由于我的软硬件与原文使用的有所不同,所以会所区别。但所演示的步骤都是一样的,效果也是一样的!大家可以根据自己的实际情况作出适当的调整。

发布了27 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/drsonxu/article/details/99091081
今日推荐