Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >实用技能分享,充分利用内联函数,内联汇编,内部函数和嵌入式汇编提升代码执行效率和便捷性(2021-12-17)

实用技能分享,充分利用内联函数,内联汇编,内部函数和嵌入式汇编提升代码执行效率和便捷性(2021-12-17)

作者头像
Simon223
发布于 2021-12-21 01:53:43
发布于 2021-12-21 01:53:43
1.4K0
举报

本帖为继续为大家分享实战技能。

一、内联函数Inline function:

内联函数就是带inline关键字修饰的函数,作用是将函数直接嵌入到调用此函数的代码中,从而降低调用此函数所占用的时间。

典型的像CMSIS软件包,ST的LL库都开始采用内联的定义方式,这类函数特点是简短,适合需要频繁调用的场景。因为这样才能发挥内联的优势:

LL库这里用的关键字是__STATIC_INLINE,这个是ARM的CMSIS软件包专门做的定义方式,对MDK,IAR和GCC都做了适配,通用。

二、内联汇编Inline assembler:

内联汇编可以将汇编程序指令直接插入到 C 或 C++ 函数中。通常,如果需要访问在 C 中不可访问的硬件资源或者编写时间关键的代码序列,使用内联汇编非常方便。

内联汇编程序类似 C 函数,也可以有形参和返回值。

这个的典型代表是CMSIS软件包,由于要访问一些内核寄存器,所以C里面嵌入汇编再合适不过了。 cmsis_armcc.h :对应MDK AC5头文件 cmsis_gcc.h : 对应各种基于GCC的编译器头文件 cmsis_clang.h : 对应MDK AC6头文件 cmsis_iccarm.h : 对应IAR头文件 比如我们常用的函数__set_MSP设置主堆栈指针,实现如下:

又比如32bit变量赋值的原子操作,由于要用到互斥指令ldrex和strex,通过内联汇编,就可以方便的在各种编译器里实现:

三、内部函数Instruction Intrinsics

使用内联汇编程序的一个限制是编译器的各种优化对其可能不起作用,这里时候就可以考虑改用内部指令。 内部函数看起来像一个普通的函数调用,但它实际上是编译器识别的内置函数。内部函数编译为内联代码,作为单个指令或作为一小段指令序列,一般用双下划线 (__) 标记 针对内部函数,ARM的CMSIS软件包也是做了一大批,主要分两类:

1、一类是CPU使用的内部函数,部分截图:

像NOP空周期指令,用到的地方很多。

需要硬件开平方指令,可以使用__sqrtf,开方操作仅需要12-14个时钟周期。

需要调节字节顺序,可以使用__REV, __REV16, __REVSH, __RBIT,这比我们用C来实现,方便太多了,而且速度快肯定,因为是直接调用的M内核专用指令

又比如各种RTOS里面最高优先级任务查找,调用指令CLZ(Count Leading Zeros)可以很快查找当前就绪的最高优先级任务(32个优先级)。

2、另一类是SIMD指令,这个在CMSIS-DSP库里面被大量应用,主要使用操作加速,下面是部分截图:

四、嵌入式汇编:

现在xxxx.S启动文件和各种RTOS的Port移植,都是采用的汇编文件(或者内联汇编)实现。像RTOS里面,做上下文切换得用汇编来做入栈和出栈处理。

不可否认,汇编用的比较溜,相比C有不错的速度优势。但是需要较深的汇编编程能力,这个时候可以多积累些好用的汇编代码。特别是一些算法类的加速和中断服务程序的快速执行。

比如uCOS做的CRC汇编,在需要软件CRC场景下,实际测试比市面上的各种C实现CRC加速都要有优势。

uC-CRC-master.zip

而且做成了C接口形式,大大方便大家使用,部分截图:

五、总结:

刚开始阶段可以先用ARM,各IC厂家和软件厂商提供的各种玩法,用熟练了,慢慢积累形式自己的风格。

