嵌入式 - ARM3

一、arm啟動C語言

1. 配置異常向量表

2. 實現了軟件中斷的部分

注:

? ? ? ? ldmfd sp!, {r0-r12, lr}? ? ? ? ? ? ? ? ==???????????????? ldmfd sp!, {r0-r12, pc}^???
bx lr? ? ?
? ? ? ?

左半部分:
繁瑣易理解的返回方式:
先彈出所有通用寄存器和lr? ? ? ? =>? ? ? ? 再用bx lr指令返回

右半部分:
高效簡潔的返回方式:
一句指令實現回復所有通用寄存器(r0-r12),將保存的lr直接彈入pc實現返回跳轉(pc),恢復了中斷發生時的處理器狀態(^ 實現 程序狀態寄存器cpsr 的恢復)

軟件中斷需要:
主函數中調用軟中斷 => 觸發函數接口 => 執行軟中斷處理 => 返回主函數?

3. 配置start與main.c的鏈接

異常向量表設置0x00 為復位,直接進入start部分

分段解析

1. 初始化supervisor模式棧

ldr sp, =0x40001000			// 初始化棧指針,復位后默認為supervisor模式

? ? ? ??在進入主函數操作前,需要對當前默認的supervisor模式設置一個有效的棧空間,確保能夠進行函數調用和臨時數據存儲
通過ldr命令將預先分配的地址(0x40001000)存入到棧指針

2. 聲明主函數

import main					// 聲明主函數

????????告知匯編器,符號main是在C語言文件中定義的,定義后可以調用

3. 切換至user模式

1. mrs,msr

手冊496

	mrs r0, cpsr				// 將當前狀態寄存器備份到r0中msr cpsr_c, r0              // 改寫后的值寫回cpsr的控制域,完成模式切換

mrs指令將整個cpsr的值備份到r0中

? ? ? ? MRS{cond} <Rd>, <PSR>

? ? ? ? mrs <目標寄存器>, <CPSR / SPSR>

msr指令將修改后的值寫回cpsr,完成CPU切換到user模式

? ? ? ? MSR{cond} <PSR>_<fields>, <Rm>

? ? ? ?msr? <CPSR / SPSR>_修改的部分, 源寄存器
<fields>:c:控制域,低8位包含模式位和中斷使能位
x:擴展域
s:狀態域,條件標志位NZCV
f:標志域,條件標志位NZCV

?

2. 工作模式配置
bic r0, r0, #(0x1F << 0)?? ?// 更改arm工作模式,手冊Label - ARM processor?// 低五位清零,準備更改模式
orr r0, r0, #(0x10 << 0)?? ?// 更改工作模式為10000,為user模式

arm工作模式:手冊Label - ARM processor

3. 響應中斷配置
bic r0, r0, #(1 << 7)

清除I位,確保在user模式下??開啟IRQ中斷??,否則user模式無法響應中斷

4. 初始化user模式下的棧指針

ldr sp, =0x40001000			// 初始化user模式下的棧指針
sub sp, sp, #1024			// 與spv模式的棧相隔一段距離

? ? ? ? 為即將運行的主函數設置獨立的棧空間
先與superviosr模式設置成同一個地址,在此基礎上位移一段字節防止相互覆蓋

5. 跳轉并調用執行main函數

b main						// 執行主函數

4. 配置main.c

1. 主函數內容

????????目前只實現完成軟中斷的跳轉

2. 軟中斷處理

? ? ? ? 可通過 .s 的軟中斷跳轉到軟中斷處理函數部分并成功返回

3. 函數聲明

? ? ? ? 除了主函數與軟中斷處理函數的聲明外,還需聲明在 .s 文件中的軟中斷觸發響應部分

5. 魔術棒設置

Target:設置ROM1地址
Linker:勾選使用設置的地址 “Use Memory Layout from Target Dialog”
Debug :取消勾選 “run to main()” ,使運行時從.s開始

二、安裝環境

1. visual studio code

ARM插件:Chinese(Simplified)
Arm Assembly

C語言插件:Back & Forth
C / C++
C / C++ Extension Pack
C / C++ Themes
CMake
CMake Tools
highlight - words
Makefile Tools

2. Ubuntu下的編譯器

確認版本? ?arm-linux-gnueabihf-gcc?-v

3. filezilla上傳文件

上傳步驟:文件 => 站點管理器 => 新站點

右側win本地站點,左側Ubuntu遠程站點,選擇對應文件夾,右鍵點擊上傳文件夾上傳

復習

1、arm匯編調用c語言函數以及c語言函數調用匯編編寫的函數,函數的參數和返回值如何處理?

