#pragma pack 可以用来指定数据结构的成员变量的内存对齐数值。
可选值为:
1、2、4、8、16。
使用 pack 指令要配对使用,以避免意外影响项目中其他源文件的结构成员的内存对齐。
如果影响了其他源文件的结构成员内存对齐,那么在你按照默认对齐来计算那些结构成员占用内存大小或者使用指针移动计算结构成员偏移位置的时候,就可能会出现意料之外的异常。
主要可能的异常是内存定位错误或非法内存访问,结果可能导致错误的定位或数值,极端的情况下可能导致程序崩溃。
下面的例子用来展示基本的配对使用方式。
1)#pragma pack(n)的配对使用
#pragma pack(1) //内存对齐设置为1个字节
struct s1
{
int i;
char c;
bool f;
}
struct s2{...}
//...
#pragma pack() //恢复默认的内存对齐
2)#pragma pack(push|pop,n)的配对使用
#pragma pack(push,1) //内存对齐设置为1个字节
struct s3
{
int i;
char c;
bool f;
}
struct s4{...}
//...
#pragma pack(pop) //恢复默认的内存对齐
关键字:STM32 编译指令 配对使用
引用地址:
STM32 编译指令 #pragma pack 的配对使用
推荐阅读最新更新时间:2024-03-16 16:26
STM32 HAL库 +freeRTOS+Keil 移植
STM32 HAL库 +freeRTOS+Keil 移植 官方freeRTOS移植教程很多,本文不做赘述。本文基于Keil 5提供的freeRTOS库,进行移植。 Keil 版本:Keil MDK uVision5 首先准备好一个可以用的HAL库工程,为了方便调试,选择了原子哥的开发板上提供跑马灯工程。 打开工程, 点击 ,下载freeRTOS库, 我的已经安装过了 最新的版本10.3.1 下载完成后关闭,点击 ,在这个界面下,按下图选择对应的选项 选择完成后点击OK( 如果没有先下载),可以看到工程中已经添加RTOS 点击 编译下, 有一个错误先不用管,接下来开始修改文件,先打开RTE_Com
[单片机]
stm32之定时器彻底研究
这里介绍两种方式使用stm32的定时器:直接操作寄存器和使用st的官方的库文件。 相比较而言,直接操作定时器比较简洁,对着寄存器看十分明了。而使用库文件有一点晕头转向。 (个人观点) 程序如下:(以下程序在DX32的例程修改而来,使用的是比较古老的3.0固件库) 1、timer.c文件 #include STM32Lib\stm32f10x.h void TIM2_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; u16 CCR1_Val = 4000; u1
[单片机]
Linux下开发stm32(一) | 使用gcc-arm-none-eabi工具链编译
1.为什么不是gcc 之前我们花了三篇文章介绍Linux下如何进行C语言编程: Linux C语言编程(上篇) | gcc的使用 Linux C语言编程(中篇) | make的使用 Linux C语言编程(下篇) | gdb的使用 这是为了给接下来的Linux下嵌入式开发打好基础,尽快熟悉Linux下c编程,但是在开发stm32的时候,编译工具链要使用gcc-arm-none-eabi,为什么不是gcc呢?这就要说到linux下的交叉编译了,因为我们要在PC机上编译出可以运行在ARM上的程序,使用gcc编译出的是在PC上运行的程序,所以我们要使用gcc-arm-none-eabi进行交叉编译~ 2.gcc-a
[单片机]
STM32驱动NRF24L01
1. 简介 NRF24L01是 nordic 的无线通信芯片,它具有以下特点: 1) 2.4G 全球开放的 ISM 频段(2.400 - 2.4835GHz),免许可证使用; 2)最高工作速率 2Mbps,高校的 GFSK 调制,抗干扰能力强; 3) 125 个可选的频道,满足多点通信和调频通信的需要; 4)内置 CRC 检错和点对多点的通信地址控制; 5)低工作电压(1.9~3.6V),待机模式下状态为 26uA;掉电模式下为 900nA; 6)可设置自动应答,确保数据可靠传输; 7)工作于EnhancedShockBurst 具有Automatic packet handling,Auto packet transacti
[单片机]
STM32:外部晶振时钟配置
void SystemClock_Config(void) { RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); //INPUT HSE = 24M ErrorStatus HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { FLASH_PrefetchBufferCmd(ENABLE); //M0 defined FLASH_SetLatency(FLASH_Latency_1); //M0 defined RCC_PR
[单片机]
STM32 死在 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
移植官方STM32虚拟串口程序,串口通信死在 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); 仿真发现USART1时钟味使能。。。 使能时钟后仿真,USART1寄存器有反应,发送数据是仍死在 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); 上网寻找答案无果。怀疑引脚未配置造成。 配置 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA
[单片机]
ucosii在stm32上的移植详解5
详解1-4把移植过程都已经介绍了。接下来的工作是验证移植是否ok以及如何基于移植好的ucosii开发应用程序。前一个问题可以说是后一个问题的特殊情况,一般我们会创建两个简单的任务,看看任务切换是否成功来验证移植是否ok,因为任务切换可以说是ucosii最核心的功能。 任务代码(main.c): static void task1(void *p_arg) { for (;;) { led_on(LED_0); OSTimeDly(500); led_off(LED_0); OSTimeDly(500); } } static void t
[单片机]
STM32串口DMA接收与发送
1 前言 直接存储器访问(Direct Memory Access),简称DMA。DMA是CPU一个用于数据从一个地址空间到另一地址空间“搬运”(拷贝)的组件,数据拷贝过程不需CPU干预,数据拷贝结束则通知CPU处理。因此,大量数据拷贝时,使用DMA可以释放CPU资源。DMA数据拷贝过程,典型的有: 内存— 内存,内存间拷贝 外设— 内存,如uart、spi、i2c等总线接收数据过程 内存— 外设,如uart、spi、i2c等总线发送数据过程 2 串口有必要使用DMA吗 串口(uart)是一种低速的串行异步通信,适用于低速通信场景,通常使用的波特率小于或等于115200bps。对于小于或者等于115200bps波特率的,
[单片机]