色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理


審核編輯 黃宇
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6035

    文章

    44554

    瀏覽量

    634653
  • 匯編
    +關注

    關注

    2

    文章

    214

    瀏覽量

    25927
  • C代碼
    +關注

    關注

    1

    文章

    89

    瀏覽量

    14297
  • 嵌套
    +關注

    關注

    0

    文章

    15

    瀏覽量

    7929
收藏 人收藏

    評論

    相關推薦

    匯編C語言中的定義和調用

    單片機開發或多或少都會接觸一些匯編代碼,今天就來說說關于匯編C中的定義和調用,以及舉例說明
    發表于 08-29 14:07 ?1411次閱讀

    學習單片機一些技巧

    常表現為一些單片機、功能單元的應用條件。如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

    C51為什么要嵌套匯編

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

    51單片機匯編軟件

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

    關于C嵌套匯編代碼難嗎?

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

    單片機C語言代碼編寫技巧

    下面發一些我在網上看到的單片機C語言代碼編寫技巧和自己的一些經驗來和大家分享;
    發表于 07-14 11:02 ?2918次閱讀

    51單片機匯編程序庫

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

    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 ?568次閱讀
    <b class='flag-5'>單片機</b><b class='flag-5'>C</b><b class='flag-5'>代碼</b><b class='flag-5'>嵌套匯編</b>案例

    單片機“低耦合”的一些方法

    單片機“低耦合”的一些方法
    的頭像 發表于 10-17 18:30 ?492次閱讀
    主站蜘蛛池模板: AV无码国产精品午夜A片麻豆| 菠萝菠萝蜜在线观看视频| 草草久久久无码国产专区全集观看| 高h超辣bl文| 精品熟女少妇AV免费观看| 欧美多人群p刺激交换电影| 无码一区二区在线欧洲| 在线视频av大全色久久| 国产69精品久久久熟女| 久久九九久精品国产尤物| 日韩欧美一区二区三区在线视频| 亚洲欧美成人| 成人国产一区| 久久视频这有精品63在线国产| 入禽太深在线观看免费高清| 依人青青青在线观看| 俄罗斯18xv在线观看| 久久香蕉国产免费天天| 视频一区二区三区蜜桃麻豆| 最近中文字幕免费高清MV视频6 | 妺妺窝人体色777777野大粗| 小777论坛| av影音先锋影院男人站| 激情丛林电影完整在线| 日本中文字幕伊人成中文字幕| 在线精品国精品国产不卡| 国产精品久人妻精品| 欧美乱妇日本无乱码特黄大片| 亚洲欧美日本久久综合网站| 古月娜下面好紧好爽| 嗯别插太快好深再深点| 一本之道加勒比在线观看| 国产成人精品三级在线| 暖暖视频免费观看高清完整版| 久久精品国产亚洲AV热无遮挡| 恋老视频 国产国佬| 男女高潮又爽又黄又无遮挡 | 好紧好湿太硬了我太爽了文字| 爽爽影院线观看免费| 亚洲国产亚综合在线区尤物| 亚洲一区在线播放|