硬件 (七) ARM 軟中斷, IMX6ULL 點燈

一、ARM 軟中斷(SVC):從用戶態到內核態的橋梁

軟中斷(SVC,Supervisor Call)是 ARM 處理器從 “非特權模式(如 User)” 進入 “特權模式(如 Supervisor)” 的核心機制,常用于系統調用、權限切換等場景。以下是基于 Keil 的軟中斷實現代碼與流程解析。

(一)匯編與 C 混合編程實現軟中斷

kile:

    area reset, readonly, codepreserve8code32entry; 異常向量表:定義各異常處理入口ldr pc, =_reset_handlerldr pc, =_undefine_handlerldr pc, =_svc_handlerldr pc, =_prefetch_abort_handlerldr pc, =_data_abort_handlerldr pc, =_reserved_handlerldr pc, =_irq_handlerldr pc, =_fiq_handler_undefine_handler; 未定義指令異常:死循環等待(示例)ldr pc, =_undefine_handler_svc_handler; 導入C語言實現的SVC處理函數import c_svc_handler; 保存現場:將R0-R12和LR壓入棧stmfd sp!, {r0-r12, lr}; 調用C函數處理SVCbl c_svc_handler; 恢復現場并返回(帶模式切換)ldmfd sp!, {r0-r12, pc}^  _prefetch_abort_handlerldr pc, =_prefetch_abort_handler_data_abort_handlerldr pc, =_data_abort_handler_reserved_handlerldr pc, =_reserved_handler_irq_handlerldr pc, =_irq_handler_fiq_handlerldr pc, =_fiq_handler_reset_handler; 設置棧指針(示例地址,需根據實際內存調整)ldr sp, =0x40001000; 修改CPSR,切換到SVC模式(特權模式)mrs r0, cpsrbic r0, r0, #0x1Forr r0, r0, #0x10msr cpsr_c, r0; 再次設置棧(為SVC模式分配棧空間)ldr sp, =0x40001000sub sp, sp, #1024; 導入main函數import main; 跳轉到mainb main_asm_fn; 導出函數,供C語言調用export _asm_fn; 觸發SVC軟中斷(傳遞參數7,實際可根據需求定義)svc #7	  ; 返回調用者bx lrfinished; 死循環(防止程序跑飛)b finishedend

main.c

