0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机C代码嵌套汇编的一些方法

jf_pJlTbmA9 来源:strongerHuang 作者:strongerHuang 2023-10-18 16:39 次阅读

单片机开发或多或少都会接触一些汇编代码,今天就来说说关于汇编在C中的定义和调用,以及举例说明嵌套汇编代码。

概述

有认真研究,或者说细心一点的读者应该都知道:C中定义汇编代码与编译器有关。

比如:你在core_cm4.h文件会看到如下的代码:

#if   defined ( __CC_ARM )
  #define __ASM            __asm                                      /*!< asm keyword for ARM Compiler          */
  #define __INLINE         __inline                                   /*!< inline keyword for ARM Compiler       */
  #define __STATIC_INLINE  static __inline

#elif defined ( __GNUC__ )
  #define __ASM            __asm                                      /*!< asm keyword for GNU Compiler          */
  #define __INLINE         inline                                     /*!< inline keyword for GNU Compiler       */
  #define __STATIC_INLINE  static inline

#elif defined ( __ICCARM__ )
  #define __ASM            __asm                                      /*!< asm keyword for IAR Compiler          */
  #define __INLINE         inline                                     /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */
  #define __STATIC_INLINE  static inline

#elif defined ( __TMS470__ )
  #define __ASM            __asm                                      /*!< asm keyword for TI CCS Compiler       */
  #define __STATIC_INLINE  static inline

#elif defined ( __TASKING__ )
  #define __ASM            __asm                                      /*!< asm keyword for TASKING Compiler      */
  #define __INLINE         inline                                     /*!< inline keyword for TASKING Compiler   */
  #define __STATIC_INLINE  static inline

#elif defined ( __CSMC__ )
  #define __packed
  #define __ASM            _asm                                      /*!< asm keyword for COSMIC Compiler      */
  #define __INLINE         inline                                    /*use -pc99 on compile line !< inline keyword for COSMIC Compiler   */
  #define __STATIC_INLINE  static inline
#endif

“单片机C代码嵌套汇编的一些方法

如果你写过Keil C51,你还会发现有如下(通过预处理)嵌套汇编:

#pragma asm

; Assembler Code Here

#pragma endasm

所以,你会发现,不同的编译器,汇编代码还是有差异。当然,这里主要是说C中嵌套汇编与编译器有关。

C中嵌套汇编代码

常见两种定义:

1.在C函数中定义一段汇编代码;

2.在C文件中定义一个汇编函数;

(当然,两个意思差不多,都是在C中嵌套汇编)

上面说了C中定义汇编代码与编译器有关,换句话说:不同编译器解析汇编代码的方式不同。

这里还是拿core_cm3.c来举例说明,定义一个__get_PSP函数。

在Keil MDK中定义:

__ASM uint32_t __get_PSP(void)
{
  mrs r0, psp
  bx lr
}

在IAR EWARM中定义:

uint32_t __get_PSP(void)
{
  __ASM("mrs r0, psp");
  __ASM("bx lr");
}

__asm(__ASM)关键字用于调用内联汇编程序,并且可在 C 或 C++ 语句合法时出现。

看到这里,推荐阅读我分享的一篇文章:单片机用汇编和C语言点灯程序的区别

举例

下面举一些常见例子。

1.FreeRTOS中portmacro.h文件下源代码:

static portFORCE_INLINE void vPortRaiseBASEPRI( void )
{
uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;

  __asm
  {
    /* Set BASEPRI to the max syscall priority to effect a critical section. */
    msr basepri, ulNewBASEPRI
    dsb
    isb
  }
}

2.FreeRTOS中port.c文件下源代码:

__asm void xPortPendSVHandler( void )
{
  extern uxCriticalNesting;
  extern pxCurrentTCB;
  extern vTaskSwitchContext;

  PRESERVE8

  mrs r0, psp
  isb

  ldr  r3, =pxCurrentTCB    /* Get the location of the current TCB. */
  ldr  r2, [r3]

  stmdb r0!, {r4-r11}      /* Save the remaining registers. */
  str r0, [r2]        /* Save the new top of stack into the first member of the TCB. */

  stmdb sp!, {r3, r14}
  mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY
  msr basepri, r0
  dsb
  isb
  bl vTaskSwitchContext
  mov r0, #0
  msr basepri, r0
  ldmia sp!, {r3, r14}

  ldr r1, [r3]
  ldr r0, [r1]        /* The first item in pxCurrentTCB is the task top of stack. */
  ldmia r0!, {r4-r11}      /* Pop the registers and the critical nesting count. */
  msr psp, r0
  isb
  bx r14
  nop
}

