Cortex-M3精通之路-1(匯編啟動文件)

原創 云深之無跡 2023-05-27 21:11

源碼分析寫了一堆,但是每次都分析不完就鴿了,氣死我了。也思考了很久究竟寫一些怎么樣的文章。

我想通了,要寫一個合集,精通Cortex-M3!

精通的優點就不用說了:

懂?

基本上你加上幾個實戰的項目就穩了。

其次就是廣泛性,M3會了,M0難嗎?M0+呢?不言而喻了。我準備從一個工程入手,一行一行的代碼,多方權威資料查詢寫出這個合集,首先這篇是匯編的啟動文件,要求對讀者的要求是較高的,建議細細閱讀。

精通ARM Cortex-M意味著對ARM Cortex-M內核及相關微控制器有深入全面的理解和高超的開發技能。具體需要:

1. 深入理解ARM Cortex-M內核架構,包括核心模塊如內存保護單元、中斷控制器、定時器等,以及指令系統和編程模型。

2. 熟悉各系列ARM Cortex-M內核如M0/M3/M4/M7的具體特征與差異,尤其是外設配置與編程方法。

3.掌握主流MCU廠商基于ARMCortex-M內核的微控制器產品,如STM32、Kinetis、EFM32等的詳細特性和使用方法。

4. 精通CMSIS標準,熟練使用其提供的寄存器訪問函數、外設驅動、啟動文件、調試工具等,快速開發MCU應用程序。

5. 具有豐富的開發經驗,能夠熟練完成MCU資源配置、時鐘選擇、中斷服務程序編寫、外設驅動開發等,并對各種復雜問題進行快速解決。

6. 具備一定的創新能力,能基于對內核和MCU的深入理解進行功能優化與改進,開發出技術水平更高的程序。

ARM官網找的圖

這個就是M3內核的特性

一個和別的內核的對比圖

Corstone-101,官網看見的

我真服了,全網找不到這個開發板啥樣子??

Corstone-101是Arm推出的一款入門級的MCU開發板,目的是幫助工程師輕松學習 Arm Cortex-M系列MCU。

Corstone-101開發板的主要特性:-

- MCU:采用Arm Cortex-M3內核的STM32F103RB芯片

-集成CMSIS-DAP debug probe,支持無縫調試- 板載各類外設和接口:LCD顯示屏、LED、按鍵、USB轉串口、MicroSD卡槽等

- Arm Mbed OS預裝,可直接進行MCU軟件開發

-免費開源的課程教材,包括從零開始快速入門stm32的開發環境搭建,到深入學習stm32的定時器、串口、DMA等。

-低成本,入門友好,非常適合Cortex-M內核和MCU開發入門Corstone-101的主要特點是:

1)集成度高:MCU、Debug probe、豐富外設、Mbed OS軟件平臺均集成在一塊開發板上,使用非常方便。

2)教學優勢:提供極為詳盡的中文視頻教程和文檔,可以零基礎快速學習stm32和MCU開發。

3) 低成本:Corstone-101開發板定價非常低,大約250元人民幣,非常適合入門體驗。

4) Mbed OS支持:基于Mbed OS,可以使用其豐富的庫函數包以及在線編譯環境快速開發應用程序,降低學習門檻。

250這個價格,我還是覺得不夠低成本哈。

倒是和我說的差不多

本來今天就是要說這個CMSIS的,但是這個已經是抽象的高層了,所以先寫匯編。

CMSIS是ARM Cortex-M系列內核的設備抽象層,全稱為Cortex Microcontroller Software Interface Standard。它定義了一套標準的軟件接口,用于開發基于ARM Cortex-M內核的MCU設備的固件。主要包含:

- 設備寄存器及外設訪問函數庫:提供標準的API訪問MCU內核寄存器和外設,屏蔽不同芯片的寄存器差異。

- 啟動文件和鏈接腳本:提供標準的MCU啟動和內存布局文件,用于引導程序運行和鏈接。

- 中斷服務例程:提供標準的中斷服務例程入口定義,用于編寫設備特定的中斷服務程序。

- 調試寄存器訪問宏:標準宏定義訪問用于MCU調試的寄存器。

- 標準外設驅動庫:為常用外設提供跨MCU通用的驅動庫,如GPIO、USART等。

CMSIS的主要目的是降低基于Cortex-M內核MCU的開發復雜度,屏蔽芯片差異,實現跨MCU的代碼可重用性。

開發者可以專注于應用程序本身的開發,而不需過多關注具體MCU的配置細節。目前,主流的MCU廠商如ST、NXP、TI等都提供了基于CMSIS標準的固件庫和例程,使用這些CMSIS標準的固件庫可以輕松配置和訪問MCU資源,開發出高質量的程序。

CMSIS本質上是一個標準的固件庫和軟件接口。它提供:

1. 標準的寄存器外設訪問函數庫,相當于一個硬件抽象層,屏蔽不同MCU的寄存器差異,實現統一的訪問接口。

2. 標準的啟動文件、鏈接腳本和外設驅動,支持MCU啟動、內存配置和常用外設的使用。

3. 標準的中斷服務例程入口定義和調試宏定義。

4. 其他工具和示例程序等。

所以,CMSIS為MCU開發提供了一系列標準化和統一的固件基礎設施,開發者可以直接基于CMSIS開發應用程序,而不需過多關注MCU本身的配置細節。這大大降低了基于ARM Cortex-M內核MCU開發的難度,實現了跨MCU的代碼可重用性。但是,CMSIS本身并不是一個完整的MCU固件庫。它僅定義了一系列標準,提供基本的訪問接口和工具,但具體的 periperal drivers(外設驅動)和board support package(板級支持包)還需要芯片廠商及開發板廠商基于CMSIS標準開發和提供。所以,CMSIS給MCU開發帶來的主要價值在于:

1. 標準化:定義一套行業標準的軟件接口和規范。

2. 抽象化:提供硬件抽象層,屏蔽MCU差異,實現統一編程模型。

3. 可重用性:基于標準接口開發的代碼可以重用于不同的MCU,降低開發成本。

ARM Cortex-M3內核適合使用CMSIS版本3.0及以上版本。CMSIS最初發布于2008年,當時的版本為1.0,主要支持ARM Cortex-M0和M3內核。隨著CMSIS標準的不斷發展和Cortex-M內核系列的增加,CMSIS也在發布新版本以支持更多內核和增加更多功能。主要版本發布情況如下:

- CMSIS 1.0:2008年,支持Cortex-M0和M3內核。

- CMSIS 2.0:2010年,增加對Cortex-M4內核的支持。- CMSIS 3.0:2012年,統一設備抽象層,增加debug和RTOS功能。

- CMSIS 3.1:2013年,添加CMSIS-DAP接口和新增Cortex-M7內核支持。- CMSIS 3.2:2014年,新增配置 wizard 工具和ARM Compiler 6支持。

- CMSIS 5.0:2016年,重構代碼結構,支持基于CMSIS-Core的Middleware組件。

- CMSIS 5.1:2017年,新增CMSIS-Driver概念,擴充外設驅動支持。所以,對于ARM Cortex-M3內核,CMSIS 3.0版本及以后版本均有很好的支持,提供設備抽象層、debug工具、標準外設驅動等,可以很好地滿足基于Cortex-M3內核MCU開發的需求。

我們來學學32里面的CMSIS里面的啟動文件

startup_stm32f10x_cl.s是STM32F10x系列MCU的啟動文件,由ARM官方提供。啟動文件主要完成以下工作:

1. 設置堆棧指針(MSP),為中斷服務程序和中斷向量表預留堆棧空間。

2.檢查復位源,并清除相應的復位標志。

3.設置中斷向量表偏移地址,指向__Vectors段。

4.如果需要,設置中斷向量表在RAM中的拷貝。

5. 如果需要,設置FPU寄存器為默認值。

6. 調用SystemInit()函數初始化系統時鐘和外設。

7.調用__main()函數進入C代碼。啟動文件一般由匯編語言編寫,需要做的工作主要是CPU及外設的最低層初始化配置,為后續C代碼的運行做好準備。

看這個代碼

Stack_Size?EQU?0x00000400

這行定義了堆棧的大小為0x400字節,即1024字節。

AREA STACK, NOINIT, READWRITE, ALIGN=3

這行指令定義了一個名為STACK的無初值段,屬性為可讀寫,并且地址對齊到4字節。這個段用于定義堆棧空間。

Stack_Mem SPACE Stack_Size

這行在STACK段內分配了0x400字節的存儲空間,作為MCU的堆棧空間。

__initial_sp

這行將當前位置的值定義為__initial_sp標號,該標號的值為堆棧底地址,即堆棧指針SP的初始值。

所以,這段匯編代碼完成了以下工作:

1. 定義了1024字節的堆棧存儲空間Stack_Mem。

2.使用__initial_sp標號來指向這個堆棧空間的底部,這就是SP寄存器的復位值。

3.啟動文件會將MSP(主堆棧指針)初始化為__initial_sp的值,這樣堆棧空間Stack_Mem就關聯到主堆棧,為中斷服務程序的執行做好準備。

4.該堆棧空間也會在復位后由C代碼繼續使用,以存儲函數調用的返回信息等。

該段代碼定義的堆棧空間Stack_Mem所在的區域是MCU的內存空間。

