• STM32 C++编程 001 工程模板


    STM32的官方工程模板 修改为我们这套教材的:STM32 C++工程模板

    我使用的 STM32 库的版本 : V3.5.0


    注意:

    • 想学习本套 STM32 C++编程 的专栏是有点门槛的。你需要有一点点 STM32 基础 和 一点点 C++ 语言基础。

    • 完整的STM32 C++工程模板 的下载地址可以在本篇博客的最下面找到。


    下面是:将 STM32的官方工程模板 修改为我们这套教材的 STM32 C++工程模板 的修改步骤:

    1. 在启动文件中,增大了 的空间

    原启动文件里堆栈的大小:

    这里写图片描述

    增大后:

    这里写图片描述

    • 栈:
      编译器自动分配释放。比如说:函数语句的调用(存放函数的参数值,局部变量的值等等)、指针。

    这里写图片描述

    • 堆:
      一般由程序员分配释放。由关键字 new 分配的内存,即对象,存放在 中。

    这里写图片描述

    Q: 为什么要增大启动文件 的空间?

    A: 解释:
    对于C++语言,相比C语言,它有对象的说法。如果你定义的一个对象需要分配的动态内存空间超出了STM32 启动文件里面设定的堆栈的大小,程序编译的时候是没有错误的,并且也可以烧到板子里面。但是在执行的时候没就出现错误,如果你在线调试程序,你会发现:程序死在了 stm32f10x_it.cpp 文件里的HardFault_Handler()中断函数里面出不来。

    void HardFault_Handler(void)
    {
      /* Go to infinite loop when Hard Fault exception occurs */
      while (1)
      {
      }
    }

    出现这种问题一般都是:数组越界,堆栈溢出所导致的,就是内存空间分配的问题。根据你的实际情况,解决办法就是:

    1. 增大数组的容量;增大启动文件中堆栈的大小。
    2. 对于我们使用C++变成,如果你不将STM32的启动文件中堆栈的大小调大一点,当程序使用了比较都的对象时,就会很容易死在HardFault_Handler() 函数里面。

    2. 将一些.c文件扩展名改为:.cpp

    将原模板工程里面的main.cstm32f10x_it.c的后缀名改为:.cpp
    修改后为:main.cppstm32f10x_it.cpp

    3. 在stm32f10x_it.cpp 文件中添加一些兼容C/C++的代码:

    添加下面的声明:

    #define ARMAPI extern "C"

    这个声明是:在.cpp文件中,使用这个声明(ARMAPI)声明的函数,会被用 C语言 对待。
    在用户可以使用的中断函数前面添加关键字:ARMAPI。比如:

    ARMAPI void USART1_IRQHandler(void)
    {
    }

    4. 我已经将一个Gpio类添加到了这个STM32 C++模板程序 里面。

    Gpio类 下节再讲。

    搞定


    你可以到这里下载我已经做好的 STM32 C++工程模板
    百度云 链接:http://pan.baidu.com/s/1bpbZ2MV 密码:esam
    也可以在CSDN里面下载:http://download.csdn.net/detail/github_35160620/9621141



    小结:
    下一讲,我们来使用C++语言,创建一个STM32的Gpio类。

  • 相关阅读:
    Windows下开发过程中常用的Linux指令
    flask sqlalchemy实现分页功能
    channel(3) 一 基本定义
    goroutine(2) goroutine同步
    goroutine(1) go的调度器
    go 语言 interface(接口 二)
    go 语言 interface(接口 一)
    go 语言 defer
    go 语言 闭包
    go 语言 函数
  • 原文地址:https://www.cnblogs.com/aobosir/p/5928577.html
Copyright © 2020-2023  润新知