1. 匯編調用C語言

? ? ? ?1.?參數:
前四個參數通過寄存器r0,r1, r2,r3傳遞
后續參數通過棧傳遞,通過壓棧出棧實現傳參
2. 返回值:
通過寄存器r0返回

2. C語言調用匯編

? ? ? ? 1. 參數
調用規則與 匯編調用C語言一致

? ? ? ? 2. 返回值
匯編函數直接讀取寄存器或棧位置
需保存被調用的寄存器(r0-r12,lr)否則會破壞原狀態

2、arm內核中有幾種異常,分別是什么,會使內核切換到那種工作模式

異常中斷含義工作模式
reset復位中斷supervisor
undefined未定義指令undifined
sortware軟件中斷supervisor
prefetch指令預取中止abort
data數據訪問中止abort
IRQ外部普通中斷請求IRQ
FIQ外部快速中斷請求FIQ

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

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

相關文章

如何通過標簽和分類提升知識復用效率

通過標簽和分類提升知識復用效率&#xff0c;其核心在于構建一個結構化與靈活性兼備的知識組織體系。這需要將分類的“確定性”與標簽的“多維性”進行有效結合&#xff0c;為知識的存儲與檢索建立清晰的“骨架”和豐富的“神經網絡”。具體實踐中&#xff0c;要求我們進行頂層…

ZYNQ PS讀寫PL BRAM

一、實驗室任務 本章的實驗任務是 PS 將數據寫入BRAM&#xff0c;然后從 BRAM 中讀出數據&#xff0c;并通過串口打印出來&#xff1b;與此同時&#xff0c;PL 從通過自定義ip核從BRAM中同樣讀出數據&#xff0c;并通過ILA 來觀察讀出的數據與串口打印的數據是否一致。這里是通…

LinuxC++項目開發日志——高并發內存池(5-page cache框架開發)

PageCachepage cache 設計邏輯一、PageCache 的核心定位&#xff1a;理解它與 CentralCache 的本質區別二、PageCache 的內存分配流程&#xff1a;從 “精確匹配” 到 “拆分適配”三、PageCache 的內存釋放流程&#xff1a;合并小 Span&#xff0c;解決內存碎片問題page cache…

Matplotlib:繪制你的第一張折線圖與散點圖

Matplotlib入門&#xff1a;繪制你的第一張折線圖與散點圖導語 歡迎來到 Matplotlib 的世界&#xff01;對于任何使用 Python 進行數據分析或機器學習的人來說&#xff0c;數據可視化都是一項至關重要的技能。Matplotlib 是 Python 中最流行、最基礎的可視化庫&#xff0c;它功…

MySQL保姆級安裝教程

MySQL 安裝詳細文檔&#xff0c;適用于 Windows、macOS 和 Linux 系統&#xff0c;包含了從下載到驗證安裝的完整步驟&#xff1a; 一、Windows 系統安裝 MySQL 1. 下載 MySQL 安裝包 訪問 MySQL 官方下載頁&#xff1a;https://dev.mysql.com/downloads/installer/選擇 “MySQ…

重塑你的大腦:從理解突觸到掌控人生

重塑你的大腦&#xff1a;從理解突觸到掌控人生你是否曾對自己的某些行為感到無力&#xff1f;明知應該早睡&#xff0c;卻總忍不住刷手機&#xff1b;下定決心要鍛煉&#xff0c;卻常常半途而廢。這些困擾我們的習慣&#xff0c;并非簡單的意志力問題&#xff0c;其根源深深植…

《C++進階之STL》【哈希表】

【哈希表】目錄前言------------概念介紹------------1. 什么是哈希&#xff1f;------------核心術語------------一、哈希函數1. 哈希函數的核心特點是什么&#xff1f;2. 哈希函數的設計目標是什么&#xff1f;3. 常見的哈希函數有哪些&#xff1f;直接定址法除法散列法乘法…

機器學習-模型驗證

驗證泛化誤差 在一個數據集上估計誤差&#xff0c;數據集只能使用一次驗證數據集&#xff1a;可以被使用多次 基本是訓練數據集中的一部分 當使用“test”時&#xff0c;大多數時候指的是驗證數據集 生成驗證數據集方法 1、數據隨機分入訓練集或驗證集 總是隨機選n%的數據作為驗…

Qt中自定義控件的三種實現方式

Qt中自定義控件的三種實現方式 在 Qt 應用開發中&#xff0c;標準控件往往無法滿足所有需求。自定義控件允許開發者創建具有特定功能和外觀的控件&#xff0c;提高代碼復用性和界面一致性。Qt 提供了多種方式來開發自定義控件&#xff0c;從簡單的組合現有控件到完全自定義繪制…

