IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 使用C++开发STM32 FreeRTOS工程与添加DSP库 -> 正文阅读

[嵌入式]使用C++开发STM32 FreeRTOS工程与添加DSP库

??续上一篇文章的内容。由CubeMX构建的Makefile工程只支持C和汇编的编译,而且FreeRTOS的代码也需要作为C代码编译。
??当我们想使用C++时,需要做一些准备并且修改Makefile;另外本文补充了一下DSP库的调用方式。参考了另外两位博主的文章:

FreeRTOS与C++

??FreeRTOS的代码是必须作为C语言编译的。C++可以调用C函数,而且也可以在C++的源文件里写C函数。但是C的源文件里不能调用C++相关的东西,比如在C源文件里创建一个类的对象是不行的。
??所以我觉得最好的做法是把任务的定义放到自己的C++源文件中,而在FreeRTOS的C文件中用“extern”声明任务函数。
在这里插入图片描述
??具体做法就是在用CubeMX创建Task的时候,把任务的函数都设置成external。这里的默认选项是既有声明又有实现;exteral选项就是只有一个带extern的任务函数声明;还有一个weak选项表示这个任务函数有一个默认的实现,但可以被外部的定义覆盖,类似于C++中的虚函数的重新定义。
??我一般会把CubeMX工程中的下面的设置勾上。这样不同的外设就会有一个单独的.c和.h文件。
在这里插入图片描述
??然后就可以自己创建一个C++源文件来定义这几个任务函数。
在这里插入图片描述
??任务函数的声明需要放在 extern “C” {} 中,然后就可以在任务函数中创建类的对象,调用成员函数等。
??就像下面这个形式,可以把一堆任务函数的声明都放在一个 extern “C” {} 中,后面逐个对这些任务函数进行定义。

extern "C"
{
void BlinkTskFxn(void *argument);
...
}

...

void BlinkTskFxn(void *argument)
{
    for(;;){
        HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
        osDelay(500);
    }
}

修改Makefile

??Makefile的修改可以参考前面提到的另一篇博文。总得来说就是新增了一套编译C++源文件的规则。

CXX_SOURCES = \
...

ifdef GCC_PATH
CXX = $(GCC_PATH)/$(PREFIX)g++
...
else
CXX = $(PREFIX)g++
...
endif

CXXFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections -std=c++11

CXXFLAGS += -g -gdwarf-2

CXXFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"

LDFLAGS = $(MCU) -specs=nano.specs -specs=nosys.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections 

OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(CXX_SOURCES:.cpp=.o)))
vpath %.cpp $(sort $(dir $(CXX_SOURCES)))

$(BUILD_DIR)/%.o: %.cpp Makefile | $(BUILD_DIR)
    $(CXX) -c $(CXXFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.cpp=.lst)) $< -o $@

??这里的CXX_SOURCES用于列出需要编译的C++源文件;CXX表示编译器,CXXFLAGS中包含编译选项,其中沿用的C_DEFS和C_INCLUDES,这表示即使把编译器改成g++,之前gcc用的define和include路径还是相同的。
??LDFLAGS是link的选项,其中相比于之前的LDFLAGS新增了-specs=nosys.specs,这是必不可少的,如果没有的话编译就会报错,具体做了什么我没太搞明白。-specs=nano.specs表示采用精简后的C库,这个有无不会对编译是否能通过不会有影响。
在这里插入图片描述
??为了便于调试,也需要在工程的属性中为C++添加include和symbol(如果之前没有添加的话),这样就不会有那种报错的波浪线。
??在这里添加include路径和symbol的时候,有“Add to all languages”和“Add to all configurations”的选项可以勾选,这样对于一个条目就只需要添加一次就行了。不管是C还是C++,不管是Debug的配置还是Release的配置,就都能设置好,不需要再去逐个反复添加。(虽然对于Makefile工程来说没有直接的Debug和Release的区分,是否支持Debug,优化的等级都是直接改Makefile的)。

添加DSP库

??通过CubeMX添加DSP库真的非常快。参考前面提到的另一篇博文,在“Pinout & Configuration”界面点“Software Packs”选择组件。
在这里插入图片描述
??然后就可以安装DSP库并勾选它。
在这里插入图片描述
??这时候再回到CubeMX的工程就可以看到左边多了一栏Software Packs,选择它之后再把DSP Library勾选上,令当前的CubeMX工程支持DSP Library。
在这里插入图片描述
??通过这些配置生成的Makefile工程将另外生成DSP库的头文件和预编译好的lib文件,并放在Middlewares目录下。
在这里插入图片描述
??预编译好的lib文件有三种,开头的arm,iar,libarm应该是区分它们是在不同的环境下编译的。l后缀表示小端模式,f后缀表示使用FPU。
??我一开始尝试用arm_cortexM4lf_math.lib,编译会有warning,说这个库用的wchar_t类型是2字节的,而我们的工程中用的是4字节的,这不兼容。后来用iar_cortexM4lf_math.a就没有这个问题。
??关于DSP库的API,可以在官方文档里找到。如果是从源文件开始编译DSP库,还有一些宏定义可以设置,比如ARM_MATH_BIG_ENDIAN设置大端模式;ARM_MATH_MATRIX_CHECK设置输入输出矩阵的维度检查……但是像现在这样用已经编译好的库,这些宏定义是没用的。就像之前要从源码编译时,需要定义__FPU_PRESENT一样,现在即使不定义也没有关系,因为源码都已经编译完成了。
??用预先编译好的DSP库,就只需要include <arm_math.h>和定义ARM_MATH_CM7, ARM_MATH_CM4, ARM_MATH_CM3, ARM_MATH_CM0PLUS, ARM_MATH_CM0, ARM_MATH_ARMV8MBL, ARM_MATH_ARMV8MML中的一种就好了。
在这里插入图片描述
??我再回过头来发现,即使不在CubeMX中添加DSP库,这些DSP库相关的文件随着CMSIS的device驱动一起就提供了。就在Drivers/CMSIS/Lib目录下。

# defines
-DARM_MATH_CM4

# includes
C_INCLUDES =  \
-IDrivers/CMSIS/DSP/Include

# libraries
LIBS = -lc -lm -lnosys  \
-l:iar_cortexM4lf_math.a
LIBDIR =  \
-LDrivers/CMSIS/Lib/IAR

??所以只需要在Makefile中增加器件相关的define和include相应的lib就行了,而不需要通过CubeMX额外导入DSP库。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:35:52  更:2022-05-05 11:39:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:38:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码