针对这几种用法,ARM也做过一个简单对比图:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Semihosting真的是嵌入式阑尾么?
如果你只是对 Semihosting 偶有耳闻,那么你与楼上那位多半也是难兄难弟了。
GorgonMeducer 傻孩子
2024/07/30
4890
Semihosting真的是嵌入式阑尾么?
【嵌入式秘术】相约榨干SysTick的每一滴汁水
相信很多人都遇到过这样的情况:在一个Cortex-M嵌入式应用中要实现一个精确的毫秒级延时并不困难——如果你有RTOS,在任务中使用诸如 os_sleep(<休眠时间>) 之类的函数就可以轻松实现;如果你是裸机,也可以使用每个Cortex-M芯片都默认携带的SysTick来实现一个,甚至Arm官方的CMSIS都提供了现成的API,即SysTick_Config(<中断间隔的时钟周期数>):
GorgonMeducer 傻孩子
2021/01/22
1.2K1
什么?Arm放弃了自家的汇编语法?改投GNU了?
那么多对于我们初学者来说要学习哪种风格呢?答案是肯定的,学习GNU风格的汇编代码,因为做Linux驱动开发必须掌握的linux内核、uboot,而这两个软件就是GNU风格的。
GorgonMeducer 傻孩子
2020/12/22
2.4K0
什么?Arm放弃了自家的汇编语法?改投GNU了?
【喂到嘴边了的模块】超级嵌入式系统“性能/时间”工具箱
对大家熟悉的Cortex-M处理起来说,无论是强调极致资源和低功耗的Cortex-M0、还是频率达到上GHz且能与某些应用处理器掰一掰手腕的Cortex-M7,都不会缺席了SysTick的身影。
GorgonMeducer 傻孩子
2021/11/12
1.3K1
【喂到嘴边了的模块】超级嵌入式系统“性能/时间”工具箱
《安富莱嵌入式周报》第273期:2022.07.04--2022.07.10
往期周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频版: https:
Simon223
2022/09/08
7890
教你在RISCV中使用DSP指令!
DSP有相关的专业芯片,能够专门实现计算功能,相比于通用处理器,DSP芯片专门用于计算,可以在一个周期内执行多条计算。随着单片机对计算功能的需求越来越多,如果用传统的通用处理器去执行大数据的计算,将会消耗许多的机器周期,导致系统的实时性变低。于是,一些通用芯片上也开始集成DSP扩展,比如常见的ARM Cortex-R和ARM Cortex-M内核。
bigmagic
2021/09/15
2.1K0
教你在RISCV中使用DSP指令!
C和汇编如何互相调用?嵌入式工程师必须掌握
内联汇编即在C中直接使用汇编语句进行编程,使程序可以在C程序中实现C语言不能完成的一些工作,例如,在下面几种情况中必须使用内联汇编或嵌入型汇编。
用户1605515
2020/12/17
2K0
实战技能分享,减小开关中断对系统实时性的影响,提升系统响应速度
一、背景知识: (1)中断延迟:从中断触发到执行中断服务程序的第一条指令这段时间就是中断延迟时间。
Simon223
2021/12/11
9420
实战技能分享,减小开关中断对系统实时性的影响,提升系统响应速度
【STM32F407开发板用户手册】第1章 初学STM32F407的准备工作
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第1章   初学STM32F407的准备工作 俗话说万事开头难,学习一门新
Simon223
2020/06/03
6.1K0
【教程】如何用GCC“零汇编”白嫖MDK
然而,既然你点开了这篇文章,无论是否真的有这样的需求,至少说明你对这样的搭配还是“颇有些好奇”的。我就不去担心背后的真正原因了,就让我们速速切入正题,进入实操环节吧。
GorgonMeducer 傻孩子
2021/07/29
2.1K0
熟悉又陌生的arm 编译器详解(armcc/armclang)
素材来源:https://blog.csdn.net/qq_34430371/article/details/125820927
李肖遥
2022/12/22
2.6K0
熟悉又陌生的arm 编译器详解(armcc/armclang)
【嵌入式】嵌入式系统可以用哪些编程语言实现(系统全面讲解)
嵌入式系统(Embedded System)是一种以应用为中心、以计算机技术为基础、可裁剪的软件和硬件结合系统。它不具备像普通电脑那样的通用性,而是为了完成某项特定任务而存在。
LuckiBit
2025/04/11
1980
【嵌入式】嵌入式系统可以用哪些编程语言实现(系统全面讲解)
__asm__ volatile 之 C语言嵌入式汇编
或者: para = 0x04 movl $para, %ebx 指令执行的结果是将立即数04h装入寄存器ebx。
用户1147447
2019/05/26
12.8K0
嵌入式:ARM常用开发编译软件介绍
ADS(ARM Developer Suite),是在1993年由Metrowerks公司开发是ARM处理器下最主要的开发工具。 他的前身是SDT,SDT是ARM公司几年前的开发环境软件,目前SDT早已经不再升级。ADS包括了四个模块分别是:SIMULATOR;C 编译器;实时调试器;应用函数库。ADS对汇编、C/C++、java支持的均很好,是目前最成熟的ARM开发工具。很多ARM开发软件(例如Keil)也是借用的ADS的编译器。ADS在2006年版本已经发布到2.2。但国内大部分开发者使用的均是1.2版本
timerring
2022/12/28
2.2K0
嵌入式:ARM常用开发编译软件介绍
【STM32H7】第4章 RL-USB移植(MDK AC5)
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=99710 第4章 RL-USB移植(MDK AC5) 本章教程为大
Simon223
2021/03/02
5790
【STM32H7】第4章   RL-USB移植(MDK AC5)
【安富莱STM32H7教程】第1章 初学STM32H7的准备工作
俗话说万事开头难,学习一门新的知识,难的往往不是知识本身,而是如何快速上手,需要什么资料和开发环境。一旦上手后,深入的学习就相对容易些了。
Simon223
2019/04/17
2K0
【安富莱STM32H7教程】第1章   初学STM32H7的准备工作
32位汇编第七讲,混合编程,内联汇编
          32位汇编第七讲,混合编程 混合编程的概念,有时候我们会想,C语言可不可以调用汇编的函数,或者反过来调用 或者说C语言里面内部直接内联汇编去编写. 可以实现,静看怎么实现 一丶C语
IBinary
2018/01/08
1.7K0
32位汇编第七讲,混合编程,内联汇编
ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍[通俗易懂]
  在讲解各编译器之前,必须先了解一下以下这些文件。这些文件在编译器目录下或者编译生成目标平台的可执行程序时经常见到。此外,还需要注意区分 Windows 平台 和 Linux 平台的文件。
全栈程序员站长
2022/06/28
17.3K0
ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍[通俗易懂]
移动端arm cpu优化学习笔记第4弹--内联汇编入门
本文主要内容是介绍ARMv7和v8内联汇编的一些基础知识,并且会结合两个具体例子去看下如何用内联汇编来改写原来的代码。
Ldpe2G
2020/05/31
3.1K0
【STM32F407】第4章 RL-USB移植(MDK AC5)
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=99710 第4章 RL-USB移植(MDK AC5) 本章教程为大家
Simon223
2021/03/02
4270
【STM32F407】第4章   RL-USB移植(MDK AC5)
推荐阅读
相关推荐
Semihosting真的是嵌入式阑尾么?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档