打印

这两种库的使用有什么区别呢

[复制链接]
1158|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
几时再见|  楼主 | 2015-12-7 20:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
pi, gp, IO, GPIO, se
第一种:使用宏定义
#define  BspGPIO_Led_On()            GPIO_SetBits(GPIOA, GPIO_Pin_0)

第二种:函数
void  BspGPIO_Led_On(void)
{
     GPIO_SetBits(GPIOA, GPIO_Pin_0);
}


相关帖子

沙发
在路上的程序猿| | 2015-12-8 15:49 | 只看该作者
两者实现的功能一样。只不过实现的方法不一样而已

使用特权

评论回复
板凳
merry_zsp| | 2015-12-8 22:52 | 只看该作者
两者的效率不一样,感觉前者的效率高。

使用特权

评论回复
地板
会飞的大白| | 2015-12-9 20:31 | 只看该作者
宏定义就是在代码中直接进行替换,如果你的main中有10个BspGPIO_Led_On(),就等同于有10个GPIO_SetBits(GPIOA, GPIO_Pin_0)语句,直接执行,不需要进行函数调用,不需要进行压栈操作。

使用特权

评论回复
5
yyj8902| | 2015-12-10 21:16 | 只看该作者
函数调用需要进行压栈操作,运行结束之后还需要出栈,返回原来的函数继续运行,但GPIO_SetBits(GPIOA, GPIO_Pin_0)这个语句只有一个。

使用特权

评论回复
6
布拉格梦语| | 2015-12-12 22:48 | 只看该作者
在楼主这个例子中,使用宏定义会好一点:只有一个语句,如果是经常被调用,可以减少压栈出栈的时间,运行效率快。
如果宏定义的内容很多(函数内容很多),用函数可以节约代码开销,只有一个实体,如果用宏的话将会把所用的代码复制多次。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
merry_zsp + 1 赞一个!
7
jp_chen| | 2015-12-13 10:42 | 只看该作者
对于函数的形式,可以使用inline修饰函数,这样可以起到宏一样的效果(无压栈出栈,直接替代)

使用特权

评论回复
8
nobleliom| | 2015-12-13 19:39 | 只看该作者
用宏定义有另外一个问题,就是如果将宏编译成库,那这个宏的实体也会被编译进去,导致无法修改,举例说
你把#define  BspGPIO_Led_On()            GPIO_SetBits(GPIOA, GPIO_Pin_0)编译到库中,
然后你在工程中再定义#define  BspGPIO_Led_On()            GPIO_SetBits(GPIOA, GPIO_Pin_1),修改管脚0到管脚1,这个时候是不行的,因为管脚0已经被编译进去了。

使用特权

评论回复
9
merry_zsp| | 2015-12-14 20:14 | 只看该作者
会飞的大白 发表于 2015-12-9 20:31
宏定义就是在代码中直接进行替换,如果你的main中有10个BspGPIO_Led_On(),就等同于有10个GPIO_SetBits(GPI ...

这种说法很正确,看来第一种只适合小规模的程序,大规模的程序还是用第二种办法。

使用特权

评论回复
10
merry_zsp| | 2015-12-14 20:15 | 只看该作者
yyj8902 发表于 2015-12-10 21:16
函数调用需要进行压栈操作,运行结束之后还需要出栈,返回原来的函数继续运行,但GPIO_SetBits(GPIOA, GPIO ...

意思是直接宏定义的效率高,对吧。我见新唐新的库就是这么干的。

使用特权

评论回复
11
圣骑士by| | 2015-12-15 11:06 | 只看该作者
nobleliom 发表于 2015-12-13 19:39
用宏定义有另外一个问题,就是如果将宏编译成库,那这个宏的实体也会被编译进去,导致无法修改,举例说
你 ...

请问用函数的话是怎么修改实现改变端口呢?

使用特权

评论回复
12
hello_galaxy| | 2015-12-15 22:07 | 只看该作者
布拉格梦语 发表于 2015-12-12 22:48
在楼主这个例子中,使用宏定义会好一点:只有一个语句,如果是经常被调用,可以减少压栈出栈的时间,运行效 ...

赞一个,解决了我的疑点。明白了两种方法的具体区别。

使用特权

评论回复
13
yyj8902| | 2016-2-21 22:38 | 只看该作者
抛过效率的问题,我喜欢用第二种,这样看着舒服,有成就感。

使用特权

评论回复
14
几时再见|  楼主 | 2016-2-24 22:30 | 只看该作者
nobleliom 发表于 2015-12-13 19:39
用宏定义有另外一个问题,就是如果将宏编译成库,那这个宏的实体也会被编译进去,导致无法修改,举例说
你 ...

这种说法确实正确,只适合不修改程序,要定型的程序。

使用特权

评论回复
15
wangjiahao88| | 2016-3-19 17:25 | 只看该作者
前者的效率高!
而且方便定义与修改程序!

使用特权

评论回复
16
goodluck09876| | 2016-3-21 21:36 | 只看该作者
学习了!

宏定义吧!

第一种比较好!

使用特权

评论回复
17
几时再见|  楼主 | 2017-8-30 22:21 | 只看该作者
goodluck09876 发表于 2016-3-21 21:36
学习了!

宏定义吧!

趋势是第二种,话说回来,能用就是好的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

135

帖子

0

粉丝