0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

單片機(jī)C代碼嵌套匯編的一些方法

jf_pJlTbmA9 ? 來源:strongerHuang ? 作者:strongerHuang ? 2023-10-18 16:39 ? 次閱讀

單片機(jī)開發(fā)或多或少都會接觸一些匯編代碼,今天就來說說關(guān)于匯編在C中的定義和調(diào)用,以及舉例說明嵌套匯編代碼。

概述

有認(rèn)真研究,或者說細(xì)心一點(diǎn)的讀者應(yīng)該都知道:C中定義匯編代碼與編譯器有關(guān)。

比如:你在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

“單片機(jī)C代碼嵌套匯編的一些方法

如果你寫過Keil C51,你還會發(fā)現(xiàn)有如下(通過預(yù)處理)嵌套匯編:

#pragma asm

; Assembler Code Here

#pragma endasm

所以,你會發(fā)現(xiàn),不同的編譯器,匯編代碼還是有差異。當(dāng)然,這里主要是說C中嵌套匯編與編譯器有關(guān)。

C中嵌套匯編代碼

常見兩種定義:

1.在C函數(shù)中定義一段匯編代碼;

2.在C文件中定義一個(gè)匯編函數(shù);

(當(dāng)然,兩個(gè)意思差不多,都是在C中嵌套匯編)

上面說了C中定義匯編代碼與編譯器有關(guān),換句話說:不同編譯器解析匯編代碼的方式不同。

這里還是拿core_cm3.c來舉例說明,定義一個(gè)__get_PSP函數(shù)。

在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)關(guān)鍵字用于調(diào)用內(nèi)聯(lián)匯編程序,并且可在 C 或 C++ 語句合法時(shí)出現(xiàn)。

看到這里,推薦閱讀我分享的一篇文章:單片機(jī)用匯編和C語言點(diǎn)燈程序的區(qū)別

舉例

下面舉一些常見例子。

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.內(nèi)核復(fù)位

這是之前分享過的一篇文章《STM32復(fù)位來源》中的代碼:

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

舉了這些常見例子,沒有說透,但相信只要認(rèn)真理解了都能明白。

來源:微信公眾號 | 嵌入式專欄
作者 | strongerHuang
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請聯(lián)系小編進(jìn)行處理


審核編輯 黃宇
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6023

    文章

    44376

    瀏覽量

    628339
  • 匯編
    +關(guān)注

    關(guān)注

    2

    文章

    214

    瀏覽量

    25834
  • C代碼
    +關(guān)注

    關(guān)注

    1

    文章

    89

    瀏覽量

    14237
  • 嵌套
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    7912
收藏 人收藏

    評論

    相關(guān)推薦

    匯編C語言中的定義和調(diào)用

    單片機(jī)開發(fā)或多或少都會接觸一些匯編代碼,今天就來說說關(guān)于匯編C中的定義和調(diào)用,以及舉例說明
    發(fā)表于 08-29 14:07 ?1339次閱讀

    學(xué)習(xí)單片機(jī)一些技巧

    常表現(xiàn)為一些單片機(jī)、功能單元的應(yīng)用條件。如E2PROM的擦寫次數(shù)與資料存儲時(shí)間等應(yīng)用參數(shù)界限。4.過程參數(shù)。指系統(tǒng)運(yùn)行中的有序變化的參數(shù)。三、如何解決單片機(jī)的抗干擾性問題防止干擾最有效的方法
    發(fā)表于 11-15 20:38

    單片機(jī)學(xué)習(xí)需要掌握的一些技巧

    不同的測試項(xiàng)目和方法,但是有一些是必須測試的:1、測試單片機(jī)軟件功能的完善性。這是針對所有單片機(jī)系統(tǒng)功能的測試,測試軟件是否寫的正確完整。2、上電、掉電測試。在使用中用戶必然會遇到上電
    發(fā)表于 07-29 11:54

    請問.C語言中可以嵌套匯編語言嗎?

    .C語言中可以嵌套匯編語言?
    發(fā)表于 09-20 05:55

    請問C語言中可以嵌套匯編語言嗎?

    C語言中可以嵌套匯編語言?
    發(fā)表于 09-25 05:55

    請問在C嵌套匯編是不是種危險(xiǎn)的做法?

    請問在C嵌套匯編是不是種危險(xiǎn)的做法?因?yàn)?b class='flag-5'>匯編語言勢必要直接操作A、Rn寄存器,而這些寄存器在C語言中保存了什么數(shù)據(jù),用戶并不知道,如果用
    發(fā)表于 10-18 04:38

    C51為什么要嵌套匯編?

    C51為什么要嵌套匯編
    發(fā)表于 10-31 06:48

    51單片機(jī)匯編軟件

    51單片機(jī)匯編軟件:經(jīng)過單片機(jī)解密后得到了機(jī)器代碼后,往往需要多學(xué)習(xí)一些別人的編程經(jīng)驗(yàn)或是對程序進(jìn)行修改。在沒有源程序的情況下,反
    發(fā)表于 10-12 07:55 ?741次下載
    51<b class='flag-5'>單片機(jī)</b>反<b class='flag-5'>匯編</b>軟件

    關(guān)于C嵌套匯編代碼難嗎?

    C嵌套匯編代碼難嗎?
    的頭像 發(fā)表于 01-10 14:24 ?2562次閱讀

    單片機(jī)C語言代碼編寫技巧

    下面發(fā)一些我在網(wǎng)上看到的單片機(jī)C語言代碼編寫技巧和自己的一些經(jīng)驗(yàn)來和大家分享;
    發(fā)表于 07-14 11:02 ?2833次閱讀

    51單片機(jī)匯編程序庫

    下面是一些51單片機(jī)匯編語言編程常用到的子程序代碼
    的頭像 發(fā)表于 12-06 17:31 ?9433次閱讀

    STM8S單片機(jī)匯編實(shí)例源代碼免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是一些STM8S單片機(jī)匯編實(shí)例源代碼、匯編程序設(shè)計(jì)。
    發(fā)表于 03-05 08:00 ?10次下載

    【IAR下的匯編】IAR下的匯編/單片機(jī)啟動代碼匯編

    【IAR下的匯編】IAR下的匯編/單片機(jī)啟動代碼匯編
    發(fā)表于 12-03 10:21 ?12次下載
    【IAR下的<b class='flag-5'>匯編</b>】IAR下的<b class='flag-5'>匯編</b>/<b class='flag-5'>單片機(jī)</b>啟動<b class='flag-5'>代碼</b><b class='flag-5'>匯編</b>

    單片機(jī)C代碼嵌套匯編案例

    有認(rèn)真研究,或者說細(xì)心點(diǎn)的讀者應(yīng)該都知道:C中定義匯編代碼與編譯器有關(guān)。 比如,你在core_cm4.h文件會看到如下的代碼
    發(fā)表于 09-07 09:45 ?407次閱讀
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>C</b><b class='flag-5'>代碼</b><b class='flag-5'>嵌套匯編</b>案例

    單片機(jī)“低耦合”的一些方法

    單片機(jī)“低耦合”的一些方法
    的頭像 發(fā)表于 10-17 18:30 ?414次閱讀