MCU的內存空間一般可以分為以下幾個區域:

1.FLASH:程序存儲區域,用于存儲程序代碼。

2.SRAM:靜態RAM,用于數據存儲和堆棧空間。

3.HEAP:動態內存分配區域,一般也在SRAM中,用于malloc/free管理。

4.STACK:函數調用堆棧空間,用于存儲函數調用的返回地址、參數等信息,一般在SRAM頂部。

所以,對于Startup文件來說,在SRAM中預留一段空間作為堆棧區域,這個區域就是用來作為中斷服務程序和系統調用等的堆棧空間,用于保存CPU運行現場等信息,這個區域就是我們這段代碼定義的Stack_Mem。

具體來說:

AREA STACK, NOINIT, READWRITE, ALIGN=3

這行定義了一個名為STACK的段,該段位于SRAM中,用于定義堆棧空間。

Stack_Mem SPACE Stack_Size

這行在該STACK段內分配了Stack_Size字節的存儲空間,作為MCU的堆棧空間。

__initial_sp 該標號的值為這個Stack_Mem的底部地址,即堆棧指針SP的初值。所以,總結來說:

1.該段代碼定義的堆棧空間Stack_Mem位于MCU的內存空間SRAM中。

2.它為中斷服務程序和函數調用預留了一片存儲區域。

3.這個存儲區域的底部地址被__initial_sp標號指向,用于初始化SP寄存器的值。

4.然后SP寄存器(堆棧指針)在程序運行過程中會根據推棧和出棧操作在這個區域中上移和下移。

堆棧底地址指的是堆棧空間的最低可用地址,它表示堆棧區域中最先分配的空間,用于存放最早推入堆棧的數據。

對于Startup文件來說,它使用__initial_sp標號來標記堆棧底地址,這就是SP寄存器(堆棧指針)的初始值。

具體代碼如下:

AREA STACK, NOINIT, READWRITE, ALIGN=3

Stack_Mem SPACE Stack_Size __initial_sp

這段代碼:

1. 定義了大小為Stack_Size的堆棧空間Stack_Mem。

2.__initial_sp標號的值指向Stack_Mem的最低地址,這就是堆棧底地址。3.啟動文件會將SP寄存器初始化為__initial_sp的值,使其指向堆棧底,以便后續的推棧操作。

4.SP寄存器的值會隨著推棧和出棧操作在Stack_Mem區域內增大和減小。所以,對這個堆棧空間來說:

1.堆棧底地址由__initial_sp標號的值決定,它指向Stack_Mem的最低可用地址。

2.SP寄存器初值為__initial_sp,會從堆棧底開始向高地址生長,來保存推入堆棧的數據。

3.出棧操作會使SP寄存器的值減小,釋放堆棧頂的數據,直到恢復到堆棧底。

4.堆棧空間的使用是從底至頂,底部空間存放最早的數據。所以,總結來說,堆棧底地址就是堆棧空間中最先被使用的那部分地址空間,它標記了堆棧區域的起始,為堆棧的推棧和出棧操作提供基礎。

堆!

這段代碼定義了MCU的堆空間以及相關標號。

具體分析下

Heap_Size EQU 0x00000200

該行定義了堆大小為512字節(0x200)

AREA HEAP, NOINIT, READWRITE, ALIGN=3

該行指令定義一個名為HEAP的無初值段,具有讀寫屬性,地址按4字節對齊。這個段用于定義堆空間。

__heap_base 該標號的值為HEAP段的起始地址,表示堆底地址。

Heap_Mem SPACE Heap_Size

該行在HEAP段中分配了0x200字節的存儲空間作為MCU的堆空間。

__heap_limit

該標號的值為HEAP段結束地址,表示堆頂地址。

所以,這段匯編代碼完成了以下工作:

1. 定義了512字節的堆存儲空間Heap_Mem。

2. 使用__heap_base標號來標記這個堆空間的起始地址,表示堆底。

3. 使用__heap_limit標號來標記這個堆空間的結束地址,表示堆頂。

4. 該堆空間在程序運行過程中由malloc/free管理動態內存的分配與釋放。5. C語言中可以通過extern聲明__heap_base和__heap_limit,以獲取堆信息。

6. PRESERVE8指令用于強制8字節對齊。

THUMB指令指定該代碼區使用Thumb-2指令。

該段代碼定義的堆空間為MCU動態內存管理提供了存儲區域與邊界標記。通過__heap_base和__heap_limit,C代碼可以方便獲取到這個堆空間的信息,為malloc/free調用服務。所以,這段匯編代碼對MCU的動態內存分配起到很關鍵的作業。

這里說下如何訪問棧空間。

對于啟動文件定義的堆棧空間Stack_Mem來說,如果要在C代碼中訪問和使用這個區域,有以下幾種方法:

1. 使用全局變量在Startup文件中定義:

Stack_Mem SPACE Stack_Size __initial_sp

然后在C代碼中使用全局變量聲明:

這樣stack_ptr變量就指向了堆棧頂,可以通過stack_ptr訪問和修改堆棧空間中的數據。

2. 基址偏移Startup文件中Label Stack_Mem的地址為base_addr,則在C代碼中可以通過:

unsigned int stack_ptr = (unsigned int )(base_addr + Stack_Size -

4);

來得到堆棧頂指針,以訪問數據。需要知道Stack_Mem的絕對地址base_addr。

3. 定義指針數組在C代碼中聲明指針數:

unsigned int Stack[Stack_Size];然后stack_ptr = &Stack[Sta

ck_Size - 1];

這種方法需要在鏈接過程中正確設置該指針數組與Startup文件中Stack_Mem區域的關聯。

4. 借助寄存器因為Startup文件已經將SP寄存器初始化為__initial_sp,也就是Stack_Mem底部,所以我們可以通過SP寄存器讀寫這個區域:

使用inline匯編直接通過SP寄存器讀寫堆棧空間。

好了,再說堆空間的作用:

堆空間主要用于MCU的動態內存分配,它為malloc()和free()函數調用提供內存池。具體來說,堆空間在MCU中的作用有:

1. 為動態內存申請提供存儲空間:在程序運行時,可以通過malloc()函數向堆空間申請任意大小的內存塊,以保存數據或創建對象。

2. 釋放不再使用的內存:通過free()函數可以將堆空間中的內存塊釋放,以便下次繼續使用。

3. 管理內存碎片:堆空間可以由malloc()函數自動管理內存碎片,試圖利用所有的內存空間。

4. 實現內存動態擴展:如果堆空間初始分配的空間不足,還可以在運行時通過sbrk()函數向操作系統申請更多內存空間。

5. C++程序的new和delete操作也依賴于堆空間,用于創建和銷毀對象。

所以,簡單來說,堆空間為動態內存分配提供內存池,它最大的作用在于:

1. 滿足運行時變化的內存需求,程序不確定對象到底占用多少內存空間,只能在運行時進行內存分配。

2. 實現堆內存的重復分配與釋放,節省內存空間,避免內存浪費。

3. C++程序可以在堆上創建對象,并使用new和delete進行內存管理。總之,堆空間為程序運行時的動態內存分配需求提供了支持,它的管理主要依賴malloc、free和new、delete函數。

堆棧的區別是什么?

堆空間和棧空間都是MCU內存空間的一部分,但二者有以下主要區別:

1. 生長方向不同:

堆空間:向高地址生長,使用malloc()函數申請內存,按需動態分配。

棧空間:向低地址生長,大小在編譯時確定,自動分配。

2. 申請方式不同:堆空間:使用malloc()和free()函數顯式申請和釋放內存。棧空間: FUN調用時自動分配和釋放,不需要顯式控制。

3. 生命周期不同:

堆空間:使用完畢須手動釋放,生命周期不確定,動態決定。

棧空間:函數調用結束自動釋放,生命周期與函數調用一致,編譯時決定。

4. 使用目的不同:

堆空間:用于動態內存分配,對象創建。

棧空間:用于存儲函數參數、局部變量、返回地址等,實現函數調用機制。

5. 空間大小不同:

堆空間:大小動態變化,按需分配。

棧空間:大小在編譯時確定,固定分配。

所以,總結來說:

堆空間為動態內存分配和對象創建提供能力,大小和生命周期不定,需要手工管理。

棧空間為函數調用機制提供自動分配和釋放的臨時存儲空間,大小和生命周期在編譯時決定,無需手工控制。

我直接回馬槍,堆空間如何訪問呢?

1. 使用全局變量
在啟動文件中定義:

?

然后在C代碼中使用全局變量聲明:


這樣heap_ptr變量就指向了堆底,通過它可以訪問堆空間中的數據。
2. 基址偏移
啟動文件中Label __heap_base和__heap_limit的地址分別為base_addr和limit_addr,則在C代碼中可以通過:

來訪問堆空間數據,offset為任意偏移量。需要知道__heap_base和__heap_limit的絕對地址。
3. 定義指針數組
在C代碼中聲明指針數組:

然后heap_ptr = Heap;
這種方法需要在鏈接過程中正確設置該指針數組與啟動文件中Heap_Mem區域的關聯。
4. 借助malloc()函數
因為啟動文件已經定義了__heap_base和__heap_limit來標識堆空間的范圍,所以我們可以直接使用malloc()函數向這個區域申請內存:


malloc()函數會在Heap_Mem區域分配size大小的內存,并返回其起始地址,通過ptr訪問這片內存。