// 聲明匯編函數_asm_fn
extern void _asm_fn(void);// 簡單延時函數
void delay(int n) 
{	while(n--);	
}// SVC中斷的C語言處理函數
void c_svc_handler(void) 
{// 這里可添加SVC的具體邏輯,示例中僅做延時delay(0x1000);
}int main(void) 
{while(1) {// 調用匯編函數,觸發SVC軟中斷_asm_fn();// 主循環延時delay(0xFFFFFF);}return 0;
}

(二)軟中斷核心流程解析

  1. 異常向量表:程序啟動時,先構建_reset_handler等異常入口的 “跳轉表”,確保異常發生時能精準進入對應處理邏輯。
  2. SVC 觸發_asm_fn中執行svc #7,主動觸發軟中斷,處理器自動從當前模式(如 User)切換到Supervisor 模式
  3. 現場保護與恢復_svc_handler中通過stmfd保存寄存器(R0-R12、LR),調用 C 函數處理后,再用ldmfd恢復現場并返回,保證程序執行的連續性。

二、IMX6ULL 入門:從環境搭建到 LED 點燈

IMX6ULL 是 NXP 的經典 Cortex-A7 架構芯片

(一)開發環境搭建:跨平臺工具鏈與環境準備

嵌入式開發需交叉編譯工具鏈(在 PC 上編譯,在芯片上運行),主流選擇是 GNU 工具鏈(arm-linux-gnueabihf-*)。

  • Windows 端:用 VSCode 編寫代碼(C / 匯編),借助插件提升編輯效率。
  • Linux 端:安裝 GNU 交叉工具鏈,負責編譯、鏈接、格式轉換,最終生成芯片可運行的二進制固件。

(二)引腳功能復用:理解 MUX 與 PAD

IMX6ULL 的引腳(PAD)可通過 **MUX(功能復用寄存器)** 配置為不同功能(如 GPIO、I2C、UART 等),這是外設控制的基礎。

以 LED 為例(假設 LED 接 GPIO1_IO03):

  • MUX 配置:通過IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03寄存器,選擇ALT5模式(對應 GPIO 功能)。
  • 電氣屬性配置:通過IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03寄存器,設置上拉 / 下拉、驅動能力等參數。

(三)LED 點燈:匯編代碼實現全流程

vscode

.global _start_start:; 異常向量表(同軟中斷示例邏輯,確保異常處理入口)ldr pc, =_reset_handlerldr pc, =_undefine_handlerldr pc, =_svc_handlerldr pc, =_prefetch_abort_handlerldr pc, =_data_abort_handlerldr pc, =_reserved_handlerldr pc, =_irq_handlerldr pc, =_fiq_handler_undefine_handler:ldr pc, =_undefine_handler_svc_handler:ldr pc, =_svc_handler_prefetch_abort_handler:ldr pc, =_prefetch_abort_handler_data_abort_handler:ldr pc, =_data_abort_handler_reserved_handler:ldr pc, =_reserved_handler_irq_handler:ldr pc, =_irq_handler_fiq_handler:ldr pc, =_fiq_handler_reset_handler:; 切換到IRQ模式(示例,實際可按需選擇)mrs r0, cpsrbic r0, r0, #0x1Forr r0, r0, #0x12  msr cpsr, r0; 設置IRQ模式棧指針ldr sp, =0x86000000; 切換到System模式(特權模式,方便后續操作)mrs r0, cpsrbic r0, r0, #0x1Forr r0, r0, #0x1F	msr cpsr, r0; 設置System模式棧指針ldr sp, =0x84000000	; 使能外設時鐘(IMX6ULL需先使能對應時鐘域)bl _enable_clocks; 初始化LEDbl _init_led; 點亮LEDbl _led_on; 死循環(保持LED亮)b finished_led_on:; 配置GPIO輸出(假設GPIO1_BASE為0x0209C000)ldr r0, =0x0209C000ldr r1, [r0]; 清除GPIO1_IO03位(假設低電平點亮LED,需根據硬件電路調整)bic r1, r1, #(1 << 3)str r1, [r0]; 返回bx lr_init_led:; 配置引腳復用為GPIO(MUX寄存器地址示例)ldr r0, =0x020E0068; 設置為ALT5模式(GPIO功能)mov r1, #0x05	str r1, [r0]; 配置電氣屬性(PAD寄存器地址示例)ldr r0, =0x020E02F4; 設置上拉、驅動能力等(0x10B0為示例值,需參考芯片手冊)ldr r1, =0x10B0  str r1, [r0]; 配置GPIO方向為輸出(GDIR寄存器地址示例)ldr r0, =0x0209C004ldr r1, [r0]; 設置GPIO1_IO03為輸出orr r1, r1, #(1 << 3)  str r1, [r0]; 返回bx lr_enable_clocks:; 使能GPIO等外設時鐘(地址需參考IMX6ULL手冊)ldr r0, =0x020C4068mov r1, #0xFFFFFFFFstr r1, [r0]ldr r0, =0x020C406Cstr r1, [r0]ldr r0, =0x020C4070str r1, [r0]ldr r0, =0x020C4074str r1, [r0]ldr r0, =0x020C4078str r1, [r0]ldr r0, =0x020C407Cstr r1, [r0]ldr r0, =0x020C4080str r1, [r0]	; 返回bx lrfinished:; 死循環b finished

(四)程序編譯與燒寫:GNU 工具鏈

1. 編譯步驟(Ubuntu 下為例)

假設代碼文件為start.S,執行以下命令:

  • 編譯為目標文件arm-linux-gnueabihf-gcc -c -g?start.S -o start.o
  • 鏈接為可執行文件arm-linux-gnueabihf-ld -Ttext 0x87800000 start.o -o start.elf
    0x87800000為程序運行地址,需與芯片啟動配置匹配)
  • 轉換為二進制鏡像arm-linux-gnueabihf-objcopy -O?binary -S -g start.elf start.bin
  • (可選)反匯編查看arm-linux-gnueabihf-objdump -D start.elf > start.dis
2. 燒寫步驟
  • 將燒寫工具(如imxdownload)和start.bin放入同一目錄。
  • 賦予工具執行權限:chmod +x imxdownload
  • 燒寫(假設 SD 卡為/dev/sdb):./imxdownload start.bin /dev/sdb

三、GNU 工具鏈:嵌入式開發的 “瑞士軍刀”

嵌入式開發依賴 GNU 工具鏈的四大核心工具,它們分工明確,支撐從 “源碼” 到 “可運行固件” 的全流程。

工具功能核心典型場景
gcc將 C/C++/ 匯編源碼編譯為匯編代碼,再生成目標文件(.o)源碼編譯的 “第一步”
ld將多個目標文件(.o)+ 庫文件,鏈接為可執行文件(.elf)解決符號依賴、地址分配
objcopy在不同目標文件格式間轉換(如 ELF→二進制.bin)生成芯片可直接運行的固件
objdump反匯編目標文件,查看匯編指令、符號表、段信息調試(看機器碼對應邏輯)、分析程序

