C语言编程疑问

关注

技术 嵌入式 宫梓萱    2018-10-12   |   浏览量 91  

例如函数:


void TIM_SetCompare1(TIM_TypeDef* TIMx uint16_t Compare1)
{
  TIMx->CCR1 = Compare1;
}


我想用这个函数功能的时候,有两种方法:

1,直接调用 TIM_SetCompare1();

2,直接写语句TIMx->CCR1 = Compare1;

当直接调用函数的时候会进行压栈,出栈等行为,会消耗堆栈,也会耗时间对吧。

也就是说直接调用函数体语句TIMx->CCR1 = Compare1的执行速度比直接调用函数要快,能这么理解吗

全部回答

  • 袁建明 发表于 2018-10-12 云汉达人

    理解的完全正确,如果对代码的效率和空间占用都要求比较高的话,直接调用TIMx->CCR1 = Compare1是最合适的。

    但是有些时候对效率要求没有那么高,而是对于代码编写的可重用性和可读性比较高的话,封装成一个单独的函数就更合理了。

    在团队合作开发的时候,代码的可读性可能比执行效率更重要,因为目前大部分情况下硬件资源是由比较大的冗余的。

    当然如果确实硬件资源非常紧张,就必须考虑效率问题了,甚至直接用汇编语言实现,所以两种方式要根据不同情况具体分析如何应用。

    回答点赞:   6101216078 xdsnet 放电 举报 评论 3

  • 捷波 发表于 2018-10-12

    就这个例子来说,你的理解是对的。使用函数封装的好处在于,可以通过函数名比较直观的理解其操作的含义。

    回答点赞:   放电 liangeeg 举报 评论 2

  • xdsnet 发表于 2018-10-12

    理论上封装肯定要占用更多的资源,但有些比较简单的操作可能基于编译器优化可以实现等效的

    所以在c++中有一种函数定义标记(inline),可以强制让语句在具体位置(调用处)展开实现最好效率,当然,这种函数仅仅适用于一些简单的操作。

    回答点赞:   放电 liangeeg 举报 评论 2

  • wo4fisher 发表于 2018-10-12

    你的说法是对的,单片机程序设计本身就是一个执行效率、存储空间、代码阅读理解等综合考量的一个结果。而使用函数,就是c语言以及其他编程语言模块化编程的一个手段,它方便的是编写程序的人,因为程序最终目前来说是靠人来写的。  就比如stm32的hal库,方便的是众多开发程序的人,方便他们用统一的接口函数,去操作硬件,从而解放程序员去把更多的精力放到应用的具体开发上。

    回答点赞:   放电 举报 评论 1

  • fighter-12315 发表于 2018-10-12

    是的,直接操作寄存器的代码效率是比使用库函数效率高许多的

    回答点赞:   放电 举报 评论 1

  • liangeeg 发表于 2018-10-12

    理解正确,就一句代码,效率差别不大

    回答点赞:   放电 举报 评论 1

  • Spirit 发表于 2018-10-12

    你的理解完全正确


    封装成函数可读性高。

    另外还有一种情况:如果同样的功能,不同的MCU中寄存器的操作方式不同。封装成函数就能提高代码的移植性。


    简短的语句,如何在不牺牲运行效率的同时,又能提高可读性和可移植性呢?有两个方法:

    一是用宏,如:

    #define LL_RTC_ReadReg(__INSTANCE__ __REG__) READ_REG(__INSTANCE__->__REG__)

    二是使用内联函数:

    __STATIC_INLINE void LL_RTC_SetOutputSource(BKP_TypeDef *BKPx uint32_t OutputSource)
    {
      MODIFY_REG(BKPx->RTCCR (BKP_RTCCR_CCO | BKP_RTCCR_ASOE | BKP_RTCCR_ASOS) OutputSource);
    }

    为函数加上__STATIC_INLINE这个修饰符,在编译的过程中,会将函数体直接编译在代码中,无需压栈出栈。

    这两种方式,官方的库文件中都在使用。

    补充一下:

    当编译优化级别为level 0时(最低)是不会内联编译的,仍然按常规的函数一样压栈出栈。其它级别可以内联编译。

    回答点赞:   放电 举报 评论 1

  • yhj416606438 发表于 2018-10-12

    一个是库函数操作,一个是寄存器操作,效果一样,效率不同

    回答点赞:   放电 举报 评论 1

  • @曲终人散@ 发表于 2018-10-12

    你分析的确实没毛病,但是程序也讲究封装性,你可以改变函数的内部实现,但是接口是不变的,代码复用性更好

    回答点赞:   放电 举报 评论 1

  • 明有几时有 发表于 2018-10-12

    控制寄存器的方法,效率要高,但是要一个一个的寄存器去学习

    而库就很方便了

    回答点赞:   放电 举报 评论 1

  • robe_zhang 发表于 2018-10-13

    对程序执行效率来说,直接赋值运行的是快。

    从另一个角度看这个问题,如果整个代码全是复制,那么代码利用效率也是个问题,比如是个函数,可以调用100次,代码写一遍,编译一份,其他地方调用就好,直接赋值,要写 100 遍代码,编译100份,写的慢,程序编译出来肯定也大。

    提升了cpu 执行快慢的效率问题,浪费了 flash 利用率的效率。

    怎么说呢,各有利弊,就是个权衡,自己拿捏

    举报 评论 0

  • 厉害企鹅 发表于 2018-10-13

    多一层函数调用,效率也就低一些,可以直接配置寄存器

    举报 评论 0

  • FEItwo 发表于 2018-10-14

    其实主要也是为了安全性,面向对象,代码的复用,程序的简洁性和可读性

    举报 评论 0

  • wanyanfei1984 发表于 2018-10-15

    你理解是完全对的。

    其实这就是最基本的单片机的一些知识;

    我们知道:在学习STM和51最大的区别就是,51一般操作都是针对寄存器的,

    而STM的操作我们一般都会直接使用库函数来进行,当然,库函数中调用的本质也是寄存器的操作。

    这个STM的库函数原理就和你上面所述的原理是一样的。


    一个是为了程序的可读性,一个是为了程序的效率,关键看我们的需求。

    举报 评论 0

  • chen0000009 发表于 20小时前

    是的,函数多封装一层,就多一次调用,就需要消耗多一点时间

    举报 评论 0

我来回答

试用推荐

NB-IoT (内置GNSS)开发套件

产品总数:10个  申请人数:20

距离结束时间:

推荐达人 更多>

  • 王奕 向ta提问

    Eagleson

    在学习FPGA的道路上 我们一起成长吧!

    在行: FPGA/CPLD

  • 靳飞 向ta提问

    汉云

    在路上的Linuxer

    在行: DSP技术 Linux 系统 STM32讨论区 PIC单片机 PCB技术/设计/定制

  • Angel Cherry 向ta提问

    MOP

    用愛和熱忱寫好每一行Code

    在行: FPGA/CPLD Linux 系统 热门单片机

  • 徐珂靖 向ta提问

    xukejing

    Linux系统 、热门开发板

    在行: Linux 系统

  • 袁建明 向ta提问

    河北博联科技有限公司 研发部经理

    日知其所亡

    在行: Linux 系统 灵动微MCU 电源技术

完成答题
赶快去开启您的宝箱吧
问答积分兑换板卡