日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32 进阶教程 6 -  汇编与C混合编程

發布時間:2025/4/5 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32 进阶教程 6 -  汇编与C混合编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在嵌入式開發過程中,有時候為了追求代碼性能與效率不得不采用匯編語言來編寫代碼,但是匯編代碼在閱讀時表現不如C語言友好,本節給大家介紹一種新的方法,關鍵代碼用匯編語言時行實現,然后用C語言時行接封裝,用C語言與匯編語言混合編程的方式,在實現代碼性能與運行效率的同時,又較方便閱讀與理解決代碼邏輯。

本節將以STM32 MCU平臺作為展示,教大家如何實現編碼與C混合編程,本節實現方式是在《STM32 進階教程 4 -? 軟件實現高精度延時 2》基礎上將一些C程序代碼用匯編代碼實現,最終的效果與《STM32 進階教程 4 -? 軟件實現高精度延時 2》節一樣,學會了stm32本節內容,在51,AVR,DSP等硬件平臺同樣適用。

示例詳解

基于硬件平臺: STM32F10C8T6最小系統板, MCU 的型號是?STM32F103c8t6, 使用stm32cubemx 工具自動產生的配置工程,使用KEIL5編譯代碼。

?

?

本示例所用的最小系統板原理圖:

?

  • 關于CUBEMX工具及KEIL工具的操作將不再細講,如果還有不熟悉的可以查看之前的教程文檔。下面直接介紹工程配置:
  • ?

    ?

  • 系統時鐘樹
  • 定時器配置
  • 引腳配置
  • 中斷配置(保持默認)
  • ?

    ?

  • 工程代碼
  • 將事先準備好的delay.c和delay.h文件加到工程中,
  • Delay.h文件放在INC文件夾下即可。

  • 其實在Keil mdk 環境中STM32的很多底層代碼的實現都是匯編都言,比如那個經典的啟動文件“startup_stm32fxxxx.s”當然這個文只是定義了一些中斷函數常量,堆和棧大小以及Reset_Handler的實現等。
  • 不同于啟動文件外,本節要講的是C語言中包含匯碼代碼,這就需要用到關鍵字“__ASM” 或“__asm”關于__asm關鍵字的用法有如下說明:

    ?

    __asm

    這個關鍵字將信息從編譯器傳遞給ARM匯編程序armasm。這個關鍵字的確切作用取決于它的使用。

    ?

    嵌入式匯編/ 內聯匯編:

    關鍵字__asm可以將內聯程序集合并到函數中。例如:

    int add(int i, int j)

    {

    ??? int res;

    ??? __asm

    ??? {

    ??????? ADD?? res, i, j

    ??? }

    ??? return res;

    }

    指定匯編標簽:

    關鍵字__asm可以為C程序變量指定程匯編變量名。例如::

    int count __asm__("count_v1"); // 在匯編代碼中導出的變量count_v1,而不是count

    ?

    命名寄存器變量:

    關鍵字__asm可以聲明一個命名的寄存器變量。例如:

    register int foo __asm("r0");? //? 變量foo 實際上就是寄存器r0. 類似的操作在”Cmsis_armcc.h”中較多見。

    ?

    關于__asm關鍵中,本節主要用到的是 “嵌入式匯編/ 內聯匯編”功能。

    ?

    ?

  • 修改Delay.C中delay_us函數的部分實現:
  • 將其延時1us及2us的操作用匯編指令nop來實現

    ?

  • 在main.c 中加入如下圖所示代碼
  • 編譯工程,下載程序看效果,首先仿真運行代碼,可以發現變量C = 1+2 = 3 結果正確,用匯編指令成功實現加法:
  • 讓程序全速運行,查看PC13引腳上的波形,

    進入軟件仿真可以看到Delay_us中函數1us及2us的函數對應匯編代碼如下:

    通過上面的實例,我們已基本學會基于keil MDK平臺的stm32 中C程序中嵌入匯編的實現方法,那么如么在匯編程序中讞用C函數接口呢,這個其實更簡單,可以參看stm32的官方啟動文件“startup_stm32fxxxx.s” 它就是一個典型的匯編程序調用C函數的實現。最后更多關于__asm的說明可以查看KEIL mdk的幫助文檔。:

    ?

    OK,本期實驗完成!下期見!同時如果大家有什么疑問或是有想了解的其它內容,也歡迎大家留言!!最后喜歡這個公眾號的同學們記得加關注了,會有不定期技術干貨推出!!

    文中源碼資料下載,在公眾號里給十三發消息:

    下載|STM32進階教程 6

    ?

    關注十三公眾號

    ?

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的STM32 进阶教程 6 -  汇编与C混合编程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。