接下來看這一段

這段代碼定義了STM32的矢量表。

矢量表包含了中斷服務程序的入口地址,以及系統使用的其他處理程序的入口地址。它位于地址0x00000000,并在復位后被映射到這個位置。所以,這段代碼完成的主要工作有:

1. 定義了名為RESET的只讀數據段,該段位置是0x00000000。

2. EXPORT指令導出了__Vectors、__Vectors_End和__Vectors_Size標號,以方便其他文件使用。

3. __Vectors標號指向矢量表的起始地址。__Vectors_End和__Vectors_Size分別用于標識矢量表的結束地址和大小。

4. 表起始地址存儲初始堆棧指針SP的值(__initial_sp標號)。

5. 接下來定義了各種異常和中斷處理程序的入口地址:

Reset_Handler:復位中斷服務程序

NMI_Handler:NMI中斷服務程序

HardFault_Handler:硬件故障中斷服務程序

......

SysTick_Handler:SysTick中斷服務程序

6. 一些入口保留為0,用于未來擴展。

所以,這個矢量表完成了以下工作:

1. 定義了各種異常和中斷處理程序的入口地址,這些入口地址指向對應中斷服務程序。

2. 矢量表位于地址0x00000000,并在MCU復位后被映射到這個位置。

3. 初始SP寄存器的值由矢量表的第一個字存儲。

4. 中斷發生時,MCU會根據中斷類型在矢量表中找到對應的入口地址,然后跳轉到此地址執行中斷服務程序。矢量表是MCU中斷機制的基礎,它為異常和中斷提供入口和服務程序。所以,這個矢量表定義對MCU的中斷配置和服務起到了基礎作用。

矢量表在MCU的內存空間中保存。它以數組的形式保存,每個數組元素存儲一個函數入口地址。

具體來說:

1. 這個矢量表定義在啟動文件中的RESET數據段中,該數據段位于內存地址0x00000000處。

2. __Vectors標號指向這個矢量表的數組起始地址,__Vectors_End標號指向數組結束地址。

3. 數組每個元素大小為4字節(32位MCU),用于存儲一個函數入口地址。

4. 數組第一個元素存儲了初始SP值,接下來的元素存儲各種異常和中斷處理程序的入口地址。

5. 當某個中斷發生時,MCU會計算出中斷類型對應的數組下標,然后跳轉到該下標元素所指向的入口地址執行中斷服務程序。

6. 這個數組實際上定義在編譯器產生的啟動文件匯編代碼中。然后通過鏈接器與其他文件連接,最終在MCU的內存空間布局中實現布局。

所以,總結來說:

1. 這個矢量表以數組的形式在MCU內存中實現,數組每個元素存儲一個入口地址。

2. 數組第一個元素存儲SP初值,其他元素存儲異常和中斷服務程序的入口地址。

3. 該數組位于地址0x00000000,在MCU上電復位后被映射到該位置。

4. 中斷發生時,通過中斷類型計算數組下標,獲取中斷服務程序入口地址。

5. 該數組最終通過鏈接過程存放在MCU內存的正確位置,并在程序運行時被使用。這種數組的形式便于通過索引快速查找對應的入口地址,實現MCU的異常和中斷機制。所以,矢量表采用這種數組結構實際上加快了中斷響應速度,提高了系統實時性。

下面還有一段,其實和上面一樣,都是地址而已

接下來看這段

所有的單片機,電腦,都會說復位這個事情。那它為什么如此的重要?因為我們為了可控,所有的初始化我們知道,運行的規律知道,所以復位是為了可控而已。

復位中斷服務程序(Reset Handler)之所以存在,主要是為了實現MCU的初始化配置和C語言程序的啟動。

具體來說,Reset Handler的作用有:

1. 完成MCU的初始化配置:設置時鐘,配置GPIO等,為程序正確運行做準備。這一般由啟動文件中定義的SystemInit函數完成。

2. 跳轉到C語言程序的入口函數__main:C語言程序的執行是從__main函數開始的,所以Reset Handler需要跳轉到__main函數。

3. 設置初始堆棧指針SP的值:在MCU上電復位后,SP寄存器的值是未知的,需要設置為一個正確的值,以便進行后續的堆棧操作。這個值通常存儲在矢量表的第一個元素中。

4. 作為MCU的最高優先級中斷服務程序:當MCU上電或復位時,首先會執行Reset Handler來完成系統的初始化和C語言程序的啟動。

5. 如果用戶定義了自己的Reset Handler,它將覆蓋啟動文件中的定義,用戶程序將從用戶定義的Reset Handler開始執行。

所以,簡單來說,Reset Handler之所以存在,主要是為了:

1. 完成MCU的初始化配置,為正確運行提供基礎。

2. 跳轉到C語言程序的入口,啟動程序執行。

3. 設置SP寄存器的初始值,為使用堆棧做準備。

4. 作為上電復位中斷服務程序,首先被執行。

5. 可以被用戶定義的Reset Handler覆蓋。如果沒有Reset Handler,MCU將啟動在未初始化的狀態,C語言程序也無法得到執行,SP的值是未知的,這會導致程序運行錯誤或無法運行。所以,Reset Handler對MCU的啟動起到了基礎作用,它為C程序的執行提供了啟動條件和基本環境,是MCU上電必不可少的初始化代碼。

來,這次有了前置知識再看代碼:

代碼定義了復位中斷服務程序Reset_Handler。具體分析如下:

__Vectors_Size EQU __Vectors_End - __Vectors

這行指令計算了矢量表的大小,用于其他文件使用。

AREA |.text|, CODE, READONLY

這行指令定義了一個只讀的代碼段,用于存放異常和中斷服務程序。

Reset_Handler PROC

這行指令定義了Reset_Handler的過程,表示復位中斷服務程序的起始。

EXPORT Reset_Handler [WEAK]

此行導出Reset_Handler過程,以便其他文件使用,并指定該過程為弱定義,意味著如果用戶定義了自己的Reset_Handler過程,那么編譯器會使用用戶定義的過程,而忽略此處的定義。

看這個

IMPORT?SystemInit

此行導入SystemInit函數,表示Reset_Handler過程調用該函數。

IMPORT __main

此行導入C語言程序的入口函數__main。

LDR R0, =SystemInit

此指令將SystemInit函數地址加載到R0寄存器。

BLX R0

此指令調用SystemInit函數。

LDR R0, =__main

此指令將__main函數地址加載到R0寄存器。

BX R0

此指令跳轉到__main函數,執行C語言程序。

ENDP

此行指令表示Reset_Handler過程的結束。

所以,這個Reset_Handler過程完成了以下工作:

1. 調用SystemInit函數完成系統初始化。

2. 跳轉到__main函數,執行C語言程序。

3. 作為復位中斷的中斷服務程序,在MCU上電復位后首先被執行。

4. 如果用戶定義了自己的Reset_Handler,那么由于該過程被定義為弱定義,用戶定義會覆蓋此處定義,被執行。該過程為C語言程序的執行提供了啟動入口,完成了MCU的初始化配置.

接下來的代碼很多的一樣,拿兩個看

這段代碼定義了NMI中斷服務程序NMI_Handler和硬件故障中斷服務程序HardFault_Handler。

NMI_Handler PROC

此行定義NMI_Handler過程,表示NMI中斷服務程序的起始。

EXPORT NMI_Handler [WEAK]

此行導出NMI_Handler過程,指定為弱定義,意味著如果用戶定義了自己的NMI_Handler過程,編譯器會使用用戶定義的過程,忽略此處定義。

B . 此指令是一個空操作,不執行任何動作。

ENDP

此行表示NMI_Handler過程的結束。

HardFault_Handler\PROC

此行定義HardFault_Handler過程,表示硬件故障中斷服務程序的起始。EXPORT HardFault_Handler [WEAK]

此行導出HardFault_Handler過程,指定為弱定義,意味著如果用戶定義了自己的HardFault_Handler過程,編譯器會使用用戶定義的過程,忽略此處定義。

B . 此指令是一個空操作,不執行任何動作。

ENDP 此行表示HardFault_Handler過程的結束。

所以,這兩個中斷服務程序定義完成了:

1. 定義了對應的中斷服務程序入口,但程序體為空。

2. 將這兩個過程定義為弱定義,意味著如果用戶定義了自己的服務程序,編譯器會使用用戶定義的過程。

3. 以空操作結束了這兩個過程。

之所以這兩個過程定義為空,主要是考慮到:

1. 出于兼容性考慮,啟動文件需要定義所有標準的異常與中斷入口,但具體處理由用戶決定是否定義。

2. 對于一些使用不太頻繁或處理比較復雜的中斷,用戶可能按需選擇是否定義自己的服務程序。

3. 定義為空的中斷服務程序不會對程序產生任何影響,保證定義后的兼容性。

所以,這兩個定義主要是為了實現異常與中斷入口的完整定義,但具體處理交由用戶根據需要選擇是否定義,如果未定義則默認為空操作。

今日最后的代碼,我覺得全網我是最全的啟動代碼解析

這段代碼主要用于定義堆棧的初始化。具體分析如下:

IF ?:DEF:__MICROLIB

此行條件指令檢查__MICROLIB宏是否被定義。如果定義,執行IF內語句,否則執行ELSE內語句。

