使用gcc编译STM32遇到的问题

2019-05-24来源: eefocus关键字:gcc编译  STM32  结构体

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则能正常工作,但断电重启后程序没有正常运行。


关键字:gcc编译  STM32  结构体 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic462828.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:在STM32中将变量或代码设定在指定内存地址的方法
下一篇:IAR中设置了中断向量偏移时进行仿真的注意事项

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

Keil5配置GCC编译器编译STM32工程
Keil一般使用ARMCC编译MCU工程代码。偶然听说Keil也是支持内嵌GCC编译器的。于是尝试了网上博客所述的一些方法,最终找到了一篇博客http://blog.csdn.net/lan120576664/article/details/46806991按照文中所述,发现仍存在一些其他错误,后来又查找了其他相关资料,在这作以总结一、下载GCC编译器https://launchpad.net/gcc-arm-embedded/二、安装GCCGCC解压到keil的安装目录下面。如下图 三、配置Keil如下图所示进行相关设置:Prefix:arm-none-eabi-Folder:D
发表于 2019-07-26
Keil5配置GCC编译器编译STM32工程
arm-none-eabi-gcc编译STM32优化删除代码解决办法
前两天使用arm-none-eabi-gcc编译STM32F103C8程序,就是一个简单的流水灯程序。#include "stm32f10x.h"int main(void){        int i;        RCC->APB2ENR=0xFFFFFFFF;        GPIOC->CRL=0X33333333;//outpp at 50M 
发表于 2018-10-13
Keil5.15使用GCC编译器链接.a库文件
我们知道,当使用第三方的代码时,人家有可能会扔个Lib文件给你.这时候,别人只要提供header文件给你,则你就可以通过Lib文件及header的函数声明,对Lib中的函数进行调用.在Keil中如果使用ARMCC调用Lib文件,相信大家都能从网上找到方法.那如果在Keil中使用GCC来链接第三方GCC编译好的Lib文件——".a"应该如何呢? 在告诉大家方法之前,我们写个简单的函数,然后用GCC编译器编译产生.a文件,便于我们进行测试. 首先,在Keil中配置gcc编译环境,这个可以参考我的文章.Keil5.15使用GCC编译器编译STM32工程,里面有交大家配置方法. 接下来,将工程配置成
发表于 2017-02-07
Keil5.15使用GCC编译器链接.a库文件
Keil5.15使用GCC编译器编译STM32工程
我们使用Keil一般使用ARMCC编译MCU工程代码.其实,Keil也是支持内嵌GCC编译器的.我们可以使用GCC来编译我们的工程代码.一、下载GCC编译器GCC编译器下载地址 二、安装GCC我们可以把GCC解压到keil的安装目录下面.如下图三、配置Keil使用GCC编译器1、配置CC编译规则,Misc Controls 填写-mcpu=cortex-m4 -mthumb -fdata-sections -ffunction-sections 2、Assembler中规则,Misc Controls 填写-mcpu=cortex-m4 -mthumb 3、Linker中填写,Misc
发表于 2017-02-07
Keil5.15使用GCC编译器编译STM32工程
ARMCC和GCC编译ARM代码的软浮点和硬浮点问题
本文介绍了ARM代码编译时的软浮点(soft-float)和硬浮点(hard-float)的编译以及链接实现时的不同。从VFP浮点单元的引入到软浮点(soft-float)和硬浮点(hard-float)的概念,然后是在GCC和ARMCC RVCT工具链下的具体编译参数。 VFP (vector floating-point) 从ARMv5开始,就有可选的 Vector Floating Point (VFP) 模块,当然最新的如 Cortex-A8, Cortex-A9 和 Cortex-A5 可以配置成不带VFP的模式供芯片厂商选择。VFP经过若干年
发表于 2016-07-14
4*4键盘程序代码 基于STM32
这是自己写的扫描第一行按键的程序代码。PE的位8~位11设置为下拉输入。PE的位12~位15设置为推挽输出其中PE的位11是4*4键盘的第一列,PE的为键盘的第一行。先将第一行设置为高电平,检测列中是否有高电平u8 KEY_Scan(u8 mode){                staticu8 key_up=1;//按键按松开标志         if(mode)key_up=1;  //支持连按        &nbs
发表于 2019-10-09
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved