OpenEdv-开源电子网

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

32内存管理编程问题,keil移植到IAR出现编译不了,求解决方法!

[复制链接]

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2014-5-21
在线时间
7 小时
发表于 2014-5-21 09:16:30 | 显示全部楼层 |阅读模式
5金钱

//内存池(4字节对齐)
__align(4) u8 mem1base[MEM1_MAX_SIZE];             //内部SRAM内存池
__align(4) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000))); 
这句话似乎在IAR下就是编译不了,有什么解决办法没有?
这里的大神有用IAR的么?

最佳答案

查看完整内容[请看2#楼]

#pragma pack(4) u8 mem1base[MEM1_MAX_SIZE];             //内部SRAM内存池 u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));  #pragma pack()
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-21 09:16:31 | 显示全部楼层
#pragma pack(4)
u8 mem1base[MEM1_MAX_SIZE];             //内部SRAM内存池
u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000))); 
#pragma pack()
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-6-10
在线时间
0 小时
发表于 2014-5-21 09:16:31 | 显示全部楼层
我都说过了,IAR对齐和绝对地址的定义的语句是不同于MDK的.
#pragma pack(push) //保存对齐状态
#pragma pack(4)//设定为4字节对齐 
__no_init u8 mem1base[MEM1_MAX_SIZE]; //内部SRAM内存池  
__no_init u8 mem2base[MEM2_MAX_SIZE] @ 0x68000000 ; 
#pragma pack(pop)//恢复对齐状态
回复

使用道具 举报

5

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-6-10
在线时间
0 小时
发表于 2014-5-21 09:16:31 | 显示全部楼层
看原子的代码,需要对齐就放,不需要就不放.
还有这两句:
__no_init u8 u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE];  //内部SRAM内存池MAP 
__no_init u8 u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] @(0X68000000+MEM2_MAX_SIZE);
u8 u16 怎么同时出现了呢,可以改为:
__no_init(这个可以不要)  u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE];  //内部SRAM内存池MAP 
__no_init  u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] @(0X68000000+MEM2_MAX_SIZE);
记得未初始化变量的绝对地址声明格式:
__no_init ... @ RAMAddr;
回复

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-5-21 09:52:16 | 显示全部楼层
很遗憾,直到C11才正式支持对齐,我们暂时只能依靠编译器选项来实现,也许MDK/IAR会不同。
于20150522停用该账号:http://www.microstar.club
回复

使用道具 举报

5

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-6-10
在线时间
0 小时
发表于 2014-5-21 18:36:39 | 显示全部楼层
IAR的对齐和绝对地址的定义的语句是不同于MDK的.可以上网搜一下
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2014-5-21
在线时间
7 小时
 楼主| 发表于 2014-5-21 22:03:38 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
#pragma pack(4) 
u8 mem1base[MEM1_MAX_SIZE];             //内部SRAM内存池 
u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));  
#pragma pack()
//外部SRAM内存池
//内存管理表
u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //内部SRAM内存池MAP
u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE))); //外部SRAM内存池MAP
//内存管理参数  

const u32 memtblsize[2]={MEM1_ALLOC_TABLE_SIZE,MEM2_ALLOC_TABLE_SIZE}; //内存表大小
const u32 memblksize[2]={MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE}; //内存分块大小
const u32 memsize[2]={MEM1_MAX_SIZE,MEM2_MAX_SIZE};
////////////////////////////////////////////////////////////////////////////////////////////////////////////

u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000))); 

u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE))); //外部SRAM内存池MAP

这两行还是编译不过呢?
Error[Pe065]: expected a ";"都提示这个错误!!语法上没有错啊,是不是还是有不认得关键字啊?
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2014-5-21
在线时间
7 小时
 楼主| 发表于 2014-5-21 22:30:07 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
大神 QAQ  TAT 求指点啊!!怎么才能在IAR下编译通过啊!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-21 22:50:28 | 显示全部楼层
IAR,支持 __attribute__这个关键字不?
你去掉#pragma pack(4) 
和:#pragma pack() 
再编译一下,看看问题在哪个地方.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2014-5-21
在线时间
7 小时
 楼主| 发表于 2014-5-21 23:50:46 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
