项目简介
本项目涵盖两部分。一方面是编译器性能测试,针对近期邮件列表中关于GCC在嵌入式ARM编程表现不佳,特定版本Clang更具优势的观点,使用STM32F303K8进行简单音频DSP应用,对GCC和不同版本的Clang编译器做性能对比。另一方面是基于STM32的HAL库,为STM32F3xx系列微控制器开发的CAN通信驱动,可实现CAN消息的初始化、配置、发送和接收,还能通过回调函数处理特定CAN事件。
项目的主要特性和功能
编译器性能测试
- 用个性化Makefile和参考特定文档,适配GCC和Clang编译STM32F3xx相关代码的流程。
- 对两个版本的Clang和两个版本的GCC进行基准测试,以典型音频DSP应用为测试用例。
- 从CPU负载、二进制文件大小等方面对比不同编译器性能,并生成对比图表。
CAN通信驱动
- 初始化CAN接口,可设置波特率、模式、位定时等参数。
- 配置CAN过滤器,实现接收CAN消息的过滤。
- 支持阻塞和非阻塞模式的CAN消息发送和接收。
- 提供回调函数机制,处理发送和接收完成事件。
- 提供实用函数,如获取CAN接口状态、获取最近的CAN错误代码等。
安装使用步骤
编译器性能测试
- 若使用GCC,确保已安装GCC和对应的个性化Makefile,通过日常维护的Makefile进行编译、链接、反汇编和硬件烧录等操作。
- 若使用Clang,参考文档https://interrupt.memfault.com/blog/arm-cortexm-with-llvm-clang 适配GCC Makefile,使用Fedora发行版自带的免费版本Clang进行编译。
- 若测试ARM的专有Clang版本,申请30天免费试用的ARM Development Studio,用其提供的独立Makefile编译,注意其包含自己的头文件、库和不同命令语法的链接器。
- 运行测试用的音频DSP应用,进行性能测试并查看生成的对比图表。
CAN通信驱动
- 确保已正确安装STM32F3xx系列微控制器的HAL库。
- 在代码中包含必要的头文件,如
stm32f3xx_hal_can.h
。 - 调用相关函数进行CAN接口的初始化、配置、发送和接收操作,示例代码如下: ```c
include "stm32f3xx_hal_can.h"
CAN_HandleTypeDef hcan;
void CAN_Config(void) { CAN_FilterTypeDef sFilterConfig;
__HAL_RCC_CAN_CLK_ENABLE();
if (HAL_CAN_Open(&hcan, CAN_HANDLE, 1, 500000) != HAL_OK) { // Error handling }
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; sFilterConfig.FilterIdHigh = 0x00; sFilterConfig.FilterIdLow = 0x0000; sFilterConfig.FilterMaskIdHigh = 0x00; sFilterConfig.FilterMaskIdLow = 0x0000; sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; sFilterConfig.FilterActivation = ENABLE; sFilterConfig.SlaveStartFilterBank = 14;
if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK) { // Error handling }
// Additional CAN configuration }
int main(void) { // Initialize the CAN interface CAN_Config();
// Prepare and send a CAN message CAN_TxHeaderTypeDef TxHeader; uint8_t TxData[8] = {0};
TxHeader.StdId = 0x123; TxHeader.IDE = CAN_ID_STD; TxHeader.RTR = CAN_RTR_DATA; TxHeader.DLC = 8; TxHeader.TransmitGlobalTime = 0;
if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, 0) != HAL_OK) { // Error handling }
while (1) { // Main loop } } ``` 4. 在需要时,实现自定义的回调函数以处理CAN事件。
注意事项
- CAN通信驱动基于STM32F3系列微控制器,可能不适用于其他STM32系列。
- 根据具体的硬件和配置,实现可能有所不同。
- 在使用前,请确保正确配置GPIO引脚和相关的硬件资源。
- 遵循STM32的HAL编程模型,使用易于理解的API进行CAN通信的配置和控制。
下载地址
点击下载 【提取码: 4003】【解压密码: www.makuang.net】