3.内核复位

这是之前分享过的一篇文章《STM32复位来源》中的代码:

__asm void NVIC_CoreReset_a(void)
{
  LDR R0, =0xE000ED0C
  LDR R1, =0x05FA0001
  STR R1, [R0]
deadloop_Core
  B deadloop_Core
}

举了这些常见例子,没有说透,但相信只要认真理解了都能明白。

来源:微信公众号 | 嵌入式专栏
作者 | strongerHuang
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理


审核编辑 黄宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620841
  • 汇编
    +关注

    关注

    2

    文章

    214

    浏览量

    25735
  • C代码
    +关注

    关注

    1

    文章

    89

    浏览量

    14177
  • 嵌套
    +关注

    关注

    0

    文章

    14

    浏览量

    7800
收藏 人收藏

    评论

    相关推荐

    汇编在C语言中的定义和调用

    单片机开发或多或少都会接触一些汇编代码,今天就来说说关于汇编在C中的定义和调用,以及举例说明嵌套汇编
    发表于 08-29 14:07 1179次阅读

    在KEIL中实现C语言嵌套汇编语言

    的确定延时时间,便于理解非常适合硬件工程师学习。但是要提高单片机技能,必须掌握C语言编程,因为C语言有强大的模块化管理思想。我想在很多人学习的过程中即学了汇编语言,又学习了
    发表于 03-07 13:38

    关于单片机应用编程技巧的一些问题解答

    容易出现 ROM 空间不够、堆栈溢出等问题。而且一些单片机 厂家也不定能提供 C 编译器。而汇编语言,
    发表于 07-19 06:31

    学习单片机一些技巧

    常表现为一些单片机、功能单元的应用条件。如E2PROM的擦写次数与资料存储时间等应用参数界限。4.过程参数。指系统运行中的有序变化的参数。三、如何解决单片机的抗干扰性问题防止干扰最有效的方法
    发表于 11-15 20:38

    单片机学习需要掌握的一些技巧

    不同的测试项目和方法,但是有一些是必须测试的:1、测试单片机软件功能的完善性。这是针对所有单片机系统功能的测试,测试软件是否写的正确完整。2、上电、掉电测试。在使用中用户必然会遇到上电
    发表于 07-29 11:54

    请问.C语言中可以嵌套汇编语言吗?

    .C语言中可以嵌套汇编语言?
    发表于 09-20 05:55

    请问C语言中可以嵌套汇编语言吗?

    C语言中可以嵌套汇编语言?
    发表于 09-25 05:55

    请问在C嵌套汇编是不是种危险的做法?

    请问在C嵌套汇编是不是种危险的做法?因为汇编语言势必要直接操作A、Rn寄存器,而这些寄存器在C语言中保存了什么数据,用户并不知道,如果用
    发表于 10-18 04:38

    单片机使用汇编开发的简单介绍 相关资料分享

    单片机的处理速度越来越快,越来越多的单片机使用C语言开发。如今,一些低端MCU还在使用汇编开发;一些
    发表于 07-06 07:27

    单片机汇编代码分析

    单片机汇编,二进制代码修改,单片机汇编代码分析,单片机
    发表于 07-13 06:51

    C51为什么要嵌套汇编

    C51为什么要嵌套汇编
    发表于 10-31 06:48

    关于C中嵌套汇编代码难吗?

    在C中嵌套汇编代码难吗?
    的头像 发表于 01-10 14:24 2383次阅读

    STM8S单片机汇编实例源代码免费下载

    本文档的主要内容详细介绍的是一些STM8S单片机汇编实例源代码汇编程序设计。
    发表于 03-05 08:00 10次下载

    【IAR下的汇编】IAR下的汇编/单片机启动代码汇编

    【IAR下的汇编】IAR下的汇编/单片机启动代码汇编
    发表于 12-03 10:21 12次下载
    【IAR下的<b class='flag-5'>汇编</b>】IAR下的<b class='flag-5'>汇编</b>/<b class='flag-5'>单片机</b>启动<b class='flag-5'>代码</b><b class='flag-5'>汇编</b>

    单片机C代码嵌套汇编案例

    有认真研究,或者说细心一点的读者应该都知道:C中定义汇编代码与编译器有关。 比如,你在core_cm4.h文件会看到如下的代码
    发表于 09-07 09:45 200次阅读
    <b class='flag-5'>单片机</b>C<b class='flag-5'>代码</b><b class='flag-5'>嵌套汇编</b>案例