SEGGER | 用Embedded Studio写一个“Hello world”应用程序!
来源:segger.com | 作者:segger | 发布时间: 2024-01-06 | 78 次浏览 | 分享到:

 实用工具

当我们在网上搜索比较小的C语言程序时,对于如何编写这样一个较小的程序似乎还有很多困惑。有很多帖子想知道为什么即使是很小的程序,如“Hello world”这样的应用程序为何如此之大,但没有太多解释。本文将展示如何使用Embedded Studio写一个非常小的“Hello world”应用程序。

“Hello world” 应用程序

下面是我们将用于讨论的经典的“Hello world”应用程序:

1

2

3

4

5

6

#include <stdio.h>

 

int main(void) {

  printf("Hello world!");

  return 0;

}

Windows

在Windows上,微软的Visual Studio代表事实标准。微软不仅设法让可执行文件变得更大,而且现在还要求一个包能重新分发一个“可再分发的包”。

很难看出他们为什么会这样做,它们提供操作系统和工具链,但是在旧版本的Visual Studio中这是不必要的。现在仍然有可能生成非常小的windows可执行文件,但这将是我们另一篇文章要讲的内容。

Linux

在Linux中操作要好很多,没有所谓的在分发的文件

$ gcc ./hello.c
$ ./a.out

在终端窗口,我们得到的结果文本:

Hello world!

a.out的大小是16608字节(在64位系统上)。使用strip命令:

strip ./a.out

我们可以消除未使用的(符号)信息,并将其降低到14408字节。我们可以让GCC生成一个main.c的ASM版本,并看到main翻译得很好,所以大部分的大小来自于启动代码和库代码。实际的应用程序只使用了一些指令:

Embedded Studio

对于嵌入式系统,小代码很重要。然而,大多数工具链在生成小代码方面并不出色。让我们来看看Embeded Studio是如何生成程序的,以及它的输出有多大。

首先,我使用了我的blinky project.。其次是将应用程序更改为上面所示的“Hello world”应用程序。重新编译后,程序大小为1.7KB。


虽然这看起来还不错,但是还没达到这个程序所能达到的更小的程度。如上面的截图所示,实际上只有29+32=61个字节来自应用程序和启动代码。其余的都来自哪里呢?

很简单,它们来自RTT(SEGGER的实时传输技术)和printf格式化器。格式化程序是将占位符(如 %d 和 %s)替换为给定参数的软件(此处甚至不需要这些参数,因为“Hello world!”不需要任何参数)。

RTT代码将输出数据存储在一个RAM缓冲区中,并由调试器不断监视和排出。事实上,向RTT写入数据基本上只是调用memcpy,因此速度很快。CPU不需要停止,实时行为几乎不受影响。RTT的干扰非常小,在一个典型的Cortex-M微控制器上复制字符串的时间远低于0.5us,因此即使在要求非常严格的环境中也能使用这种类型的通信。这就是我们将 RTT 作为默认 printf() 实现的原因。

主机端 printf 格式化

可以从列表中选择断点的实现方式,这是所有处理器都可以选择的:

这对大多数程序来说都是一个很好的选择。两者都可以在使用J-Link的实际硬件和模拟器中无缝运行。这里需要注意的一点是,格式化是在主机上完成的,因此是由调试器完成,所有的格式化代码现在不需要包含在生成的程序中,从而使程序变得非常小,正如项目资源管理器和输出窗口报告所示 :

这非常好,运行程序,我们得到了预期的结果:

再按一下 F5键,我们在调试终端看到了预期的结果:

“Hello world”在Flash中只有125字节!

但是,让每个字节都能发挥作用,我们还可以更进一步。Embedded Studio提供了两套系统库,一套根据大小优化,另一套根据速度优化。新项目的默认值是速度,让我们将其更改为大小:


“重新编译”后我们进一步减小了程序:


117字节,很难再小了!我们还可以深入研究主机端格式是如何工作的,但是这可能还有很多内容。但实际上它很简单,就是printf()遇到一个breakpoint(ed)断点指令,然后调试器会处理所有其余的工作。你可以尝试自己下载Embedded Studio来体验,用于评估或非商业用途不需要许可证,它可以在很多支持的平台上使用。

elf文件的大小

对于嵌入式系统来说,Flash中的字节数才是最重要的,而不是ELF文件的大小。但是,我们也可以查看ELF文件,它是7470字节,这包括了不必需的所有符号信息。我们可以通过连接器来删除符号信息(这通常没有多大意义,只是在这里做一个比较):

这使得ELF文件的大小减少到1076个字节,大约比Linux可执行文件小14倍。然而,重要的数字是所使用的117字节的ROM(通常是闪存)内存。

在SEGGER的工具中,我们让每个字节都有意义。你可以尝试在嵌入式系统的其他工具链上使用同样的方法,如果你能接近这个数字,我们会感到很惊讶的!