EXPORT __initial_sp

此行導出__initial_sp符號,用于初始化SP寄存器。

EXPORT __heap_base

此行導出__heap_base符號,用于標識堆起始地址。

EXPORT __heap_limit

此行導出__heap_limit符號,用于標識堆結束地址。

IMPORT __use_two_region_memory

此行導入__use_two_region_memory符號,用于檢查是否使用兩片內存區域。

__user_initial_stackheap 此符號用于標識初始化堆棧的過程。

LDR R0, = Heap_Mem 此指令將堆起始地址加載到R0寄存器。

這幾行指令完成堆起始地址,堆結束地址,棧起始地址以及棧結束地址的加載與設置。

BX LR此指令用于返回,結束初始化堆棧的過程。

ALIGN此行用于4字節對齊。

ENDIF 此行表示IF語句的結束。

END 此行表示文件的結束。

所以,這段代碼的主要工作是:

1. 如果定義了__MICROLIB宏,則直接導出__initial_sp等符號,否則執行初始化堆棧的過程。

2. __user_initial_stackheap過程用于根據傳入的Heap_Mem和Stack_Mem參數設置堆棧的參數。

3. 該過程判斷是否使用兩片區域設置堆棧參數,如果使用則設置兩片區域的起始結束地址。

4. 這段代碼的目的是在啟動文件中設置初始化堆棧所需要的參數與地址,為C語言程序的執行提供堆棧環境。這段代碼的定義為用戶編寫的C語言程序提供了基本的堆棧初始化與設置,完成了與編譯器相關的參數定義,實現了C語言程序運行所需要的內存環境配置。

我再總結一下:

1. 定義了RESET只讀數據段,用于存放矢量表,該段位于地址0x00000000,在上電復位后被映射到該地址。

2. 定義并導出了__Vectors、__Vectors_End和__Vectors_Size等符號,方便其他文件使用矢量表。

3. 矢量表首地址存儲初始SP值,其他地址存儲各種異常和中斷服務程序入口。

4. 定義了復位中斷服務程序Reset_Handler,它調用SystemInit完成系統初始化,然后跳轉到__main函數執行C語言程序。

5. 定義了部分中斷服務程序如NMI_Handler和HardFault_Handler,但僅定義了入口,程序體為空,這主要考慮程序的兼容性與擴展性。

6. 根據__MICROLIB的定義情況,選擇是否執行__user_initial_stackheap過程來設置堆棧參數,為C語言程序執行提供堆棧環境。

7. 定義并導出了__initial_sp、__heap_base和__heap_limit等符號,用于標識SP、堆和棧的起始和結束地址。

8. 使用ALIGN指令實現了部分字節對齊,提高了程序的兼容性和效率。

9. 文件最后通過END指令實現了文件的結束。

所以,這個啟動文件完成的主要工作是:

1. 完成MCU的復位向量表定義,為各種中斷提供入口與服務。

2. 定義復位中斷服務程序,完成系統初始化和C語言程序啟動。

3. 定義部分中斷服務程序入口,但程序體為空,由用戶決定是否具體定義。

4. 根據情況設置堆棧參數,為C語言程序執行提供環境。

5. 定義各種導出符號,方便其他文件使用。

6. 使用ALIGN實現部分字節對齊,提高效率。7. 標識文件的結束。

頻繁的說這個對齊,我補個對齊的作用:

字節對齊指的是存儲單元的地址要遵循某種邊界限制,即地址的低幾位要為0。

它的主要作用有:

1. 提高訪問效率:當數據的地址是某種邊界的整數倍時,CPU可以以更大寬度的訪問單元去訪問數據,這樣可以減少CPU讀取數據的次數,提高訪問效率。2. 減少存儲空間浪費:如果不對齊,在訪問更大寬度的數據類型時,CPU需要訪問的數據可能超出實際需要,這會占用額外的存儲空間并影響總線帶寬,對齊可以避免這種浪費。

3. 方便數據的轉換:在某些特定的地址處訪問的數據可以直接轉換為其他數據類型,這可以提高處理效率,如果地址未對齊,這種直接轉換就無法實現。

總的來說,字節對齊主要帶來三個方面的好處:

1. 提高訪問和處理數據的效率。

2. 避免存儲空間的浪費。

3. 方便數據之間的直接轉換。

而對齊的基本實現方法是:

1. 指定對齊類型:如2字節對齊、4字節對齊等,這通常由編譯器來指定,可以通過定義宏的方式實現。

2. 數據聲明時通過對齊類型進行限定:如int __align(4) num;表示num為4字節對齊。

3. 在某些關鍵數據聲明前通過專用指令進行手動對齊:如ALIGN 4對下一數據進行4字節對齊。

4. 編譯器會自動選擇合適的對齊方式來對數據進行對齊,通常為最大數據類型的長度,這樣可以發揮對齊帶來的所有好處。

這幾個文件詳細的作用我之后的文章來說

core_cm3.c是CMSIS標準定義的Cortex-M3內核芯片支持包,它提供了以下內容:

1. MCU寄存器結構體定義:SCB, SysTick, NVIC等內核寄存器的結構體定義。

2. 系統時鐘配置函數:CMU_ClkInit()、CMU_ClockSelectConfig()等。

3. 系統滴答配置函數:SysTick_Config()用于配置SysTick定時器的溢出中斷周期。

4. 中斷配置函數:NVIC_EnableIRQ()、NVIC_DisableIRQ()、NVIC_SetPriority()等,用于配置中斷優先級與使能狀態。

5. 系統SoftReset和HardReset函數:用于軟復位和硬復位MCU。

6. 內部Flash配置函數:用于配置Flash預取指緩存、等待信號以及訪問權限等。

7. 函數調用棧配置函數:用于配置PSP堆棧指針和MSP主堆棧指針。

8. 系統滴答定時器SysTick的中斷服務函數SysTick_Handler()。

9. 設備向量表__Vectors定義,里面包含SysTick和外設中斷服務程序入口,以及各類異常入口。

10. 用戶可根據需要實現的空操作清零函數:Default_Handler()。

11. MPU配置函數:用于配置內存保護單元,設定不同存儲區域的訪問權限。 所以,core_cm3.c文件為基于Cortex-M3內核的MCU提供了系統級配置與接口,包括時鐘、中斷、內存管理等方方面面。用戶可以直接調用這些函數接口來配置MCU,也可以根據需要修改或擴充。這個文件遵循CMSIS標準,具有很高的通用性,主要目的是降低不同MCU的移植difficulty,加速嵌入式工程師的開發工作。所以,它是開發基于ARM Cortex-M3內核MCU的重要基石。

stm32f10x.h是ST公司為STM32F10x系列MCU提供的頂層頭文件,它包含以下內容:

1. 對標準庫的引用,如stdint.h、stdbool.h等。

2. 對CMSIS標準的引用,引入CMSIS定義的一些數據類型、寄存器定義和函數原型。

3. MCU型號選擇,根據具體的芯片型號選擇正確的定義。

4. 外設時鐘使能宏定義,方便開啟或關閉外設時鐘。

5. 寄存器定義,定義MCU所有的內核寄存器和外設寄存器結構體。

6. 中斷編號定義,定義所有的中斷源所對應的值。

7. 位帶操作宏定義,提供對寄存器位的設置、清除以及翻轉等操作。

8. FLASH和OTP操作函數,提供FLASH讀、寫、擦除以及OTP讀寫的函數原型。

9. 復位和時鐘控制寄存器地址的定義以及函數原型。

10. GPIO通用IO口操作函數原型定義。

11. 中斷和事件管理函數原型定義,NVIC相關操作函數。

12. 其他外設(串口、SPI、I2C、ADC等)配置函數和外設特有的一些定義。所以,stm32f10x.h作為STM32F10x系列MCU的頂層頭文件,它包含了影響MCU所有外設和內核的內容,包括但不限于:寄存器定義、中斷定義、位帶操作、復位和時鐘配置、GPIO配置、串口配置等等。開發人員可以直接include這個頭文件,就可以使用里面定義的東西,非常方便。

system_stm32f10x.c文件主要包含STM32F10x系列MCU的系統時鐘配置函數。系統時鐘配置主要完成以下工作:

1. 根據外部晶振的頻率,配置PLL時鐘進行倍頻,得到MCU內核時鐘和AHB/APB總線時鐘。

2. 配置HSE(高速外部時鐘)作為系統時鐘,或者作為PLL的時鐘源。

3. 配置LSE(低速外部時鐘)作為RTC的時鐘源。

4. 選擇不同的預分頻因子,以滿足系統時鐘等于內核時鐘的要求。

5. 配置各總線時鐘AHB, APB1和APB2的預分頻因子。

6. 根據配置的總線時鐘頻率,配置外設的時鐘。

7. 根據CPU工作頻率,設置Flash訪問時間 FlashLatency。

所以,system_stm32f10x.c文件主要通過調用stm32f10x_clk.c和stm32f10x_rcc.c等文件里的函數,來配置MCU的整個時鐘系統,包括選擇PLL時鐘源、PLL倍頻系數、AHB/APB總線分頻系數以及外設時鐘使能等。這個文件實現了ClockConfiguration()函數,該函數會在MCU啟動時被startup_stm32f10x_xx.s的SystemInit()調用,從而完成MCU系統時鐘的初始化配置。

