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.cfgflash: $(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,机器人学等机器人行业常用技术资料。

使用gcc编译STM32遇到的问题相关推荐

  1. STM32 gcc编译环境搭建

    STM32 gcc编译环境搭建 标签(空格分隔): stm32 gcc Makefile 说在前面的话 gcc编译器兼容Windows.Linux和MAC,可自行去官网下载,此处提供参考链接:http ...

  2. STM32使用gcc编译使用说明

    这里想研究一下GCC在window的编译机制,已经在nordic的SDK上测试成功,请看文章:https://blog.csdn.net/chengdong1314/article/details/1 ...

  3. stm32 vscode 编译_vscode+gcc开发stm32环境搭建

    /* 操作系统:Ubuntu16.04 硬件平台:原子Stm32F767+7'RGB屏幕 其他操作系统与开发板搭建环境基本差不多,注意的地方我会提到的. */ 一.软件安装 l VSCode 为什么用 ...

  4. armgcc交叉编译的文件无法运行_从0开始搭建基于ARM GCC的软件系统02——使用ARM GCC编译SDK

    本文以STM32L4VGT6为例,因为手上只有这么一块开发板.其它IC处理方法应该类似. 一.准备工作 1.打开官网https://www.st.com/content/st_com/en.html, ...

  5. Ubuntu下使用GCC开发STM32的环境的搭建

    注:从ubuntu linux下建立stm32开发环境: GCC安装以及工程Makefile建立转载. 1.STM 32 GCC 安装 stm32 属于arm cortex-m系列thumb指令集,所 ...

  6. 如何使用ubuntu编译stm32程序

    之前一直在做Linux应用层相关的工作,使用ubuntu编译代码.最近的项目中需要用到stm32,stm32的编译环境为keil5.在一台电脑上装两个编译器总数觉得麻烦,故而想能不能直接使用ubunt ...

  7. MDK Keil使用GCC编译图文详解

    关注.星标公众号,直达精彩内容 素材来源:https://blog.csdn.net/qq_32348883/article/details/123894312 整理:技术让梦想更伟大 | 李肖遥 简 ...

  8. 使用vscode + gcc进行 STM32 单片机开发(三)DMA读写SD卡,移植FATFS文件系统

    背景 在本系列的前两篇文章( 使用vscode + gcc进行 STM32 单片机开发(一)编译及调试 使用vscode + gcc进行 STM32 单片机开发(二)gcc环境 移植rtthread) ...

  9. 用gcc编译实现对Linux系统cpu占用

    目标:使用gcc编译代码使得占用系统的cpu. 1.确定是否安装gcc编译 2.vi att.c 文件代码如下: a的数值可自己调控,for循环(;;)代表死循环,在for中运行竟可能复杂的代码,让机 ...

最新文章

  1. ASP.Net中自定义Http处理及应用之HttpModule篇
  2. 寒武纪首颗AI训练芯片亮相
  3. 麦肯锡报告摘译:未来成功城市的14个特征
  4. 四轴飞行器实践教程(内部资料)
  5. JStorm与Storm源码分析(八)--计时器工具-mk-timer
  6. jQuery,data()方法学习
  7. UA MATH567 高维统计专题3 含L1-norm的凸优化6 Stochastic Gradient Descent简介
  8. axure9 邮件点击效果_总是收到无关的工作邮件?这个有意思的工具可以帮你消灭它们...
  9. 线程同步的各种方法汇总
  10. Python3实现队列
  11. 微服务架构:如何用十步解耦你的系统?
  12. 安装低版本的R语言、和自行下载安装各个版本的R语言包、以及多环境运行R
  13. php ftp 下载大文件,文件在用php(ftp)下载后损坏[重复]
  14. 计算机一级的复习,【计算机一级】计算机一级考试复习资料
  15. Ubuntu 18.04: Debug package with debug symbol
  16. 力扣28. 实现 strStr()(KMP算法,JavaScript)
  17. lua 5.3 英文手册
  18. Linux中last的用法及参数,查看登陆系统用户的信息
  19. html代码放进json数据,用json数据填充html表
  20. 如何在Mac上创建和移除替身

热门文章

  1. Google Play邮件提示: 您必须声明您的广告 AD_ID 权限
  2. c++系列 —— 智能指针auto_ptr和unique_ptr
  3. ReentrantLock解锁流程
  4. 数学符号在论文中的格式规范
  5. 高效学习-端正学习态度
  6. C++无法打开源文件
  7. 云存储中不可不知的五个安全问题及应对措施
  8. 大数据窥探:关于大数据的15条干货思考
  9. 为什么收藏了这么多3D游戏建模教程,还是没达到可以就业接包的水准?
  10. 第一代计算机硬件逻辑主要采用电子管,云南省计算机一级考试题库4