總結

嵌入式開發的底層邏輯可歸納為:理解處理器架構(ARM 模式、異常、指令)→ 掌握外設控制(引腳復用、寄存器操作)→ 熟練工具鏈使用(編譯、鏈接、燒寫)。從軟中斷的 “權限切換”,到 IMX6ULL 點燈的 “外設控制”,每一步都是對底層原理的理解。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98637.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98637.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98637.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據結構與算法-樹和二叉樹-二叉樹的存儲結構(Binary Tree)

樹和二叉樹的內容比較多&#xff0c;分成兩次來發 4 樹和二叉樹&#xff08;Tree and Binary Tree&#xff09; 4.1 樹和二叉樹的定義 4.1.1 樹的定義 樹&#xff08;Tree&#xff09;是 n&#xff08;n>0&#xff09;個結點的有限集&#xff0c;它或為空樹&#xff08;…

CentOS7 Hive2.3.8 安裝圖文教程

一、 安裝MySQL 0.0&#xff09;查詢mariadb,有就去0.1&#xff09;&#xff0c;沒有就不管直接去1&#xff09; rpm -qa | grep mariadb0.1&#xff09;卸載mariadb rpm -e --nodeps 查詢出來的內容二、安裝MySQL 1.下載資源包 官網下載 MySQL官網下載地址:https://dev.m…

開發避坑指南(43):idea2025.1.3版本啟動springboot服務輸入jvm參數解決辦法

問題 最近裝了新版IDEA嘗嘗新特性&#xff0c;IntelliJ IDEA 2025.1.3&#xff0c;可是在運行springboot服務的時候&#xff0c;找了好久才找到輸入jvm啟動參數的地方。如上圖&#xff0c;不像舊版的IDEA&#xff0c;在Run/Debug Configurations->Configuration->Environ…

《sklearn機器學習——數據預處理》標準化或均值去除和方差縮放

數據集的標準化是scikit-learn中實現許多機器學習估計器的普遍要求&#xff1b;如果個別特征看起來或多或少不像標準正態分布數據&#xff1a;均值和單位方差為零的高斯分布&#xff0c;則它們的性能可能不好。 在實踐中&#xff0c;我們通常會忽略分布的形狀&#xff0c;而只是…

leedcode 算法刷題第三十一天

1049. 最后一塊石頭的重量 II 有一堆石頭&#xff0c;用整數數組 stones 表示。其中 stones[i] 表示第 i 塊石頭的重量。 每一回合&#xff0c;從中選出任意兩塊石頭&#xff0c;然后將它們一起粉碎。假設石頭的重量分別為 x 和 y&#xff0c;且 x < y。那么粉碎的可能結果…

圖神經網絡介紹

源自論文&#xff1a;Survey on Graph Neural Networks 圖神經網絡&#xff08;GNNs&#xff09;中的符號與定義詳解 本文使用了圖論和深度學習領域的標準符號體系&#xff0c;以確保對圖結構數據的描述清晰一致。以下是核心符號和定義的詳細說明&#xff1a; 一、基礎圖結構符…

測試報告:“問卷考試系統”項目

目錄 一、報告概述 &#xff08;一&#xff09;項目背景 &#xff08;二&#xff09;項目核心模塊與測試目的 1、項目核心模塊 2、測試目的 &#xff08;三&#xff09;測試環境 1、硬件環境 2、軟件環境 &#xff08;1&#xff09;操作系統 &#xff08;2&#xff0…

Linux筆記---網絡計算器

1. 網絡程序分層 我們說過&#xff0c;OSI7層模型十分完美&#xff0c;但是因特網實際上采用的是TCP/IP五層模型&#xff1a; 實際上&#xff0c;對比可以發現&#xff0c;TCP/IP模型實際上就是將OSI的前三層模型合并為了應用層。 這就提示我們&#xff0c;我們設計的應用程…

《智能網聯汽車交通仿真軟件可信度評估》團標啟動會圓滿舉辦

讓數據真正閉環的L4級自動駕駛仿真工具鏈&#xff0d;杭州千岑智能科技有限公司&#xff1a;RSim 近日&#xff0c;由中國仿真學會主辦、清華大學牽頭的《智能網聯汽車交通仿真軟件可信度評估》團體標準啟動會在北京成功舉行。杭州千岑科技有限公司作為智能網聯汽車測試驗證領域…

關于 MCU 芯片外圍電路的快速入門介紹