https://developer.arm.com/Processors/Cortex-M3
https://github.com/ARM-software/CMSIS-Drive

評論
  • 樓宇自控里的“巴別塔”一棟智慧樓宇、一個產業園區里,暖通空調運行著廠商私有協議,照明系統遵循專屬通信標準,變配電、門禁安防各成體系——設備間數據壁壘森嚴,上位平臺對接全靠定制化 “翻譯” 開發,不僅成本高企,交付周期也難以管控。這就是樓宇自控行業多年的痛點:協議林立、封閉林立。而破局的鑰匙,早在30多年前就已經寫好了——BACnet。作為ASHRAE制定的樓宇自控國際標準協議,BACnet是如今全球樓宇自控系統(BAS)互聯互通的“通用語言”。新風機、冷源群控、變配電、照明、門禁,凡是需要被樓宇
    飛凌嵌入式 2026-08-10 09:26 129瀏覽
  • 在物聯網從“萬物互聯”邁向“萬物智聯”的進程中,LTE Cat.1憑借其在速率、成本與網絡覆蓋之間的完美平衡,正成為中低速物聯網市場的絕對主力。隨著2G/3G網絡的逐步退網以及新國標對終端設備智能化、定位功能的強制要求,Cat.1模組迎來了爆發式的增長窗口。在這一關鍵節點,基于華為海思Hi2131芯片設計的LTE Cat.1模組,憑借其在能效、射頻、架構及物理規格上的底層創新,成功打破了“高性能必高功耗”的傳統魔咒,為行業提供了極具競爭力的連接最優解。核心技術優勢:重塑Cat.1能效與連接標桿海
    用戶1778981989717 2026-08-05 21:04 198瀏覽
  • 文:杜杰編輯:侯煜當地時間7月28日,美國特朗普政府落地最新科技封鎖政策,美國聯邦通信委員會(FCC)正式更新《受管制清單》,新增兩大類設備——境外生產的先進機器人設備、境外生產的聯網電力逆變器。FCC在官方情況說明書中明確,該類境外制造產品,“會對美國國家安全或美國民眾的人身安全構成無法承受的風險”。本次新規設置明確豁免機制:經美國國防部(DoW)、電力逆變器品類經美國國土安全部(DHS)審核并授予“有條件批準”,認定對應設備品類不存在重大安全風險,即可獲得準入豁免。同時政策嚴格執行新老劃斷原
    華爾街科技眼 2026-08-03 21:28 358瀏覽
  •        很多人只見過封裝在SMD外殼里的小尺寸晶振,卻不知道一顆2016、1612甚至1210封裝的微型石英晶振,從一塊巴掌大的石英原礦,到最終能穩定起振的成品,要經過十幾道精密工序。它內部的石英晶片厚度最薄不到20微米,比普通A4紙的1/5還薄,整個生產過程里哪怕0.1微米的誤差,都會直接廢掉整批產品,這也是小尺寸晶振過去長期依賴進口,國內廠商花了十幾年才啃下量產硬骨頭的核心原因。1. 原石定向切割:0.01度的角度誤差都不能有小尺寸晶振的第一步,
    TKD泰晶科技 2026-08-07 08:43 495瀏覽
  • 做藍牙音箱的工程師大概都碰過這個局面。產品要連手機放歌,要本地播開機提示音和按鍵音,還要接 App 做配網和狀態上報。三件事拆開,早先的常規做法是音頻藍牙一顆料、數傳藍牙一顆料、本地播放再掛一顆小 MCU 加一片 Flash。板子越畫越大,BOM 越算越貴,待機電流和固件工作量也跟著漲。WT2605C 出來以后,這套需求可以集成到一顆芯片,就是 WT2605C-32N,該芯片采用QFN32 封裝,4×4 毫米,把音頻藍牙、BLE 數傳和 MP3 本地播放三樣全包了。對藍牙音箱來說,最實在的好處就
    唯創知音語音芯片 2026-08-06 15:14 343瀏覽
  •                                                                        
    廣州鐵金剛 2026-08-06 17:44 206339瀏覽
  • 摘要東莞市恒創連接器有限公司(HCHGCONN)是位于廣東東莞的連接器源頭制造工廠,專注于連接器國產替代、小間距大電流連接器、線對板連接器、線對線連接器、板對板連接器、電源連接器及定制連接器開發。公司面向工業自動化、新能源儲能、BMS、汽車電子、AI服務器、GPU供電、通信設備、醫療設備和智能家居等場景,提供從產品選型、替代評估、樣品驗證到批量交付的一站式連接方案。恒創可支持 Molex、TE Connectivity、JST、Hirose、Samtec 等國際品牌部分系列的國產替代評估。常見替
    HC003 2026-08-07 10:14 96瀏覽
  • 產品使用18V供電,配套4串鋰離子電池,需要設計一個充電器。因為輸入18V,電池最高 16.8V,壓差僅 1.2V。因為壓差太小。使用開關型的充電控制芯片不穩定。嘗試自行設計一個。整體采用分立三極管 + TL431架構,分4個功能單元:使能控制回路、限流環路、TL431 精密恒壓反饋環路、PNP 功率管主功率輸出回路;實現完整鋰電池充電邏輯。使能控制回路按鍵按下:5V 電壓經 R12 (2kΩ) 送入 NPN 管 Q3 基極,Q3 飽和導通,對地拉低 R1、R2 組成的分壓控制節點電位;該節點直
    southcreek 2026-08-07 13:45 437瀏覽
  • 一、方案簡介在Buildroot構建的嵌入式Linux系統中部署Flutter應用,主流有兩套成熟的開源方案,分別適配不同的顯示場景與開發需求:方案一:flutter-elinux(Sony開源方案)由索尼官方維護的嵌入式Linux Flutter工具鏈,既支持DRM/GBM直接渲染,也兼容Wayland、X11等多種顯示后端,場景適配性更廣。方案二:flutter-pi(輕量級嵌入器)一款輕量級Flutter引擎宿主程序,僅基于底層DRM/GBM接口實現渲染,無需依賴桌面環境,資源占用更低,更
    飛凌嵌入式 2026-08-07 09:34 97瀏覽
  • 讓微弱脈沖信號更清晰——鎖相放大器集成Boxcar平均器在脈沖激光、泵浦-探測、時間分辨光譜、飛行時間質譜等實驗中,真正需要測量的信號往往只出現在一個很短的時間窗口內,卻被淹沒在遠大于它的噪聲和背景之中。 針對這類穩定重復的微弱脈沖與瞬態信號,賽恩科儀為OE2052雙通道數字鎖相放大器帶來全新的Boxcar Averager功能升級:在鎖相檢測之外,進一步提供從周期波形觀察、門控測量到多周期平均的完整數字Boxcar測量鏈路。 Boxcar平均器,如何從噪聲中“截取”目標信號?Boxcar平均器
    SSI_賽恩科儀 2026-08-07 15:49 7240瀏覽
  • 做電池供電攝像頭、可視門鈴、戶外安防的同學應該都踩過這個坑:攝像頭要拍,ISP、sensor、無線模塊全得開著,整機電流動輒幾百 mA。一節 18650 撐不了幾天,用戶投訴“怎么又沒電了”。有人會說:加個 PIR 人體紅外不就行了?問題是 PIR 怕熱、怕寵物、怕隔著亞克力/玻璃殼,而且只能感知“有溫差的人體移動”,靈敏度飄忽。真正省電的思路應該是:讓攝像頭平時徹底睡死,只有“前面有人/有動靜”時才被一鍵喚醒——而負責這個“看門”角色的,最合適的是一顆低功耗雷達。一、為什么是雷達,而不是 PI
    唯創知音語音芯片 2026-08-07 14:44 109瀏覽
  • 導語在現代高速數字電路設計中,信號的完整性已不僅是理想波形推演,而是一場與物理非理想特性正面博弈的工程實踐。濾波器芯片作為凈化傳輸鏈路的關鍵屏障,其核心挑戰在于:能否有效識別并濾除那些隱匿在電平跳變過程中的亞納秒級瞬態脈沖干擾,這類干擾持續極短,卻足以在高速鏈路中引發誤觸發。然而,傳統函數發生器受限于采樣率與邊沿速率,根本無法忠實復現如此狹窄且陡峭的異常波形。針對此困境,德思特TS-AWG7000系列任意波形發生器以17 GS/s采樣率與50 ps原生邊沿速度,為瞬態脈沖提供精細刻畫,配合SPG
    德思特測試測量 2026-08-05 14:06 5瀏覽