如果按照原来的代码
__align(4) u8 mem1base[MEM1_MAX_SIZE]; //内部SRAM内存池
__align(4) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));
这样是提示
Building configuration: STM32_IAR_Modle - Debug 
Updating build tree... 
malloc.c  
Error[Pe079]: expected a type specifier C:\Users\Administrator\Desktop\103_Modle\User\malloc.c 18 
Error[Pe260]: explicit type is missing ("int" assumed) C:\Users\Administrator\Desktop\103_Modle\User\malloc.c 18 
Error[Pe141]: unnamed prototyped parameters not allowed when body is present C:\Users\Administrator\Desktop\103_Modle\User\malloc.c 18 
Error[Pe130]: expected a "{" C:\Users\Administrator\Desktop\103_Modle\User\malloc.c 18 
Warning[Pe012]: parsing restarts here after previous syntax error C:\Users\Administrator\Desktop\103_Modle\User\malloc.c 30 
Warning[Pe174]: expression has no effect C:\Users\Administrator\Desktop\103_Modle\User\malloc.c 30 
Warning[Pe174]: expression has no effect C:\Users\Administrator\Desktop\103_Modle\User\malloc.c 30 
Error[Pe065]: expected a ";" C:\Users\Administrator\Desktop\103_Modle\User\malloc.c 30 
Error[Pe020]: identifier "mem1base" is undefined C:\Users\Administrator\Desktop\103_Modle\User\malloc.c 40 
Error[Pe020]: identifier "mem2base" is undefined C:\Users\Administrator\Desktop\103_Modle\User\malloc.c 40 
Error[Pe020]: identifier "mem1mapbase" is undefined C:\Users\Administrator\Desktop\103_Modle\User\malloc.c 41 
Error[Pe020]: identifier "mem2mapbase" is undefined C:\Users\Administrator\Desktop\103_Modle\User\malloc.c 41 
Error[Pe020]: identifier "memtblsize" is undefined C:\Users\Administrator\Desktop\103_Modle\User\malloc.c 68 
Error[Pe020]: identifier "memtblsize" is undefined C:\Users\Administrator\Desktop\103_Modle\User\malloc.c 79 
Error[Pe020]: identifier "memtblsize" is undefined C:\Users\Administrator\Desktop\103_Modle\User\malloc.c 83 
Error[Pe020]: identifier "memtblsize" is undefined C:\Users\Administrator\Desktop\103_Modle\User\malloc.c 100 
Error while running C/C++ Compiler 
 
Total number of errors: 13 
Total number of warnings: 3 


如果按照你所说的 更改以后
//#pragma pack(4) 
u8 mem1base[MEM1_MAX_SIZE];             //内部SRAM内存池 
u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));
//#pragma pack()
提示是这样的
Building configuration: STM32_IAR_Modle - Debug 
Updating build tree... 
malloc.c  
Error[Pe065]: expected a ";" C:\Users\Administrator\Desktop\103_Modle\User\malloc.c 22 
Error[Pe065]: expected a ";" C:\Users\Administrator\Desktop\103_Modle\User\malloc.c 27 
Error while running C/C++ Compiler 
 
Total number of errors: 2 
Total number of warnings: 0 
和加上注释掉的

#pragma pack(4) 编译是一样的提示,不知道是哪里出问题了,是软件设置的问题还是其他问题!
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2014-5-21
在线时间
7 小时
 楼主| 发表于 2014-5-22 18:30:05 | 显示全部楼层
回复【9楼】guooay耀:
---------------------------------
u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //内部SRAM内存池MAP
u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE)));
后面的是不是也修改成
__no_init u8 u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //内部SRAM内存池MAP
__no_init u8 u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] @(0X68000000+MEM2_MAX_SIZE);

是加在

#pragma pack(push) //保存对齐状态 
#pragma pack(4)//设定为4字节对齐  和
pragma pack(pop)//恢复对齐状态

之间么??
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2014-5-21
在线时间
7 小时
 楼主| 发表于 2014-5-22 22:50:59 | 显示全部楼层
回复【9楼】guooay耀:
---------------------------------
QAQ  大神,你好厉害,可是我不知道后面那两句是不是要放到
#pragma pack(push) //保存对齐状态  
#pragma pack(4)//设定为4字节对齐  
pragma pack(pop)//恢复对齐状态 
之间,在这太感谢你了,度娘没有度到QAQ!!
回复

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2014-9-19
在线时间
0 小时
发表于 2015-3-18 15:06:31 | 显示全部楼层
回复【5楼】d358009670:
---------------------------------
楼主,我想问一下。你这个问题解决了吗?怎么解决的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 20:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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