MCU&#xff08;微控制單元&#xff0c;Microcontroller Unit&#xff09;是嵌入式系統的“大腦”&#xff0c;但需通過外圍電路實現供電、信號輸入/ 輸出、通信、存儲等功能&#xff0c;才能構成完整的工作系統。外圍電路的設計直接決定 MCU 的穩定性、功能擴展性和適用場景&a…

Uniapp onLoad 和 onShow 區別

一、核心區別生命周期觸發時機執行次數參數獲取onLoad頁面首次創建時觸發僅1次支持獲取URL參數optionsonShow頁面每次顯示時觸發&#xff08;包括返回&#xff09;多次無法獲取URL參數二、實戰數據請求場景優先使用onLoad請求數據的場景&#xff1a;初始化數據當需要根據URL參數…

大模型預訓練評估指標

模型效果評測 關于 Language Modeling 的量化指標&#xff0c;較為普遍的有 [PPL]&#xff0c;[BPC]等,可以簡單理解為在生成結果和目標文本之間的 Cross Entropy Loss 上做了一些處理&#xff0c;這種方式可以用來評估模型對「語言模板」的擬合程度即給定一段話&#xff0c;預…

【Matlab】-- 機器學習項目 - 基于XGBoost算法的數據回歸預測

文章目錄 文章目錄01 內容概要02 部分代碼03 代碼解讀04 運行結果05 基于XGBoost算法的數據回歸預測源碼01 內容概要 XGBoost屬于集成學習中的Boosting方法&#xff0c;其基本思想是&#xff1a; 逐步構建多個弱學習器&#xff08;通常是CART決策樹&#xff09;&#xff0c;每…

Memory in LLM Agent

Memory in LLM Agent 1 為什么需要“記憶” —— 背景與動機 在構建 LLM Agent&#xff08;Large Language Model Agent&#xff0c;大語言模型驅動的智能體&#xff09;的過程中&#xff0c;“記憶”&#xff08;Memory&#xff09;是一個繞不開的核心問題。沒有記憶的 Agent…

三甲地市級醫院數據倉湖數智化建設路徑與編程工具選型研究(上)

摘要 本研究旨在探索三甲地市級醫院數據倉湖數智化建設的實施路徑與工具選型策略,以響應國家《"十四五"全民健康信息化規劃》中2025年醫療數據平臺聯通全覆蓋的政策要求,同時解決地市級醫院面臨的資源限制(年均信息化投入占總營收1.5%)、區域協同需求突出及多業…

25.9.10_CTF-reverse_RC4那些事兒

CTF-reverse_RC4那些事兒 0x00 RC4加密知識點 推薦看這位up主的視頻https://www.bilibili.com/video/BV1G64y1Y7p4/?spm_id_from333.1391.0.0&p2 簡單來說RC4算法包括兩部分KSA(利用Key生成S盒)和PRGA(利用S盒生成密鑰流): KSA: 初始化S&#xff08;一般是0-255&…

網絡編程(6)

【0】復習 Modbus&#xff1a;modbus tcp modbus rtu Modbus TCP: 特點&#xff1a;主從問答&#xff08;控制 采集信息&#xff09; 應用層協議&#xff08;基于TCP通信&#xff09;、默認端口502 組成&#xff1a;報文頭&#xff08;7 事物2 協議2 長度2 單元表示1&#xff…

技術文章大綱:AI繪畫—動漫角色生成賽

技術文章大綱&#xff1a;AI繪畫—動漫角色生成賽 背景與意義 動漫角色生成賽的興起與發展AI繪畫技術在動漫創作中的應用價值比賽對推動AI藝術創新的作用 技術核心&#xff1a;AI繪畫模型 主流模型介紹&#xff08;如Stable Diffusion、MidJourney、DALLE&#xff09;針對動…

Flink-新增 Kafka source 引發狀態丟失導致啟動失敗

背景 Flink Job 新增 kafka source 算子,從狀態保留并啟動后提示 org.apache.flink.util.StateMigrationException: The new state typeSerializer for operator state must not be incompatible,導致任務 Fail。 Source: task-kafka-source -> task-kafka-transform (1…

【系統架構設計(26)】系統可靠性分析與設計詳解:構建高可用軟件系統的核心技術

文章目錄一、本文知識覆蓋范圍1、概述2、知識體系概覽二、系統可靠性基礎概念1、可靠性與可用性的本質區別2、軟件可靠性與硬件可靠性的深度對比3、核心可靠性指標的業務價值三、系統架構可靠性模型1、串聯系統的可靠性挑戰2、并聯系統的高可靠性設計3、混合系統的復雜性管理四…