查看: 1012|回复: 4

[资料] Ubuntu下使用Makefile开发STM32(合集)

[复制链接]
  • TA的每日心情
    无聊
    2018-11-16 10:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2020-6-17 17:05:59 | 显示全部楼层 |阅读模式
    分享到:
    许久没来论坛发帖了。从今天开始,写Ubuntu下使用Makefile开发STM32,来水一下经验,希望大家不要见怪。几天一篇。这个帖子作为一个合集,以后新出教程(或许叫做笔记更好吧)的网址就贴在这个地方。方便大家阅读。

        鉴于篇幅的原因,有些东西不能够写的太细,比如什么软件的安装啊,或者设置PATH路径啊。还请大家自行谷歌。当然了,谷歌已经挂了,还是用镜像吧。这个镜像我用过几个月了,很稳定,一直没有出现什么问题。

        Ubuntu不同与windows。可以你会说在Ubuntu下开发是瞎折腾。当然,如果你在windows下开发会有许多优秀的IDE。有付费的,有免费的。但是在Ubuntu下却不同。虽然你可以使用Eclipse装插件的方式来编写,但我看来那并不是一个好方法。特别是对刚开始进行Linux下开发的人来说。那个插件给你做了太多的东西。在他的基础上,你不会深入的理解newlib库的系统调用。出了问题之后,甚至不知道从何下手。所以,对新手来说,最好的方法就是不使用IDE,虽然这可能有些困难。

        说这么多并不是为了黑IDE,也不是为了体现命令行下的编译多厉害。只是想说IDE,让我们变笨。一旦习惯了IDE之后,我们甚至忘了程序是如何链接的,甚至不知道为什么需要将多个源文件一股脑的加进工程中。或许有人还会在main.c文件里面写几千行代码,而不是将他们分文件组织。刚开始在Ubuntu下开发STM32的时候,我也曾怀念Windows下IDE的日子。有那些熟悉的Keil,IAR,CoIDE。我也曾想将window下的IDE搬到Ubuntu上面。于是开始安装wine。可是事情并不像想象中的那样发展。于是我给Eclipse装插件,一步一步的摸索。然而网上陈旧的资料并不总是有效。特别是在软件版本更新这么快的时代。无论如何,最后还是如愿的装上了。但是里面的文件太过繁杂,并不适合。
        Eclipse行不通之后,我又对CodeBlocks动手。用它开发STM32,经过若干天的失败之后,终于能够用它编译程序,点亮一个LED灯了。只是成功的一小步。用着用着,发现如果我想改一个编译参数,比如用C99吧,却要动那么多次鼠标。想加一个头文件路径,还要使用鼠标进行繁杂的操作。终于想通,告别IDE,拥抱Makefile。

        下面的几篇教程会讲解如何在Ubuntu下用命令行开发STM32。敬请期待!

    以下的所有帖子都是在Nucleo303(之前在社区兑换的)的基础上编写的。如果你想更换其他的板子,请更改固件库中的所有文件,以及链接文件。

    0.工欲善其事
    • 在Ubuntu下寻找Nucleo的串口号。
    • 安装常用的串口软件。minicom,putty。
    • 安装st-link在Ubuntu下的驱动程序。包括下载用的st-flash,调试用的st-util。
    • 安装arm-none-eabi-xxx。

    1.我叫Makefile  
    • 使用Makefile进行简单的工程管理。

    2.灯,等灯等灯~
    • 固件库准备
    • 编写Makefile
    • 编写main函数。
    • 编译,链接,下载

    3.优化程序大小
    • 未优化(6372Bytes)
    • -Os优化(3780Bytes)
    • -ffunction-sections,-fdata-sections,-Wl,--gc-sections优化(1680Bytes)
    • -ffunction-sections,-fdata-sections,-Wl,--gc-sections,-Os优化(1348Bytes)

    4.在SRAM中运行程序
    • 反汇编代码
    • 分析flash.ld链接文件
    • 修改flash.ld,将代码区域更改到RAM中
    • 修改Makefile,生成SRAM中运行的代码。
    • 下载,反汇编验证。
    • 隐含的巨大bug。(中断向量表的问题)

    5.使用串口Part1
    • ringbuffer
    • 在中断中使用ringbuffer
    • 使用gdb调试
    • 添加volatile修正代码
    • 修正ringbuffer的无锁实现。
    • 隐含的bug。(中断向量表的问题。下节讲述)

    6.使用串口Part2
    • SCB->VTOR
    • 更改Makefile进行版本控制
    • 修改__io_getchar适用backspace
    • _exit系统调用

    7.使用printf
    • syscalls
    • 使用Newlib-nano减小代码大小
    • 为Newlib-nano添加printf的浮点输出支持。

    8. 使用硬浮点计算
    • 反汇编相关软浮点代码
    • 添加硬浮点运算的参数
    • 反汇编相关硬浮点代码

    9.再谈_exit  
    • 返回值和参数的传递规则
    • 将main的返回值传递给_exit

    10.使用malloc
    • 动态内存分配机制
    • malloc内存分配测试
    • 为栈保留安全域量
    • 内存布局

    11.使用gdb找出因除0导致的HardFault。

    游客,如果您要查看本帖隐藏内容请回复

    完结

    发一个最终版本的文件end.zip。里面包含Makefile,syscalls,以及串口的源代码。
    串口中添加__io_gets,__io_puts。用于从串口中读入一行数据(考虑backspace的情况)或者发送一个字符串。



    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-5-17 21:11 , Processed in 0.150868 second(s), 22 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.