使用gcc编译STM32遇到的问题

STM32CubeMX GCC工程Makefile内容详解 关于STM32CubeMX生成的Makefile文件,其中的运行原理、参数以及作为修改方法的记录介绍。 阅读详情

1.针对IAR编译器和arm-none-eabi-gcc编译器,他们处理结构体内存对齐的方法是不同的。

对于IAR,取消结构体内存对齐优化是用__packed

typedef __packed struct
{
    int16_t  x_to_center_mm;
    int16_t  y_to_center_mm;
    int16_t  z_to_center_mm;
    int16_t  anti_clockwise_angle_to_center_degree;
}base_pos_t;

typedef struct
{
    int16_t  x_to_center_mm;
    int16_t  y_to_center_mm;
    int16_t  z_to_center_mm;
    int16_t  anti_clockwise_angle_to_center_degree;
}__packed base_pos_t ;

上述两种写法都能正常工作,但推荐使用下面这种写法。因为它与__attribute__((__packed__))的写法位置保持一致。

对于arm-none-eabi-gcc,取消结构体内存对齐优化是用__attribute__((__packed__))

struct PIDParamStruct_t
{
	uint32_t kp_back;
	uint32_t ki_back;
	uint32_t kd_back;
} __attribute__((__packed__));

用上面的结构体声明变量时需要用struct PIDParamStruct_t  tempValue;

typedef struct 
{
	uint32_t kp_back;
	uint32_t ki_back;
	uint32_t kd_back;
} __attribute__((__packed__)) PIDParamStruct_t;

这样写声明变量时需要用PIDParamStruct_t  tempValue;

关于__attribute__((packed)) 属性的含义如下:

__attribute__((packed)) 属性用于变量和类型,用于变量或结构域时,表示使用最小可能的对齐,用于枚举、结构或联合类型时表示该类型使用最小的内存。如对于结构体,就是它告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。

2..使用openocd下载bin文件时,如果我指定下载到0x8010000,程序是不能正常运行的。下载到0x8000000是可以工作的,注意修改连接文件中的存储地址。

/* Specify the memory areas */
MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
CCMRAM (rw)      : ORIGIN = 0x10000000, LENGTH = 64K
FLASH (rx)      : ORIGIN = 0x08010000, LENGTH = 960K
}

目前测试以下两种命令均不能成功。

OPENOCD := openocd -f interface/stlink.cfg \
		-f target/stm32f4x.cfg

flash: 
	$(OPENOCD) -c "program $(FIRMWARE) verify reset exit "
			   

flash: 
	$(OPENOCD) -c init \
		-c 'reset halt' \
		-c 'flash write_image erase $(FIRMWARE_BIN) 0x08010000 bin'  \
		-c 'reset run' \
		-c exit

而使用ST官方的烧写工具STM32CubeProgrammer则能正常工作,但断电重启后程序没有正常运行。

关注公众号《首飞》回复“机器人”获取精心推荐的C/C++,Python,Docker,Qt,ROS1/2,机器人学等机器人行业常用技术资料。

1,配置开发环境 - 安装 CubeMX 开发环境:ubuntu22.04 + stm32CubeMX + gcc-arm-none-ebai 安装 CubeMX 阅读详情

相关推荐

ARM-GCC环境搭建:适用STM32/GD32的编译调试总结

本文主要介绍了在windows系统下如何搭建开源嵌入式开发环境,分别实现了STM32/GD32单片机的程序烧录和调试,由于笔者也是初次接触,并没有太多理论讲解,全文是对自己动手实践的一次总结记录,针对本文若有任何问题,欢迎与笔者探讨。

weixin_50951729的博客 1万+

STM32 IAR 结构体定义占用空间