少兒舞蹈小程序(14)在線預約

目錄1 創建數據模型2 搭建預約按鈕3 搭建表單4 搭建管理功能整體效果總結目前我們的首頁已經開發完畢了&#xff0c;包含輪播圖、機構介紹、校區展示、作品與活動展示功能。家長在小程序了解了機構的基本情況之后&#xff0c;下一步就是參加試聽&#xff0c;在線下真實體驗一下…

TDengine 數據寫入詳細用戶手冊

TDengine 數據寫入用戶手冊 概述 TDengine 提供了多種靈活的數據寫入方式&#xff0c;以滿足不同應用場景的需求。本手冊將以智能電表場景為例&#xff0c;向初學者詳細介紹各種數據寫入方法的使用。 智能電表場景設定 假設我們需要為智能電表系統建立數據庫&#xff1a; …

PTA 天梯賽 7-43:字符串關鍵字的散列映射

【題目來源】 https://pintia.cn/problem-sets/15/exam/problems/type/7?problemSetProblemId890 【題目描述】 給定一系列由大寫英文字母組成的字符串關鍵字和素數 P&#xff0c;用移位法定義的散列函數 H(Key) 將關鍵字 Key 中的最后 3 個字符映射為整數&#xff0c;每個字…

Python核心技術開發指南(065)——with語句

版權聲明 本文原創作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl with語句定義 with語句是Python中用于簡化資源管理的語法結構,通過上下文管理器(實現__enter__()和__exit__()方法的對象)確保資源在使用完畢后被正確釋放,無論代碼塊是否發生異常。其核心作…

從基礎到高級:一文快速認識MySQL UPDATE 語句

在數據庫日常運維與開發中&#xff0c;數據更新是與數據查詢同等重要的核心操作。MySQL 的 UPDATE 語句憑借其靈活的語法結構和強大的功能&#xff0c;能夠滿足從簡單字段修改到復雜關聯表更新的各類需求。然而&#xff0c;若使用不當&#xff0c;不僅可能導致數據一致性問題&a…

材料基因組計劃(MGI)入門:高通量計算與數據管理最佳實踐

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 摘要 材料基因組計劃&#xff08;Materials Genome Ini…

Vision Transformer (ViT) :Transformer在computer vision領域的應用(一)

在圖像領域,CNN卷積神經網絡結構已經成為了標配,所有的模型都是基于CNN來構造的。 而在NLP領域,自從Transformer橫空出世之后,基本上也統治了NLP的各個領域。 基于Transformer的強大,一些論文的工作都是將Transformer也應用到CV領域,在這篇論文:AN IMAGE IS WORTH 16X1…

自動駕駛中的傳感器技術45——Radar(6)

本文詳細介紹4D雷達相關解決方案&#xff0c;4D雷達關鍵詞&#xff1a;4D Imaging Radar 1、4D雷達特點 圖1 4D雷達 vs 3D雷達圖2 4D雷達虛擬通道數量不斷增加圖3 4D雷達 vs 3D雷達 vs 攝像頭和激光雷達圖4 毫米波雷達在不同駕駛等級下的應用需求Ref&#xff1a;https://pdf.d…

瀏覽器調試工具詳解

個人簡介 &#x1f440;個人主頁&#xff1a; 前端雜貨鋪 &#x1f64b;?♂?學習方向&#xff1a; 主攻前端方向&#xff0c;正逐漸往全干發展 &#x1f4c3;個人狀態&#xff1a; 研發工程師&#xff0c;現效力于中國工業軟件事業 &#x1f680;人生格言&#xff1a; 積跬步…

代碼審計-PHP專題原生開發SQL注入1day分析構造正則搜索語句執行監控功能定位

挖掘技巧&#xff1a; -語句監控-數據庫SQL監控排查可利用語句定向分析 -功能追蹤-功能點文件SQL執行代碼函數調用鏈追蹤 -正則搜索-(update|select|insert|delete|).*?where.* 如何快速的在多個文件代碼里面找脆弱&#xff1a; 1、看文件路徑 2、看代碼里面的變量&#…

Linux中:調試器gdb/cgdb的使用

引言在追尋光的路上不斷前行&#xff0c;詳細介紹Linux下gdb/cgdb的使用。一、準備? 程序的發布方式有兩種&#xff0c;默認是 debug 模式和 release 模式。Linux gcc/g編譯出來的二進制程序默認是release模式? 要使用gdb調試&#xff0c;必須在源代碼生成?進制程序的時候加…