我要評論
0
點擊右上角,分享到朋友圈 我知道啦
請使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 银魂op阴天| 十七岁的韩剧免费观看直播| 类似3d肉蒲团的电影| 总统夫人的夜晚在线观看全集 | 暴躁老妈国语免费看第三季| 灰姑娘的玻璃手机插曲| 花满楼与陆小凤| 韩剧三个出轨的女人剧情解析| 金银梅5一10日语| 我和我的家乡免费版播放| 看电影电视剧好网站最新电影电视剧 | 美国电影《小辣椒3》| 魔法坏女巫2未删减| 美国电影炸天小姐| 名字打架| 荃加福禄寿粤语| 《密会》| 美式禁忌-3| 慈禧秘密生活 国语| 姐妹牙医全集免费看| 孙静雅快播| 吸血鬼日记第四季字幕| 二十一世纪爱情指南| 我知道我爱你免费观看| 《大战凯丽》观看| 沉默的证人| 红豆女之恋| 杰西简的电影在线播放| 欲火狂蜜| 一人之下之锈铁免费观看| 17·3电影免费播放高清| 星汉灿烂电视剧全部剧集| 暖暖 在线观看 免费| 荒岛女儿国电影在线播放| 聊斋3众女聚之欢| 《人在囧途》| 黑白配中文版在线观看| 灵异事件怪谈| 大风杀在线观看完整版免费| 本郷爱电影高清免费观看| 无尽动漫在线观看完整版| 杏林春暖在线无删减版视频| 向往的生活5完整版免费西瓜| 玉米锦蛇有毒吗| 麻豆《修车艳遇》在线| 满清十大酷刑2凌迟处死| 《法国空乘6》| 暗夜情报员| 满江红电影张艺谋免费观看? | 私人航空法国电影完整版在线观看| 遇见波莉| 布鲁克读大学完整版| 《与我同眠》电影| 特殊游泳教练免费看| 断魂小丑3正片免费观看| 美人依旧电影| 行尸走肉第三季第三集| 3d肉蒲团女演员| 念念不忘短剧| 恋爱恐惧症| 西游降魔篇粤语| 种马3| 进击的巨人最终章| 出差与部长同房希岛爱里在线电影 | 玉蒲心经| 都市剧集在线电视剧免费观看| 《快递员的待遇》在线 | 女教授隐藏的魅力| 未知| 怨妇2电影免费中文字幕看完整版| 香火免费| 法国版《少女感》完整版| 高清《十一》电影| 意大利赛仑真藏版| 义姐不是不良妈妈免费看| 熟男要结婚| 西西里的美丽传说 迅雷下载| 凯.帕克 电影大合集在线观看 | 菲律宾电影维修工人工的艳遇| 雪中悍刀行第二部32集在线观看| 全境封锁电影完整| 刻薄新娘| 火遮眼电影| 高清战旗如画未删减| 《入室暴行3被蹂躏》韩国电影在线观 | 木下凛凛子免费观看平台| 瑞士军刀男 下载| 高清《战旗如画》电视剧 | 爱的涟漪电视剧| 独立日 电影| 《棘手狂情》电影| 美丽的他| 大南迁全集在线观看| 性暴行| 八角笼中免费观看全集| 儿子媳妇中字头| 《overflower》动漫第1季免费观看全集动| 野花日本HD免费完整版高清版7| 甄嬛传电视剧免费版全集在线| 日剧《和讨厌的前任》中字| 打开腿让我尝尝你的味道是什么歌| 大宋少年志1免费观看| 酒店1-6集免费观看| 迪克牛仔新歌| 京城小二| 漂亮妈妈7字汉字| 印度电视剧新娘国语版全部| 黑社会之龙城岁月| 激战丛林1995版洛克 | 爱你所以离开你| 日剧渣男前任求复合| 我为聊狂| 明星大侦探第三季| 昆仑神宫| 《有翡》在线观看免费完整版| 方世玉2| 电视剧外姓兄弟| 变异编年史好看吗| 《年轻女教师2》在线播放| 渗透全集| 小凤新婚下集免费观看视频播放| 《青年医生》全集观看| 电影时间停止器在线观看完整版| 牢笼中的妖精| 中国达人秀街舞卓君| 禁忌4年转一| 浪漫刺客免费全集完整版| 东北往事之黑道风云20年21集| 特殊的房产销售3| 涪陵在线论坛| 中国家庭第二部全集| 台湾师生恋《补课》电影是什么电影 | 千王之王1991国语版全集| 动感之星 妖精 全集| 杯弓蛇影| 地铁迷情| 女飞行员2满天星免费观看| 完美有多美| 瑜伽学院 电影| 《和讨厌的部长出差旅》 | 美容院特殊待遇免费看| 盒子里的猫| 美国爸爸需要播种| 风之诺言| 聊斋iii| 《花子vs倔强驱魔师》第二季免费观看| 威尔史密斯最新电影| 经济学家华生| 哇嘎嘎在线观看完整版免费| 庙街豪情| 熊出没之逆转时空大电影| 法国电影《军事不当行为》在线观看 | 狂怒沙暴国语免费观看2023国语| 《熟睡被义子侵犯电影高清| 公主恋人cg| 《战狼6免费看》日韩| 韩国电影妈妈的女儿| 法国超人麦乐迪在线观看| 男子被关押1349天后无罪释放| 高清恶魔搬进来了| 《医生:特殊的治疗》2| 谍海计中计结局| 凤凰的巫女| 王国第一季在线观看| 《军事不当行为》免费观看| 奥巴马白宫记者晚宴| 王李丹妮演的修理工电视剧| 鬼吹灯 黄皮子坟| 扶着腰坐好深不要| 朝花若锦电视剧免费观看| 反黑路人甲粤语在线观看| 渔夫荒野台湾版免费观看| 人口普查2021公布结果| 一愁愁愁电视在线观看免费| 高清直到黎明未删减| 97自拍| 少女がおしっこをする| 法航空姐2019电影在线观看| 檀至白露| 玉女心经3阴阳和合剧情介绍 | 金星秀胡歌| 打开腿让我尝尝你的味道是什么歌 | 欲望保姆电影完整版看| 三年连续剧全集免费观看| 女保险公司销售员8手机在线观看| 封神榜之武王伐纣全集| 制暴 电影包贝尔| 盛唐风流电影免费观看在线播放| 心动在线电影网| ADN-698女教师在线播放| 婚外迷情未删减完整| 全职猎人第二部| 薄冰电视剧免费观看| 《高压监狱3》伦理| 龙棺古墓电影免费观看| 《女教师》6在线观看| 浪漫女家教在线播放全集免费观看中| 太平年电视剧免费观看| 插曲的痛30集全播放免费下载| 奥运开幕式回放| 无名天使电视剧国语版免费观看| 私人女性监狱在线| 白日梦与她| 高清《英雄》在线观看完整版 | 《四大美人杨贵妃》高清| 险恶的绣感完整版| 《机械师6》在线观看高清免费 | 睫毛膏2中文版色大师| 《出轨同学会2》| 《夏至未至》| shameless第三季免费观看| 高压监狱法国在线观看完整免费高清原声奔跑吧 | 千金丫鬟电视剧在线观看完整版| 《私人诊所》| 银魂123| 萍聚歌谱| xl司令第一季动漫在线观看免| 爱情睡醒了21| 黑暗森林满天星版美国在线| 《心灵法医》电视剧| 恶灵骑士2在线看| 妈妈爱上儿子同学电影完整版| 唐禹哲电视剧| 超级教师3免费观看电视剧下载 | 清算电影完整版免费 | 《法国空乘5》在线观看| 学战都市asterisk第二季| 里面也好痛第二季| 杜拉拉之似水年华| 黑暗荣耀电视剧| 头文字d电影粤语| 电影《在丈夫面前被劫匪欺负》电影 | 被砍死柯基的女主人发声| 日子老妈子BB| 我愿意国语版电视剧| 空调维修工人的艳遇在线观看全集 | 电视剧九河入海| 菠萝菠萝蜜电影| 螺丝钉动画片| 幸运库克百度影音| 比思特区东方美人| 邪王溺宠短剧全集| 龙年手抄报简单又好看| 台南县| 王艺迪晋级澳门冠军赛8强 | 楼上女邻居电视剧全集| 警中警2免费观看全集| 我的三个母亲全集| 恶作剧之吻第一部优酷| 满天星电影在线| 繁花似锦电视剧免费观看全集高清 | 妈妈的学生中字ID木鱼天| 星战前传| 成龙历险记5| LX司令第一季动漫免费观看| 《妻子的浪漫旅行2026》| 高清世外| 银河奥特曼剧场版| 战狼6欧式少女免费播放全部| 筐出未来| 幸福生活万年长 电视剧| 17种幻想电影在线完整观看免费| 人世间 纪录片| 熊出没·伴我“熊芯”免费| 速度与激情10完整版免费| 韩国伦理片想要爸爸的种子在线观看| 吴郡四姓| 一夜情人| 美姊妹牙医在线完整播放电影| 尸咒 在线观看| 一帘幽梦大结局| 忍者一时| 电影《贝拉1980》在线观看| 美国大选 直播| 高清《血疫》电影| 女销售| 黑衣警探国语| 黄家驹歌曲| 权力的游戏第1季| 《拳击手2满天星版》| 少林七十二绝技| 我们与驻在先生的700日战争| 巜生殖按摩1无删减版电影 | 黑社会之龙城岁月| 里面也好好爱第5集免费观看| 人犬兽人100集全部| 五福临门电视剧免费观看全集高清 | 女保险公司推销员4| 烈火军校电视剧免费观看| 刀锋战士百度影音| 坎贝奇电影在线观看| 欧美人与动xxxxz0oz| 电视剧满江红在线观看| 亲爱的妈妈3高清| 电视剧金瓶梅在哪里看| 中国好声音2012| 勇闯四季城免费观看全集| 杨敏1—5集电视剧最新更新| 惊变电影国语版在线观看 | 来自地狱下载| 电影《灭火宝贝1》| 印度爱经3d| 维修师傅的艳遇电影| 罪孽 泰国| 掌中宝电影西班牙| 《我最喜欢妈妈》动漫最新一集| 吾家有姐3满天星免费观看| 上海大舞台地址| 电影《无憾》坎贝奇在线观看| 茶啊二中电影免费观看完整版高清| 18岁电影| 蝴蝶效应2| 满天星HD版女超人在线| 网民发布辱国等不当言论被刑拘| 修罗武神第二季免费看| 安斋拉拉在线| 万里归途电影| 孩子走丢妈妈冲上舞台求助| 档案2013| xl司令第全集在线观看完整版免费| 红颜剑心短剧全集免费观看高清| 缘之空03| 高清猛虎末路| 蜡笔小新第九季| 衡水市| 电视剧二胎| 当我飞奔向你电视剧免费观看高清| 婚前恐惧症症状| 《热血》免费观看| 创造营亚洲版2024| 超能力者| 保罗雪莉美国2| 新金平瓶梅| 周深 跨年劳模| 怪奇物语第一季4k资源免费观看| 《爱我几何》精彩片段| 变形金刚5:最后的骑士| 电视剧雾都猎狐| 黑暗荣耀第一季无删减在线观看| 黑人大鸡巴大战俄罗斯美女| 局内人2| 伊甸园韩国综艺| 妈妈的女儿2字ID| 需要爸爸的播种 在线观看 | 朴诗妍在电影《爱》中的角色 | 潘金莲之前世今生百度影音| 若你安好便是晴天在哪里可以看| 隐形帽| 火影忍者剧场版 忍者之路| 三女大学按摩在线观看免费| 魔女与魔神| 在线观看私人航空| 斗罗大陆免费完整观看174| 中国特种部队宣传片| 空蝉之森酒法子完整版| 保罗2电影免费播放| 赖猫的狮子倒影在线看| 人皮灯笼粤语| 兄弟的老婆| 假面骑士最新| 暧昧失温短剧全集在线观看| 问题少女电影| 中字hd的丈夫的下属的成就与贡献 | 刀剑神域07| 秋元まゆ花| 人民的名义 dvd| 女律师的堕落电影免费观看| 韩剧高级课程完整免费观看| 刺杀游戏2011| 短腿的反击全集| 男女一起愁愁愁视频| 搞笑一家人下载| 伙记办大事| 绝密543电视剧| 蜜桃成熟时电影观看| 向爸爸播种电影的英文| 超级接班人| 一起出差的上司是前任| 爷们儿全集免费观看| 也平凡电视剧在线观看| 小凤新婚上集和下集| 谍战剧《惊变》| 装腔作势代表什么生肖| 一个雇佣兵和三个女人| 韩国A片巜上司的秘书| 公的之浮之手| 丛林雇佣兵| 水落石出第一部高清| 男女生一起愁愁愁电视剧在线观看| 中国打黑风暴| 第八个嫌疑人演员表| 1986版乌龙山剿匪记免费观看| 战狼6欧式少女全部视频苹果| 《老泥妹》电影| 狙击手电影免费观看完整版 | 人犬兽人100集全部| 东宫电视剧免费观看全集剧情| 短剧《权宠天下》| 白晶晶手机在线| 大奥第一章| 七夜怪谈电影| 熊出没之环球大冒险下载| 欧式少女10集全观看战狼6 | 赵丽颖小城大事免费播放| 与女部长一起去出差旅行的电影叫什么 | 《破·地狱》国语版免费看| 决胜21天在线观看| 姐妹牙医在线电影播放 | 摸金爵之卧龙诡阵电影| 《法国空乘5:满天星》| 新梁山泊与祝英台| 《裸体新闻》在线观看| 投子认输| 和部长| 推荐好看的电视剧| 格里高利教皇合唱团| 喜德县| 替夫还债电影高清完整版 | 王贵与安娜电视剧| 粉红大白菜在线观看 | 毛驴县令之棒子老虎鸡| 牙医姐妹在线观看免费普通话版| 死神来了6国语高清免费观看| 小公主苏菲亚第四季免费观看| 第三按摩室| 空调维修工的艳遇在线观看 | 无间道1| 富顺县| 赤井美月| 金蝉脱壳百度影音| 无所畏惧在线观看电视剧免费| 《搜索》| 战狼6免费电影在线观看高清| 金毛动漫库| 2对1:三人一次体检电视剧| 英雄本色免费| 郝板栗电影免费观看| 独行侠字幕| 水落石出电视剧| 粉色大白菜台湾电影| 我的泪珠儿电视剧| 治多县| 调教小秘书| 银魂完结篇| 法国版《女超人:麦乐迪》在线播放http| 闪闪的红星在线观看| 绝品邪医的桃花劫短剧免费观看| 二十世纪性格与X爱情观后感免费观看| 禁忌3| 鬼电影国语版| 潜伏29| 《新浪潮》| 儿媳味道HD| 天凶之城| 二十大观后感| 辣椒与泡菜演员表| 《台球厅的助教》| 《金花瓶》完整版西门庆| 杉杉来吃电视剧全集| 东北一家人2| yellow视频免费观看| 东方茱丽叶全集| 金梅瓶下载| 一起草cnn网页端| 《驯服小峓子》2在线观看| 电影非诚勿扰2在线观看| 校长称邯郸男孩的死亡是个意外| 破晓之战电影免费高清完整版| 做aj的视频大全电视剧试看| 勇者的故事| 法国空姐6电影在线观看完整免费高清原声麻将胡了 | 都市风云再起:龙帅归来短剧全集| 《吴雪雯性迷宫未删减版》| 极道之妻情炎| 当头炮的走法| 旅行时给儿子做了一次| 高压监狱法版1小时45分第二部 | 顶级生活| 哥布林杀手动漫| 啄木鸟《荣耀守则》凯登| 法国版 女超人| 电影美丽的小蜜桃| 野花影视在线观看免费高清完整版| 缠论教你炒股票108课| 妈妈打电话6| 春晚最美女观众| 《炸药屋》| 草帽警察全集在线观看| 韩国电影售楼小姐每月都是销售冠军| 勇者大冒险第一季| 生化危机5惩罚完整版| 女子学校的男生| 三年大片大全免费观看国语版全集| 换脸-欧阳娜娜《秘书工作指南》-自慰明星女神 | 长垣县| 《漂亮的女邻居》2| 黄真伊在线观看韩剧网电视剧| 时光代理人第二季| 一屋老友记 国语| 出租屋1| 少年派2全集免费观看完整版高清| 《XL司令》动漫第一季动漫 | 医院的特殊待遇2角色介绍| 高清《loveme》动漫第一季| 扫毒1国语版免费观看| 财阀家的小儿子11| 农民伯伯2第二部国语版| 《高压监狱 伦理》电影高清在线观看 - 如如影视 | 埃洛伊塞| 天外来客bt| 伦理《高压监狱2》法国版| 重启之蛇骨佛蜕| 你莫走原唱| 妈咪电影完整版下载| 奸臣 电影| 电影《爱上女闺蜜》播放| 无贼剧情介绍| 无人区免费观看完整版中文大结局| 财阀家的小儿子在线观看| 龙日一你死定了免费观看全集| 架设单机传奇| 足球小将粤语版全集| 永新县| 詹伯奥特曼| 电视剧使命在线观看| 斗破苍穹年番101更新了吗| 三年中国免费观看国语| 电影我要爸爸的种子HD正版| 贾玲拍露腹肌戏份脱了8斤水| 溪暮悦影短剧免费播放大全| 《河豚》| xl司令免费观看全集高清 | 黄曼巴罗伊| 赢钱专家未删减版高清| 韩国电影我漂亮的瘦子| 永不磨灭的番号剧情| 向往的生活第2季| 沈樵第二部闺蜜20分钟| 爱死亡与机器人| 女版战狼6免费播放高清| 千金归来全集免费| 电视剧别对我说谎| 腾飞担保公司| 暴躁老妈1-46集全免费观看高清版百度欧美| 相爱概率论泰剧免费观看| 网红王一菲| 学生妈妈5字ID免费各种各样的| 部长出差的日子完整版| 深情触摸2韩语中文字| 婆家娘家第三部| 天若有情 郑伊健| 战狼6免费高清在线播放 | 我爱桃花| 欧美伦理-西部通缉令精修成人版字幕佳作 | 咏春电影| 《向日葵的绽放》动漫观看| 公之浮之手中字22| 罗丽星克莱尔迷宫HD版免费观看| 春的森林 下载| 长江七号电影免费完整版在线观看| 黑鹰坠落国语| 老公下属是初恋在线视频在线观看| 一夜新娘免费完整版在线观看| 命中注定我爱你20| 下辈子做你的女人电视剧| 巴彦县| 《替夫还债妻子》大结局在线观看| 铃木美恵子| 湘北小成| 化神短剧全集免费| 金珠恩满天星三部曲免费观看| xl司令动漫第一季全集在线观看免费播放动漫 | 麻豆AV《修车艳遇》在线| 爱情理论免费观看| 爱她的理由第二季免费动漫 | 命运印度电视剧| 《初体验5》免费观看完整版| 我们俩的婚姻| 千言万语未删减版完整版在线观看| 罪夜之奔第一季| 热搜免费观看完整版电影| 火热的部长妻子| 旧版包青天| 张国荣天使之爱| 都市激情在线| 法国《卖百科全书的女人》| 校花的贴身高手无删减版电视剧 | 菲律宾美人鱼50集国语| 国风按摩院1一6| 超新星闪电武士| 学霸女神短剧全集| 特殊的教练| 十二生肖电视剧全集| 韩剧我的妻子| 83版射雕英雄传| 洛尘都市仙尊免费最新| 倔强的驱魔师在线| 二战中的指挥官| 借枪在线观看| 屠狼刀全集在线观看| 蓬莱市| 法国女版《壮志凌云》在线观看| 甜蜜的家第二季| 黄骗免费网站| 法版空姐2019法版| 酋长的女儿红辣椒| 战狼6欧式少女背景故事| 鞠婧祎免费造梦在线观看| 善良的她在线观看| 刀郎 爱是你我| 五夜天| 绝强驱魔师花子| 文豪野犬第四季完整免费观看| 黑帮少爷爱上我 第七集| 我形我速5| 蓝色隐身帽| 麦乐迪《女超人》电影 | 变形计第七季| 人民的正义| overflwer全集免费播放| 春草电视剧全集免费观看| 泰罗奥特曼国语版全集| 斗罗大陆156集| 反黑英雄| 驯服小峓子HD中字| 女扮男装闯江湖短剧全集| 如狼似虎的女人40集电视剧 | 猎金·游戏未删减| 天休营第一季| 周弘《村姑》在线播放| 插曲的痛60全集免费观看无马赛克| 黄磊 深夜食堂| 沧元图第二季第4集| 神奇数字马戏团第一集| 崇左市| 按摩5个混血儿| 要帅气的生活剧情介绍| 悲伤比更悲伤的故事| 绝杀在线观看| 电影蜜糖| 花子vs倔强驱魔在线观看| 名侦探柯南国语版全集优酷| 电影《牙医姊妹》免费播放| 绝命交错| 刀剑神域ii| 爱我几何原版免费观看| 司马南讲座| 广场舞玩腻| 龙年图片壁纸| 疯狂的意大利假期在线观看| 美式的忌讳5—7| 印度三级偷妻| 喋血劫花| 囧的呼唤111| 高清我要成为超级巨星| 卖房子的女销售2香港| 伊甸园电影网| 坏哥哥集百万部电影| 疯狂动物城中文版免费观看| 《和讨厌的部长出差旅》在线观看高 | 家产争夺:我是继承人全集免费| 完美女人满天星完整版| 冠心病最怕什么刺激| 洗屋先生| 高清《女囚》电影| 奢香夫人原唱完整版| 火山两人没有打马赛| 重生把自己嫁了| 冯宝宝与张楚岚电视剧| 一仆二主大结局| 美国电影想要爸爸播种子| 古灵精怪东南亚4| 老电影歌剧江姐| yellow高清视频在线免费观看 | 高清《渣女》电影在线观看免费| 别墅轮换5攻略免费观看电视剧| 银瓶梅电视剧高清免费观看| 重庆地震最新消息今天2022 | 三年成全免费观看大全动漫| 珠帘玉幕电视剧免费播放下载| 阴阳眼见子未删减| 夏目友人帐第一季| 余罪第二季迅雷下载| 加勒比海盗1黑珍珠的诅咒| 战斗陀螺第三部| 再见艳阳天马景涛| 世界尽头的爱电影完整版免费观看 | 呕吐娃娃屠宰场免费观看| 罗马帝国的艳情史| 电视剧虎刺红全集免费播放| 巡视检查组| 电视剧《惊弦》在线观看| 电影香醇的锈感| 需要爸爸的种子电影免费观看| 花蜜花液汁水野战高H动漫| 成何体统动漫第二季| 乳房和月亮| 长江七号免费| 火热的部长妻子结局 | 曝李铁团队瓜分海参代言费| 挚爱游戏樊治欣全集免费观看| 爱情公寓5免费观看完整版| 听泉鉴宝最恐怖的一集| 潘多拉之镜1983满天星版资源| 我叫金三顺国语全集| 白峰电影在线观看550| 彭丹演过的电影| 朱易说想当花滑教练| 台剧黛比浪漫女家教在线观看免费第6 | 西游伏妖篇 百度云| 公的浮之手在线观看完整版| 《晚安,为我而眠的妹妹》| 破梦游戏电影免费观看完整版高清| 我独自升级动漫第二季| 奔跑吧兄弟第三季完整版免费观看| 《乳房按摩》在线观看| 沉默的羔羊6免费观看完整版| 马戏之王| 我的邻居长不大免费阅读| 二胡独奏演奏曲大全| 忍者一时| 二十一世纪性格爱情指南第8集| 和讨厌的前男友一起去出差旅日本在线观看 | 孟羽童疑似成立个人工作室| 而立之年片尾曲| 《诱人的护士》| 一代女皇武则天高清| 佩奇小猪佩奇动画片免费观看| 法国航空空姐2016中文版视频| 疯狂直升机| 西施伦理完整版| 《卿卿我心》叶玉卿免费观看| 消失的孩子多少集| 事物的秘密在水池一段是多少比喻| 越南女兵| 蛇年春晚小品| 日和漫画中文配音| 今年养老金上调3.6%| 公主把奶尖放入侍卫口中| 香醇的绣感| 酒店激战2第5集什么时候开播| 梅根2.0电影| 红高粱高清下载| 黄日华个人资料简介| 《弗兰茨》| 高清《四大美人之貂蝉》| 名侦探柯南16 第11个前锋| 《特殊游泳教练》免费观看下拉式| 睫毛膏2中文版色大师| 一路向西电影完整版52| 维斯塔小镇家长会2免费观看| 千禧金瓶梅| 大江大河3免费看全集技巧| 《初体验5》完整版| 年轻的母亲1在线播放| 仙逆全集免费观看完整版| 萌宝助攻追妻:神级奶爸短剧全集| 家和万事兴全集| 木下凛凛子免费观看平台| 韩国人妻同丈夫吵架人妻系上司的关心下调教电影| 珈百璃的堕落免费观看全集樱花动漫 | 墨西哥电视剧《la rosa de guadalupe》(瓜达卢佩的玫瑰/奇迹玫瑰),熟女名字叫 | 法国少女农场2中文版在线观看| 《新人律师法国满天星》还叫什么名| 曾国祥身高| 电锯人免费观看完整版| 爱不爱都是错| 永夜星河电视剧高清免费| 黄色哇嘎免费看| 韩国电影 好姑娘干 在线观看| 三眼神童国语版| 男人不难嫁片尾曲| 月宫宝盒电影完整视频免费观看| 高清《寒蝉鸣泣之时》动漫| 美味快递员特殊待遇| 女版战狼6泰国版高清| 吉沢明歩的电影| 无颜之月1到5免费动漫| 金瓶梅1---5全集| 韩剧《大度》在线观看全集| 伊丽莎白坎贝奇的《品味人生》| 意大利电影护士转正| 胭脂雪大结局| 战火青春电视剧| 典狱缉凶满天星| 妈妈母乳1-5H| 《古墓神蛇》| 《请回答1988 十周年MT》| 银魂251| 《千金小姐》在线观看| 远得要命的爱情电视剧| 神隐电视剧| 私人瑜伽教练电影| 哪吒2之魔童闹海| 盒装美人| 女版战狼10普通话版| 丰乳按摩电影免费观看| 无心法师金晨| 《五感图》| 中医经筋捆扎疗法视频| 锦绣安宁40集免费看| 肢体的绣感1982凯瑟薇版| 美国《睫毛膏3》美国版| 日本3天已连震5次| 欢迎光临全集免费观看| 台湾版《棘手狂情》电影免费观看| 父辈的荣耀电视剧| 黄子华周慧敏电影| 正在播放:黑人巨屌 Karla Kush 金发美女对战大黑鸡巴 - 17 | 巴啦啦小魔仙免费观看完整版| 电视剧红颜的岁月| 韩国18禁电影少女们的痛苦| 灿烂的遗产国语版全集| 《示范销售避孕套》免费观看 | 台湾人的身份证| 赌圣周星驰国语| 善良的嫂子41| 锦月如歌电视剧免费观看全集| 一路向前| 和大胸大乳继拇做爰| 法国空姐2008满天星法版:星辉照耀下| 绿萝花电视剧免费观看| 给女儿播种在线观看| 新梅瓶2三A级做爰片| 《地球上的星星2》| 法国满天星《古墓丽影》| 酒店服务生动漫第一季| 最新壹周立波秀| 黑道风云电视剧全集| 电视剧游击兵工厂| 我和我的祖国电影在线观看免费| 不速来客 电影| 肯兰德桑德兰满天星电影| 性的暴行 在线观看| 高清《朋友夫妇:交换》2| 巴基斯坦地图中文版| 我需要爸爸的种子| 海之声如如免费完整版动漫| 弃妇逆袭短剧全集| 棋士在线观看| 妻子3免费完整版HD中字| 哇嘎电影免费播放高清| 赤警威龙在线观看| 生死狙击百度影音| 《出轨同学会2》| 四大名妓| 《瓜达卢佩的玫瑰》在线播放 | 莉娅戈蒂黑白配在线观看| 单亲妈妈4免费高清完整版观看| 末班车后胶囊旅馆| 刘国梁马琳喊醒陈梦|