色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美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在线一区二区| 一二三四在线观看高清电视剧| 久久精品观看| 饥渴难耐的浪荡艳妇在线观看| 久久se精品一区二区国产| 无码人妻精品一区二区蜜桃在线看| 亚洲精品国产专区91在线| 曰本老头同性xxxxx| yw193龙物免费官网在线| 国产在线精品亚洲二品区| 久久免费精品一区二区| 色欲久久综合亚洲精品蜜桃| 亚洲日本欧美日韩高观看| china chinese中国人玩| 国产又粗又黄又爽的大片| 午夜亚洲WWW湿好大| 97人人添人人澡人人澡人人澡| 成人国产三级在线播放| 精品熟女少妇AV免费观看| 人人模人人干| 一区视频免费观看| 久久亚洲精品专区蓝色区| 印度12 13free| 擼擼擼麻豆密臀AV| a级精品九九九大片免费看| 久久黄色大片| 99爱在线观看| 善良的女房东味道2在线观看| 国产剧情在线精品视频不卡| 青草伊人久久| 依恋影院在线观看| 毛片亚洲毛片亚洲毛片| 妖精视频免费看| 国产永不无码精品AV永久| 一二三四中文字幕在线看| 男总裁憋尿PLAY灌尿BL| 中文字幕无线手机在线| 好吊射视频988gaocom| 特级毛片全部免费播放免下载| 拔萝卜视频免费看高清| 外女思春台湾三级|