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編譯代碼。
?
?
本示例所用的最小系統板原理圖:
?
?
?
?
?
Delay.h文件放在INC文件夾下即可。
不同于啟動文件外,本節要講的是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關鍵中,本節主要用到的是 “嵌入式匯編/ 內聯匯編”功能。
?
?
將其延時1us及2us的操作用匯編指令nop來實現
?
讓程序全速運行,查看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混合编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32 进阶教程 5 - 内联函数
- 下一篇: STM32 进阶教程 8 - 位带操作