OpenEdv-开源电子网

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

关于#define宏定义

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
33
金钱
33
注册时间
2016-8-12
在线时间
10 小时
发表于 2016-8-14 14:05:02 | 显示全部楼层 |阅读模式
1金钱
看视频课的时候看到位带操作的一段代码以GPIOA的位带操作宏定义为例粘贴如下:

#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C

#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出


如果我在程序中写了如下代码:
PAout(0) = 1;
那么GPIOA_ODR_Addr的计算是在代码执行的时候才层层计算还是在编译器编译的时候已经计算好了?

最佳答案

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

PAout(0) = 1; 这句话会被预处理器替换为: BIT_ADDR((((((uint32_t)0x40000000) + 0x10000) + 0x0800)+12),0) = 1; 那么GPIOA_ODR_Addr的计算是在代码执行的时候才层层计算还是在编译器编译的时候已经计算好了? 这取决于编译时选择的优化等级,如果是-o0,确实是是层层展开,如果是-o1及以上,会做优化算好了写进去 另外提醒LZ,既然想明白了问题,为什么不打开反汇编看看呢?编译结果一看便知
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

67

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
212
金钱
212
注册时间
2015-8-5
在线时间
49 小时
发表于 2016-8-14 14:05:03 | 显示全部楼层
PAout(0) = 1;
这句话会被预处理器替换为:
BIT_ADDR((((((uint32_t)0x40000000) + 0x10000) + 0x0800)+12),0) = 1;
那么GPIOA_ODR_Addr的计算是在代码执行的时候才层层计算还是在编译器编译的时候已经计算好了?
这取决于编译时选择的优化等级,如果是-o0,确实是是层层展开,如果是-o1及以上,会做优化算好了写进去

另外提醒LZ,既然想明白了问题,为什么不打开反汇编看看呢?编译结果一看便知
开源QQ群:431600056
回复

使用道具 举报

25

主题

281

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2504
金钱
2504
注册时间
2015-8-17
在线时间
383 小时
发表于 2016-8-14 18:43:30 | 显示全部楼层
宏定义只是替换,编译器是不会帮你计算的。
做事的原则:
1.每个问题重复三遍、研究三遍后再提问,直接得到答案的人什么都没学会。
2.做事要有始有终,感谢那些帮助自己解决问题的人,把解决的方法总结起来。
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
33
金钱
33
注册时间
2016-8-12
在线时间
10 小时
 楼主| 发表于 2016-8-16 10:07:48 | 显示全部楼层
独孤帅 发表于 2016-8-14 14:05
PAout(0) = 1;
这句话会被预处理器替换为:
BIT_ADDR((((((uint32_t)0x40000000) + 0x10000) + 0x0800)+1 ...

谢谢,刚开始学,keil5还不是太熟悉
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 15:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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