新闻  |   论坛  |   博客  |   在线研讨会
挑战用一百个字节写一个闪烁灯程序!
13261589816 | 2023-06-12 13:27:10    阅读:165   发布文章

作者:Roff Segger,麦克泰技术测试、翻译和编写

我们使用SEGGER公司的Embedded Studio开发环境进行测试:在一个Cortex-M微控制器上,看看需要使用多少Flash存储器才能够完成一个LED灯的闪烁?


目标:

· 使用少于100个字节的程序完成一个闪烁应用

· 使用人眼容易看到的切换频率(即1-5Hz范围)

· 主程序用C/C++语言编写

· 使用方便得到的硬件

· 不使用或禁用工具链的运行时系统初始化

 

本文将大致介绍我们要使用的每一个字节和每一条指令。这是一个了解系统启动时到底发生了什么,即在到达main()函数之前“底层”发生什么的好途径。

 

简而言之:使用Embedded Studio开发环境可以在使用不到100字节的程序内完成这个工作。


01

硬件

我们使用的硬件是一块STM32跟踪参考板。它非常简单,只有一个STM32F407微控制器、3个LED、一个调试/跟踪接口和一个USB供电端口。

图片

每个J-Trace仿真器交付中包含该开发板,然而,在这里,我仅仅使用常规的J-Link功能下载和调试程序。用户也可以选择任何带LED的硬件测试。


02

生成项目

非常简单,打开Embedded Studio开发环境,从菜单中选择File -> New Project,选择第一个选项,创建可执行文件。

图片

根据提示,选择使用默认值,单击next几次后,我最终得到了一个小项目,如下面的Project Explorer窗口中所示。

图片

选择Build->Build Mini或按F7构建我们的程序。

Debug -> Go或F5启动调试器。

我们现在没有连接硬件,所以Embedded Studio要求我们使用内置模拟器。

图片

点击Yes或点击Enter启动模拟器。

 

调试器停在main()函数处,这是一个标准的 “Hello world”应用程序。

图片

现在,为了实现最小的应用程序,我们将其简化为一个基本上是空的循环。


int main(void) {

  int i;  

 

  do {

    i++;

  } while (1);


图片

结果只占用了158字节的Flash。这已经非常不错了,但是在添加实际LED闪烁功能之前,我需要了解内存的占用,以及如何使我的程序最小化。

为了做到这一点,我可以查看Memory Usage Window、链接器映射文件、生成的ELF文件,或者简单地查看Project Explorer。

从Project Explorer窗口可以知道,这个可执行文件由3个源程序文件构成,以及它们使用了多少Code + RO空间。请注意,这些是编译器生成对像的数值。对于最终的可执行文件,链接器可以消除未使用的功能,或者在必要时添加一些结合层代码(从Flash跳到RAM或从Thumb指令跳到ARM指令)和填充(如:保证4字节对齐)。

另一个使用Flash存储器的地方,可能是从库中链接进来的代码,例如:C运行时库。然而,我们的小项目并没有使用库函数,因此我们不必考虑库代码的空间占用。

图片

而且,Project Explorer展示了每个源文件的内存使用情况(2、128和24字节)和项目可执行文件总的内存使用情况:158字节。这和我们在Output窗口中看到的数值相同。

03

理解项目结构

这三个文件的用途?我们的应用程序只是一个简单的main()函数。为什么我还需要另外两个文件呢?

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
北京麦克泰软件技术有限公司(中文简称麦克泰,英文简称 BMR)成立于1995年, 是国内专业的嵌入式系统软件企业,与世界领先的嵌入式软件供应商合作有二十多年的时间,为嵌入式研发提供丰富的工具,软件,解决方案和培训服务。
推荐文章
最近访客