OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 28852|回复: 10

STM32 语法问题 __align(4)

[复制链接]

48

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2013-6-26
在线时间
0 小时
发表于 2013-7-6 11:04:19 | 显示全部楼层 |阅读模式
__align(4)  这是MDK中的一种语法?作用什么;;__align(4) u8 mem1base[MEM1_MAX_SIZE];这条语句的作用是定义MEM1_MAX_SIZE个u8类型的数组,使用4字节对齐的方式吗?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2017-6-27
在线时间
12 小时
发表于 2017-6-30 16:26:10 | 显示全部楼层

在eclipse编译,__align(4)就会报错
expected declaration specifiers or '...' before numeric constant
请问这是怎么回事儿
回复 支持 1 反对 0

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-12-28
在线时间
17 小时
发表于 2016-1-18 20:13:35 | 显示全部楼层

四字节对齐有什么意义呢?我想把gps得到的数直接与float类型的数进行比较,自己编一个小范围的地图,进行编码,但是没法直接比较,请问怎么把dtbuf和float进行比较?或者怎么转换
回复 支持 1 反对 0

使用道具 举报

48

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2013-6-26
在线时间
0 小时
 楼主| 发表于 2013-7-6 20:20:49 | 显示全部楼层
用align修饰数组后,可以去掉packed关键字了. 

ARM下的对齐处理  
from DUI0067D_ADS1_2_CompLib 

3.13 type  qulifiers 

有部分摘自ARM编译器文档对齐部分 

对齐的使用: 
1.__align(num) 
   这个用于修改最高级别对象的字节边界。在汇编中使用LDRD或者STRD时 
   就要用到此命令__align(8)进行修饰限制。来保证数据对象是相应对齐。 
   这个修饰对象的命令最大是8个字节限制,可以让2字节的对象进行4字节 
   对齐,但是不能让4字节的对象2字节对齐。 
   __align是存储类修改,他只修饰最高级类型对象不能用于结构或者函数对象。 
    
2.__packed  
  __packed是进行一字节对齐 
  1.不能对packed的对象进行对齐 
  2.所有对象的读写访问都进行非对齐访问 
  3.float及包含float的结构联合及未用__packed的对象将不能字节对齐 
  4.__packed对局部整形变量无影响 
  5.强制由unpacked对象向packed对象转化是未定义,整形指针可以合法定 
  义为packed。 
     __packed int* p;  //__packed int 则没有意义 
  6.对齐或非对齐读写访问带来问题 
  __packed struct STRUCT_TEST 

  char a; 
  int b; 
  char c; 
}  ;    //定义如下结构此时b的起始地址一定是不对齐的 
         //在栈中访问b可能有问题,因为栈上数据肯定是对齐访问[from CL] 
//将下面变量定义成全局静态不在栈上  
static char* p; 
static struct STRUCT_TEST a; 
void Main() 

__packed int* q;  //此时定义成__packed来修饰当前q指向为非对齐的数据地址下面的访问则可以 

p = (char*)&a;           
q = (int*)(p+1);       

*q = 0x87654321;  
/*    
得到赋值的汇编指令很清楚 
ldr      r5,0x20001590 ; = #0x12345678 
[0xe1a00005]   mov      r0,r5 
[0xeb0000b0]   bl       __rt_uwrite4  //在此处调用一个写4byte的操作函数  
       
[0xe5c10000]   strb     r0,[r1,#0]   //函数进行4次strb操作然后返回保证了数据正确的访问 
[0xe1a02420]   mov      r2,r0,lsr #8 
[0xe5c12001]   strb     r2,[r1,#1] 
[0xe1a02820]   mov      r2,r0,lsr #16 
[0xe5c12002]   strb     r2,[r1,#2] 
[0xe1a02c20]   mov      r2,r0,lsr #24 
[0xe5c12003]   strb     r2,[r1,#3] 
[0xe1a0f00e]   mov      pc,r14 
*/ 

/* 
如果q没有加__packed修饰则汇编出来指令是这样直接会导致奇地址处访问失败 
[0xe59f2018]   ldr      r2,0x20001594 ; = #0x87654321 
[0xe5812000]   str      r2,[r1,#0] 
*/ 

//这样可以很清楚的看到非对齐访问是如何产生错误的 
//以及如何消除非对齐访问带来问题 
//也可以看到非对齐访问和对齐访问的指令差异导致效率问题 
}
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-6 12:41:53 | 显示全部楼层
四字节对齐.是的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
发表于 2016-1-3 19:48:56 | 显示全部楼层
              学习了.....................
总有一天,要为自由而活
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2015-12-21
在线时间
23 小时
发表于 2016-4-4 08:06:35 | 显示全部楼层
学习了。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
36
金钱
36
注册时间
2015-8-19
在线时间
7 小时
发表于 2016-4-9 11:46:27 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2015-9-4
在线时间
18 小时
发表于 2016-6-21 13:33:44 | 显示全部楼层
不懂  建议原子 好好讲讲这里
回复 支持 反对

使用道具 举报

6

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-12-11
在线时间
53 小时
发表于 2016-8-3 13:57:24 | 显示全部楼层
并没有看懂,希望能够详细讲解一下
Try again and there is nothing left to say.
回复 支持 反对

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-12-7
在线时间
3 小时
发表于 2016-12-10 17:03:56 | 显示全部楼层

那这句话是什么意思呢?原子哥
__align(32) volatile CPU_INT08U External_RamMemp[EXTRENNAL_MEM_NUM][EXTERNAL_MEMBLOCK_SIZE]  __attribute__((at(0X68000000)));       
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-17 12:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表