/* typedef struct {     _u8 a;     _u32 b;     _u8 c;     _u16 d;     _u32 e;     float f; }test_t; static test_t tmp_struct; tmp_struct.a = 1; tmp_struct.b = 2; tmp_struct.c = 3; tmp_struct.d = 4; ...

淡痕的博客 1886

STM32CubeIDE工程移植必看:解决GCC编译器对齐问题与调试器配置技巧

本文详细解析了从Keil到STM32CubeIDE工程移植过程中遇到的GCC编译器对齐问题与调试器配置技巧。通过实战案例,指导开发者解决内存对齐冲突、多定义错误等常见问题,并提供调试器优化配置方案,帮助顺利完成工程迁移。

weixin_29196315的博客 111

STM32CubeMX+Eclipse+gcc+Jlink 实现STM32开发环境搭建

本节记录通过STM32CubeMX+Eclipse+gcc+Jlink 进行STM32环境搭建的过程;

AnChenliang_1002的博客 2509

STM32CubeIDE工程移植必看:解决GCC编译器下的字节对齐问题(附Keil对比)

本文深入解析了STM32CubeIDE工程移植中GCC编译器下的字节对齐问题,提供了与Keil环境的对比分析及实用解决方案。涵盖结构体对齐、数组处理、外设寄存器访问等关键场景,并分享调试技巧与预防性编程实践,帮助开发者高效完成工程迁移。

weixin_30664051的博客 475

ubuntu搭建STM32开发环境

所需软件 GNU Arm Embedded Toolchain gcc make openocd STM32CubeMx VSCode 一、环境配置 1、安装gcc-arm-none-eabi 进到官网选择Linux版本 等待下载~ 接着直接解压,解压之后用 cd 进到解压的文件目录下,查看一下文件(文件我已经重命名) 紧接着进到 bin 目录下,查看一下文件信息 下面我们将此路径添加到环境变量中 打开终端,输入:vim ~/.bashrc 跳转到最后一行,将gcc-arm-none-eabi的b

m0_47329175的博客 5577

STM32+GCC编译问题记录

STM32 使用GCC编译问题记录

ApexYuan 511

富斯遥控器-ros机器人控制

富斯遥控器-ros机器人手柄控制

zkh7758的博客 1703

在编译stm32 arm gcc工程中遇到的一些关于C++的问题

在编译stm32 arm gcc工程中遇到的一些关于C++的问题 环境 : vscode Embeded IDE插件。 工程 : 使用cubemx生成的stm32 gcc工程。 ​ 我在尝试移植以前在esp-idf写的一个用c++实现的ssd1306组件,遇到了几个问题。首先是virtual析构器无法通过编译,这个是小问题,查询万能的互联网发现是没有链接stdc++库,在链接器后面加入-lstdc++就能解决。(但是我还有其他类,没有使用virtual修饰析构器,却能正常编译通过)。 ​ 编译器报错: u

RampagePBZ的博客 586

✨从零搭建 Ubuntu22.04 + Python3.11 + PyTorch2.5.1 GPU Docker 镜像并上传 Docker Hub

构建一个带 GPU 支持的深度学习开发镜像;使用 PyTorch 2.5.1(CUDA 12.4)环境;发布并托管 Docker 镜像至 Docker Hub;验证 GPU 环境正常运行!🎉 这将极大提升你的项目部署效率,尤其是在多人协作或跨平台部署场景中。

用大模型重构生活:猫奴程序员的AI智能日常记录 1581

ROS2前置基础教程 | 小鱼教你用CMake依赖查找流程

上面我们用g++、make、cmake三种方式来编译ros2的C++节点。用cmake虽然成功了,但是CMakeLists.txt的内容依然非常的臃肿,我们需要将其进一步的简化。将上面的CmakLists.txt改成下面的样子 接着继续生成和编译 是不是非常的神奇,为什么可以浓缩成那么短的几句指令呢?find_package查找路径对应的环境变量如下。 打开终端,输入指令: 结果 观察PATH变量,你会发现赫然在其中,中的路径如果以或结尾,则自动回退到上一级目录,接着检查这些目录下的 cmake找到这些目录

生活不止眼前的苟且 7163

在VS Code中建立STM32 GCC开发环境(并解决了编译RT-Thread出错的问题)

参考:1、为VSCode搭建STM32开发环境 零基础教程 2、使用STM32标准库构建VSCode+gcc+openOCD开发STM32 一、软件、插件安装 1、需要安装的软件及其作用 序号 软件名称 作用 1 VS Code 代码编辑 2 STM32CubeMX STM32芯片图形化配置工具。可生成Makefile工程。 3 arm-none-eabi-gcc 编译代码 4 mingw64 管理代码编译顺序 5 openocd 烧录与调试 2、软件安装 对于后三个.

weixin_43724208的博客 3698

工作中SVN的使用,保姆级教程!

SVN是一款集中式版本控制系统,采用客户端-服务器模式管理代码版本。与Git相比,SVN在目录权限控制、大型二进制文件处理等方面具有优势,适合特定场景使用。本文介绍了SVN的安装方法、基本操作(检出、提交、更新、回滚等)以及分支管理(创建、合并、切换)。同时讲解了文件冲突的解决方法,并演示了如何在IDEA中集成SVN工具。SVN虽然逐渐被Git取代,但在某些特定场景下仍是可靠选择,工具选择应基于团队和项目需求。

胜人者有力,自胜者强! 1856

STM32H753II STM32CubeMX makefile gcc编译DMA1失败问题

STM32CubeMX生成的gcc链接脚本 STM32H753XX_FLASH.ld,将 .data/.bss 放在 DTCMRAM 区域,而DMA1 挂在AXI/AHB总线矩阵上,物理上无法访问DTCMRAM地址空间。修改gcc链接脚本 STM32H753XX_FLASH.ld,将.data/.bss 放在从 DTCMRAM 改到 D1 SRAM (RAM, 0x24000000)即可。

lh-x/jjj 博客 253

YOLOv8+ByteTrack实战:5分钟搞定多目标跟踪(附鱼群检测调参秘籍)

本文详细介绍了如何利用YOLOv8和ByteTrack快速实现多目标跟踪,特别针对鱼群检测等复杂场景提供参数调优秘籍。通过环境配置、核心机制解析和专项调优技巧,开发者可在5分钟内搭建高效跟踪系统,适用于水产养殖、交通监控等实际应用。文章还包含工程落地方案和性能优化建议,帮助实现精准的鱼群计数与行为分析。

e1f2g的博客 1019

vue2/3 - [超详细] 实现企业微信扫码登录完整流程及代码,vue项目接入企业微信扫码登录功能教程,支持新跳页显示二维码或div容器里内嵌登录二维码(详细代码注释,一键复制开箱即用)

vue企业微信扫码登录,vue网页网站企业微信扫码登录教程,vue如何实现企业微信扫码登录功能,vue详细企业微信扫码登录功能实现,vue2实现企业微信扫码登录,前端vue企业微信扫码登录教程,vue pc电脑端企业微信扫码登录详细教程,vue项目中怎么做企业微信扫码注册登录,vue实现网站接入企业微信扫码登录,vue2做企业微信扫码登录的优质文章教程,vue网站对接企业微信扫码登录,vue企业微信扫码登录如何新开一页全屏显示登录二维码,vue企业微信登录二维码 内嵌在div容器里/跳页显示登录二维码,vu

✅ 精选推荐文章 5703

关于Stm32CubeIDE使用GCC编译器时,中文使用GBK编码的问题

Stm32CubeIDE使用GCC编译器时,中文使用GBK编码

秋天的晴 3327

tsmc12: m0po max length问题(H384.M0_PO.L.1)

手动调整可以挪cell,制造上下两个row相对的至少一个site的空间,通过插普通filler来解决,这里需要注意的是,tsmc12有via0的规则,需要让via0落在via0 grid上。在pt eco之后会有一些m0po max length问题出现,大部分问题都可以通过替换decap来解决,少部分由于局部density过高,需要手动调整。更多学习内容请关注「拾陆楼」知识星球。#ICC2中替换decap的参考脚本。

m0_61544122的博客 792

Keil5配置GCC编译器编译STM32工程示例

Keil5配置GCC编译器编译STM32工程示例 去发现同类优质开源项目:https://gitcode.com/ 本资源提供了一个详细的教程,指导如何在Keil5中配置GCC编译器来编译STM32工程。通过本示例,您可以学习到配置过程的关键步骤和注意事项。 具体配置方法,请参考以下内容: 如何在Keil5中安装并配置GCC编译器。 如何将GCC编译器应用于STM32工程。 配置过程中可能遇到的...

gitblog_06707的博客 399

单细胞转录组数据分析中的基因ID注释转换问题:如何解决才能注释所有的UMIcount数据?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1126

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

arm-none-eabi-gcc编译RT-Thread nano STM32F429工程出现的问题

总结来说就是bin文件时按照地址信息顺序生成代码段和可加载数据段的文件,自定义的SDRAM段默认属性时LOAD,也就是可加载的。程序链接时将该段人为可加载的数据段链接进程序造成bin文件特别大。所以修改段的默认属性为NOLOAD(} > SDRAM。

欲盖弥彰1314 925

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Linux系统下速通stm32的clion开发环境配置

速通stm32的clion开发环境配置,使用cmake+arm工具链编译

weixin_53318879的博客 1873

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【解决问题】使用 arm-none-gcc-eabi 编译 ,stm32/at32 重定向 printf 正常但是出现每次输出必须要满1024 字节才输出

解决在stm32/at32 中printf()缓冲区问题 1. 项目工程在 arm-none-gcc-eabi 编译器环境下,定义 _write() 重定向 printf() ,经测试发现确实已被正确重定向但是出现未能及时输出的问题。2.每次输出只有堆满 1024 个字节大小时才会同时输出。

llluisz的博客 387

STM32Cube IDE编译陷阱:char类型符号问题的深度解析与解决方案

摘要:STM32Cube IDE中使用GCC编译器时,char类型默认被视为unsigned char,导致处理有符号数据时出现逻辑错误。本文通过示例代码演示了该问题现象,并提出三种解决方案:显式声明signed char(推荐)、修改编译器选项及类型安全封装。建议新项目始终使用显式声明,谨慎使用全局编译选项,企业级项目可采用typedef统一类型系统。文章旨在帮助开发者避免这一常见陷阱,提高代码可靠性。

weixin_41179911的博客 406

Linux下使用Vs Code,gcc,openocd实现STM32调试烧录(问题及解决)

Error:spawn/usr/bin/arm-none-eabi-gdb ENOENT问题。Step5:绕了一圈最终问题还是在绝对路径上,用户第一次登录到系统时,终端的默认路径是用户的主目录,用户可以使用命令`pwd`来查看当前工作目录的路径。Step2:发现arm-gnu-toolchain-13.3.rel1-x86_64-arm-none-eabi文件解压后被锁住了。解决方法:改用gedit命令,打开的文档为text方式,添加路径保存即可。修改,仍然识别不到,卸载后按照步骤重新授权来一遍就解决了。

qq_45300235的博客 2673

STM32开发过程中碰到的问题总结 - 1

记录下在使用STM32L4系列芯片进行开发时,碰到的各种问题。比较杂。

Dr_chaser的博客 1296
上一篇: 解决了电脑连接wifi无法ping通W5500的问题
下一篇: make的用法收集
首飞爱玩机器人
博客等级 码龄14年 6990粉丝 120原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

首飞爱玩机器人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值