精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何基于Cortex-A9的UART從頭實現printf函數

開發
本文將以Exynos4412的UART控制器為基礎,講解UART的原理以及驅動程序如何編寫。

[[361172]]

 0. 前言

Uart在一個嵌入式系統中是一個非常重要的模塊,他承擔了CPU與用戶交互的橋梁。用戶輸入信息給程序、CPU要打印一些信息給終端都要依賴UART。

本文將以Exynos4412的UART控制器為基礎,講解UART的原理以及驅動程序如何編寫。

1. UART是什么

UART是通用異步收發傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱作UART,是一種異步收發傳輸器,是設備間進行異步通信的關鍵模塊。UART負責處理數據總線和串行口之間的串/并、并/串轉換,并規定了幀格式;通信雙方只要采用相同的幀格式和波特率,就能在未共享時鐘信號的情況下,僅用兩根信號線(Rx 和Tx)就可以完成通信過程,因此也稱為異步串行通信。UART總線雙向通信,可以實現全雙工傳輸和接收。在嵌入式設計中,UART用于主機與輔助設備通信,如汽車音響與外接AP之間的通信,與PC機通信包括與監控調試器和其它器件,如EEPROM通信。

通常需要加入一個合適的電平轉換器,如SP3232E、SP3485,UART還能用于RS-232、RS-485 通信,或與計算機的端口連接。UART 應用非常廣泛,手機、工業控制、PC 等應用中都要用到UART。

[[361173]]

在這里插入圖片描述

2. UART通信方式

UART使用的是 異步,串行通信方式。

串行通信

串行通信是指利用一條傳輸線將資料一位位地順序傳送。好比是一列縱隊,每個數據元素依次縱向排列。如下圖所示,傳輸時一個比特一個比特的串行傳輸,每個時鐘周期傳輸一個比特,這種傳輸方式相對比較簡單,速度較慢,但是使用總線數較少,通常一根接收線,一根發送線即可實現串行通信。

它的缺點是要增加額外的數據來控制一個數據幀的開始和結束。特點是通信線路簡單,利用簡單的線纜就可實現通信,降低成本,適用于遠距離通信,但傳輸速度慢的應用場合。

并行通信

并行通信好比一排橫隊,齊頭并進同時傳輸。這種通信方式每個時鐘周期傳輸的數據量和其總線寬度成正比,但是實現較為復雜。

在這里插入圖片描述

異步通信

異步通信以一個字符為傳輸單位,通信中兩個字符間的時間間隔多少是不固定的,然而在同一個字符中的兩個相鄰位間的時間間隔是固定的。

在異步通信技術中,數據發送方和數據接收方沒有同步時鐘,只有數據信號線,只不過發送端和接收端會按照協商好的協議(固定頻率)來進行數據采樣。數據發送方以每秒鐘57600bits的速度發送數據,接收方也以57600bits的速度去接收數據,這樣就可以保證數據的有效和正確。通常異步通信中使用波特率(Baud-Rate)來規定雙方傳輸速度,其單位為bps(bits per second每秒傳輸位數)。

同步通信

在發送數據信號的時候,會同時送出一根同步時鐘信號, 用來同步發送方和接收方的數據采樣頻率。如下圖所示,同步通信時,信號線1是一根同步時鐘信號線,以固定的頻率進行電平的切換,其頻率周期為t,在每個電平的上升沿之后進行對同步送出的數據信號線2進行采樣(高電平代表1,低電平代表0),根據采樣數據電平高低取得輸出數據信息。如果雙方沒有同步時鐘的話,那么接收方就不知道采樣周期,也就不能正常的取得數據信息。

在這里插入圖片描述

3. 幀格式

數據傳送速率用波特率來表示,即每秒鐘傳送的二進制位數。例如數據傳送速率為120字符/秒,而每一個字符為10位(1個起始位,7個數據位,1個校驗位,1個結束位),則其傳送的波特率為10×120=1200字符/秒=1200波特。數據通信格式如下圖:

在這里插入圖片描述

其中各位的意義如下:

  • 起始位:先發出一個邏輯”0”信號,表示傳輸字符的開始。
  • 數據位:可以是5~8位邏輯”0”或”1”。如ASCII碼(7位),擴展BCD碼(8位)。小端傳輸
  • 校驗位:數據位加上這一位后,使得“1”的位數應為偶數(偶校驗)或奇數(奇校驗)
  • 停止位:它是一個字符數據的結束標志。可以是1位、1.5位、2位的高電平。
  • 空閑位:處于邏輯“1”狀態,表示當前線路上沒有資料傳送。

注:異步通信是按字符傳輸的,接收設備在收到起始信號之后只要在一個字符的傳輸時間內能和發送設備保持同步就能正確接收。

下一個字符起始位的到來又使同步重新校準(依靠檢測起始位來實現發送與接收方的時鐘自同步的)

關于RS-232、RS-422、RS-485等標準,大家可以參考文章《一篇文章了解什么是串口,UART、RS-232、RS-422、RS-485 》

4. Exynos4412 Uart

本文討論UART 是基于Cortex-A9架構的Exynos4412 為例。

1)特性

  • Exynos4412 中UART,有4 個獨立的通道,每個通道都可以工作于中斷模式或DMA 模式,即UART 可以發出中斷或 DMA 請求以便在UART 、CPU 間傳輸數據。使用系統時鐘時,Exynos4412 的 UART 波特率可以達到 4Mbps 。每個UART通道包含兩個FIFO用來接收和發送:
  • 通道 0有 256 字節的發送 FIFO 和 256 字節的接收FIFO
  • 通道 1、4有 64 字節的發送 FIFO 和 64 字節的接收FIFO
  • 通道 2、3有 16 字節的發送FIFO 和 16 字節 的接收 FIFO 。

UART include:

  • 波特率可以通過編程進行 。
  • 紅外接收/發送
  • 每個通道支持停止位有 1位、 2位
  • 數據位有 5、6、7或 8位

每個UART還包括

  • 波特率發生器、發送器、接收器、控制邏輯組成。

2)Uart控制器

功能模塊

在這里插入圖片描述

每個UART包含一個波特率產生器,發送器,接收器和一個控制單元,如上圖所示:

  • 發送數據 CPU 先將數據寫入發送FIFO 中,然后 UART 會自動將FIFO 中的數據復制到“發送移位器” (Transmit Shifter )中,發送移位器將數據一位一位地發送到 TxDn 數據線上 (根據設定的格式,插入開始位 、校驗和停止)。
  • 接收數據 “移位器” (Receive Shifter )將 RxDn 數據線上的數據一位一位的接收進來,然后復制到FIFO 中, CPU即可從中讀取數據。

UART是以異步方式實現通信的,其采樣速度由波特率決定,波特率產生器的工作頻率可以由PCLK(外圍設備頻率),FCLK/n(CPU工作頻率的分頻),UEXTCLK(外部輸入時鐘)三個時鐘作為輸入頻率,波特率設置寄存器是可編程的,用戶可以設置其波特率決定發送和接收的頻率。

發送器和接收器包含了64Byte的FIFO和數據移位器。UART通信是面向字節流的,待發送數據寫到FIFO之后,被拷貝到數據移位器(1字節大小)里,數據通過發送數據管腳TXDn發出。

同樣道理,接收數據通過RXDn管腳來接收數據(1字節大小)到接收移位器,然后將其拷貝到FIFO接收緩沖區里。

(1)數據發送 發送的數據幀可編程的,它的一個幀長度是用戶指定的,它包括一個開始位,5~8個數據位,一個可選的奇偶校驗位和1~2個停止位,數據幀格式可以通過設置ULCONn寄存器來設置。發送器也可以產生一個終止信號,它是由一個全部為0的數據幀組成。在當前發送數據被完全傳輸完以后,該模塊發送一個終止信號。在終止信號發送后,它可以繼續通過FIFO(FIFO)或發送保持寄存器(NON-FIFO)發送數據。

(2)數據接收 同樣接收端的數據也是可編程的,接收器可以偵測到溢出錯誤奇偶校驗錯誤,幀錯誤和終止條件,每個錯誤都可以設置一個錯誤標志。• 溢出錯誤 :在舊數據被讀取到之前,新數據覆蓋了舊數據 • 奇偶校驗錯誤:接收器偵測到了接收數據校驗結果失敗,接收數據無效 • 幀錯誤 :接收到的數據沒有一個有效的停止位,無法判定數據幀結束 • 終止條件 :RxDn接收到保持邏輯0狀態持續長于一個數據幀的傳輸時間

(3)自動流控AFC(Auto Float Control) UART0和UART1支持有nRTS和nCTS的自動流控。在AFC情況下,通信雙方nRTS和nCTS管腳分別連接對方的nCTS和nRTS管腳。通過軟件控制數據幀的發送和接收。在開啟AFC時,發送端接收發送前要判斷nCTS信號狀態,當接收到nCTS激活信號時,發送數據幀。該nCTS管腳連接對方nRTS管腳。接收端在準備接收數據幀前,其接收器FIFO有大于32個字節的空閑空間,nRTS管腳會發送激活信號,當其接收FIFO小于32個字節的空閑空間,nRTS必須置非激活狀態。

在這里插入圖片描述

3)選擇時鐘源

Exynos4412 UART的時鐘源有八種選擇:XXTI 、XusbXTI 、SCLK_HDMI24M 、SCLK_USBPHY0 、 SCLK_HDMIPHY 、SCLKMPLL_USER_T 、SCLKEPLL 、SCLKVPLL ,由 CLK_SRC_PERIL0 寄存器控制。

選擇好時鐘源后,還可以通過 DIVUART0 ~4設置分頻系數,由 CLK_DIV_PERIL0 寄存器控制。從分頻器得到的時鐘被稱為SCLK UART 。

SCLK UART 經過上圖中的“ UCLK Generator”后,得到UCLK ,它的頻率就是UART 的波特率。“ Generator UCLK Generator ”通過這 2個寄存器來設置:UBRDIVn(UART BAUD RATE DIVISOR) 、UFRACVALn 。

4)UART配置寄存器

在這里插入圖片描述

ULCONn

在這里插入圖片描述
  • bite [6] 紅外模式 選擇串口0是否使用紅外模式:0 = 正常通信模式 1 = 紅外通信模式
  • bite [5:3] 校驗模式 設置串口0在數據接收和發送時采用的校驗方式:0xx = 無校驗 100 = 奇校驗 101 = 偶校驗 110 = 強制校驗/檢測是否為1 111 = 強制校驗/檢測是否為0
  • [2] 停止位 設置串口0停止位數:0 = 每個數據幀一個停止位 1 = 每個數據幀二個停止位
  • [1:0] 數據位 設置串口0數據位數:00 = 5個數據位 01 = 6個數據位 10 = 7個數據位 11 = 8個數據位

該寄存器我們通用的配置是:

  1. ULCON2 = 0x3; //Normal mode, No parity,One stop bit,8 data bits 

UCONn

  • [15:12] FCLK分頻因子 當UART0選擇FCLK作為時鐘源時,設置其FCLK的分頻因子 UART0 工作時鐘頻率 = FCLK/ FCLK分頻因子 + 6
  • [11:10] UART時鐘源選擇 選擇UART0的工作時鐘PCLK,UEXTCLK,FCLK/n:00,10 = PCLK 01 = UEXTCLK 11 = FCLK/n 當選擇FCLK/n作為UART0工作時鐘時還要做其它設置,具體請讀者自行查看硬件手冊
  • [9] 發送數據中斷產生類型 設置UART0中斷請求類型,在非FIFO傳輸模式下,一旦發送數據緩沖區為空,立即產生中斷信號,在FIFO傳輸模式下達到發送數據觸發條件時立即產生中斷信號:0 = 脈沖觸發 1 = 電平觸發
  • [8] 接收數據中斷產生類型 設置UART0中斷請求類型,在非FIFO傳輸模式下,一旦接收到數據,立即產生中斷信號,在FIFO傳輸模式下達到接收數據觸發條件時立即產生中斷信號:0 = 脈沖觸發 1 = 電平觸發
  • [7] 接收數據超時 設置當接收數據時,如果數據超時,是否產生接收中斷:0 = 不開啟超時中斷 1 = 開啟超時中斷 10 = 7個數據位 11 = 8個數據位
  • [6] 接收數據錯誤中斷 設置當接收數據時,如果產生異常,如傳輸中止,幀錯誤,校驗錯誤時,是否產生接收狀態中斷信號:0 = 不產生錯誤狀態中斷 1 = 產生錯誤狀態中斷
  • [5] 回送模式 設置該位時UART會進入回送模式,該模式僅用于測試 0 = 正常模式 1 = 回送模式
  • [4] 發送終止信號 設置該位時,UART會發送一個幀長度的終止信號,發送完畢后,該位自動恢復為0 0 = 正常傳輸 1 = 發送終止信號
  • [3:2] 發送模式 設置采用哪個方式執行數據寫入發送緩沖區 00 = 無效 01 = 中斷請求或查詢模式 10 = DMA0請求
  • [1:0] 接收模式 設置采用哪個方式執行數據寫入接收緩沖區 00 = 無效 01 = 中斷請求或查詢模式 10 = DMA0請求

該寄存器通用配置為:

  1. UCON2 = 0x5;  //Interrupt request or polling mode 

一般裸機情況下,采用輪詢模式。

UTRSTATn

UTRSTAT n寄存器用來表明數據是否已經發送完畢、是否已經接收到數據,格式如下圖所示,上面說的“緩沖區”,其實就是下圖中的 FIFO ,不使用 FIFO 功能時可以認為其深度為 1。

當我們讀取數據時,就輪詢檢查bit[0]置1之后,然后再從URXHn寄存器讀取數據;當我們讀取數據時,就輪詢檢查bit[1]置1之后,然后再向UTXHn寄存器寫入數據來發送數據;

在這里插入圖片描述

在這里插入圖片描述

UTXHn寄存器(UART TRANSMIT BUFFER REGISTER)

CPU 將數據寫入這個寄存器, UART即會將它保存到緩沖區中,并自動發送出去。

URXHn寄存器(UART RECEIVE BUFFER REGISTER)

當 UART 接收到數據時,讀取這個寄存器,即可獲得數據。

UFRACVALn 計算波特率

在這里插入圖片描述

根據給定的波特率、所選擇時鐘源頻率,可以通過以下公式計算 UBRDIVn 寄存器 (n 為 0~4,對應 5個 UART 通道 )的值。

  1. UBRDIVn = (int)( UART clock / ( buad rate x 16) ) – 1 

上式計算出來的 UBRDIVn 寄存器值不一定是整數, UBRDIVn 寄存器取其整數部分,小部分由 UFRACVALn 寄存器設置, UFRACVALn 寄存器的引入,使產生波特率更加精確。「【舉例】」當UART clock為100MHz時,要求波特率為115200 bps,則:

  1. 100000000/(115200 x 16) – 1 = 54.25 – 1 = 53.25 
  2.     UBRDIVn = 整數部分 = 53                
  3.     UFRACVALn/16 = 小數部分 = 0.25 
  4.     UFRACVALn = 4 

5)電路圖

外設電路圖:

在這里插入圖片描述

SP3232EEA 用來將TTL電平轉換成RS232電平。我們使用的是COM2。

外設與核心板連接電路圖

在這里插入圖片描述

可見UART的收發引腳連接到了GPA上,打開exynos4412芯片手冊:

在這里插入圖片描述

我們只需要將GPA1 的低8位設置為0x22。

6.實例代碼

裸機代碼,主要實現uart_init()、putc()、getc()這三個函數。

uart_init()

該函數主要配置UART的,波特率115200,數據位:8,奇偶校驗位:0,終止位:1,不設置流控。

如下圖:是運行在windows下常用的串口工具配置信息,配置信息必須完全一致。

在這里插入圖片描述

putc()

該函數是向串口發送一個數據data,他的實現邏輯就是輪詢檢查寄存器UART2.UTRSTAT2 ,判斷其bite【1】是否置1,如果置1,則向UART2.UTXH2存入要發送的數據即可。

getc()

該函數是從串口接收一個數據data,他的實現邏輯就是輪詢檢查寄存器UART2.UTRSTAT2 ,判斷其bite【0】是否置1,如果置1,說明數據準備好,則可以從寄存器UART2.URXH2取出數據。

代碼

  1. /* 
  2.  * UART2 
  3.  */ 
  4. typedef struct { 
  5.     unsigned int ULCON2; 
  6.     unsigned int UCON2; 
  7.     unsigned int UFCON2; 
  8.     unsigned int UMCON2; 
  9.     unsigned int UTRSTAT2; 
  10.     unsigned int UERSTAT2; 
  11.     unsigned int UFSTAT2; 
  12.     unsigned int UMSTAT2; 
  13.     unsigned int UTXH2; 
  14.     unsigned int URXH2; 
  15.     unsigned int UBRDIV2; 
  16.     unsigned int UFRACVAL2; 
  17.     unsigned int UINTP2; 
  18.     unsigned int UINTSP2; 
  19.     unsigned int UINTM2; 
  20. }uart2; 
  21. #define UART2 ( * (volatile uart2 *)0x13820000 ) 
  22. /* GPA1 */ 
  23. typedef struct { 
  24.     unsigned int CON; 
  25.     unsigned int DAT; 
  26.     unsigned int PUD; 
  27.     unsigned int DRV; 
  28.     unsigned int CONPDN; 
  29.     unsigned int PUDPDN; 
  30. }gpa1; 
  31. #define GPA1 (* (volatile gpa1 *)0x11400020) 
  32. void uart_init() 
  33. { /*UART2 initialize*/ 
  34.  GPA1.CON = (GPA1.CON & ~0xFF ) | (0x22); //GPA1_0:RX;GPA1_1:TX 
  35.  UART2.ULCON2 = 0x3; //Normal mode, No parity,One stop bit,8 data bits 
  36.  UART2.UCON2 = 0x5;  //Interrupt request or polling mode 
  37.  //Baud-rate : src_clock:100Mhz 
  38.  UART2.UBRDIV2 = 0x35; 
  39.  UART2.UFRACVAL2 = 0x4; 
  40. void putc(const char data) 
  41. { while(!(UART2.UTRSTAT2 & 0X2)); 
  42.  UART2.UTXH2 = data; 
  43.  if (data == '\n'
  44.    putc('\r'); 
  45. char getc(void) 
  46. char data; 
  47.  while(!(UART2.UTRSTAT2 & 0x1)); 
  48.  data = UART2.URXH2; 
  49.  if ((data == '\n')||(data == '\r')) 
  50.  { 
  51.    putc('\n'); 
  52.    putc('\r'); 
  53.  }else 
  54.    putc(data); 
  55.  return data; 

puts/gets

  1. void puts(const  char  *pstr) 
  2. { while(*pstr != '\0'
  3.   putc(*pstr++); 
  4. void gets(char *p) 
  5. char data; 
  6.  while((data = getc())!= '\r'
  7.  {  if(data == '\b'
  8.   {p--; 
  9.   } 
  10.   *p++ = data; 
  11.  } 
  12.  if(data == '\r'
  13.  *p++ = '\n'
  14.  *p = '\0'

7.如何裸機程序可以支持printf函數

首先看下文件的目錄結構:

代碼架構

老規矩,關注,后臺回復【armprintf】,就可以得到代碼。

這里我們只貼出部分文件的代碼。

「cpu/start.s」改文件主要是實現異常向量表,實現各個模式的棧初始化

  1. .text 
  2. .global _start 
  3. _start: 
  4.   b  reset 
  5.   ldr  pc,_undefined_instruction 
  6.   ldr  pc,_software_interrupt 
  7.   ldr  pc,_prefetch_abort 
  8.   ldr  pc,_data_abort 
  9.   ldr  pc,_not_used 
  10.   ldr  pc,=irq_handler 
  11.   ldr  pc,_fiq 
  12.  
  13. _undefined_instruction: .word  _undefined_instruction 
  14. _software_interrupt: .word  _software_interrupt 
  15. _prefetch_abort:  .word  _prefetch_abort 
  16. _data_abort:   .word  _data_abort 
  17. _not_used:    .word  _not_used 
  18. _irq:     .word  irq_handler 
  19. _fiq:     .word  _fiq 
  20.  
  21.  
  22. reset: 
  23.  
  24.  ldr r0,=0x40008000 
  25.  mcr p15,0,r0,c12,c0,0  @ 協處理器指令設置異常向量表地址 
  26.  
  27.  
  28. init_stack: 
  29.   ldr  r0,stacktop         /*get stack top pointer*/ 
  30.  
  31.  /********svc mode stack********/ 
  32.   mov  sp,r0 
  33.   sub  r0,#128*4          /*512 byte  for irq mode of stack*/ 
  34.  /****irq mode stack**/ 
  35.   msr  cpsr,#0xd2 
  36.   mov  sp,r0 
  37.   sub  r0,#128*4          /*512 byte  for irq mode of stack*/ 
  38.  /***fiq mode stack***/ 
  39.   msr  cpsr,#0xd1 
  40.   mov  sp,r0 
  41.   sub  r0,#0 
  42.  /***abort mode stack***/ 
  43.   msr  cpsr,#0xd7 
  44.   mov  sp,r0 
  45.   sub  r0,#0 
  46.  /***undefine mode stack***/ 
  47.   msr  cpsr,#0xdb 
  48.   mov  sp,r0 
  49.   sub  r0,#0 
  50.    /*** sys mode and usr mode stack ***/ 
  51.   msr  cpsr,#0x10 
  52.   mov  sp,r0             /*1024 byte  for user mode of stack*/ 
  53.  
  54.   b  main @跳轉到c語言的main函數 
  55.  
  56.  .align 4 
  57.  
  58.  /****  swi_interrupt handler  ****/ 
  59.  
  60.  
  61.  /****  irq_handler  ****/ 
  62. irq_handler: 
  63.  
  64.  sub  lr,lr,#4 
  65.  stmfd sp!,{r0-r12,lr} 
  66.  .weak do_irq   @該函數可以沒有定義 
  67.  bl do_irq  @跳轉到中斷入口 
  68.  ldmfd sp!,{r0-r12,pc}^ 
  69.  
  70. stacktop:    .word   stack+4*512 @定義棧頂 
  71. .data 
  72.  
  73. stack:  .space  4*512  @分配一塊棧空間 

「lib/printf.c」

該文件主要實現打印函數printf一些格式控制,一些字符串轉換算數運算需要借助頭文件ctype.h、stdarg.h中一些宏。其中vsprintf 具體的實現我們就不再詳解,有興趣讀者自行研究。

  1. …… 
  2. void printf (const char *fmt, ...) 
  3.  va_list args; 
  4.  unsigned int i; 
  5.  char printbuffer[100]; 
  6.  va_start (args, fmt); 
  7.  
  8.  /* For this to work, printbuffer must be larger than 
  9.   * anything we ever want to print. 
  10.   */ 
  11.  i = vsprintf (printbuffer, fmt, args);//對輸入的參數進行格式整理 
  12.  va_end (args); 
  13.  puts (printbuffer); //調用上一章我們封裝的puts函數實現向串口打印書字符串 

「main.c」該文件可以直接調用printf()函數來打印信息了。

  1. void  delay_ms(unsigned int num) 
  2.     int i,j; 
  3.     for(i=num; i>0;i--) 
  4.  for(j=1000;j>0;j--) 
  5.   ; 
  6. /* 
  7.  *  裸機代碼,不同于LINUX 應用層, 一定加循環控制 
  8.  */ 
  9.  
  10. int main (void) 
  11.  int i = 0; 
  12.  while (1) { 
  13.   printf("aaaaaaaaaaaaa\n"); 
  14.   delay_ms(500); 
  15.  } 
  16.    return 0; 

「Makefile」

  1. CROSS_COMPILE = arm-none-eabi- 
  2. NAME =gcd 
  3. CFLAGS=-mfloat-abi=softfp -mfpu=vfpv3 -mabi=apcs-gnu -fno-builtin  -fno-builtin-function -g -O0 -c  -I ./include -I ./lib                                                   
  4. LD = $(CROSS_COMPILE)ld 
  5. CC = $(CROSS_COMPILE)gcc 
  6. OBJCOPY = $(CROSS_COMPILE)objcopy 
  7. OBJDUMP = $(CROSS_COMPILE)objdump 
  8. OBJS=./cpu/start.o ./driver/uart.o  \ 
  9.         ./driver/_udivsi3.o ./driver/_divsi3.o ./driver/_umodsi3.o main.o ./lib/printf.o  
  10. #=============================================================================# 
  11. all:  $(OBJS) 
  12.  $(LD)  $(OBJS) -T map.lds -o $(NAME).elf 
  13.  $(OBJCOPY)  -O binary  $(NAME).elf $(NAME).bin  
  14.  $(OBJDUMP) -D $(NAME).elf > $(NAME).dis  
  15. %.o: %.S  
  16.  $(CC) $(CFLAGS) -c -o  $@ $< 
  17. %.o: %.s  
  18.  $(CC) $(CFLAGS) -c -o  $@ $< 
  19. %.o: %.c 
  20.  $(CC) $(CFLAGS) -c -o  $@ $< 
  21. clean: 
  22.  rm -rf $(OBJS) *.elf *.bin *.dis *.o 

 

 

責任編輯:姜華 來源: 一口Linux
相關推薦

2021-01-19 19:32:01

Cortex-A9 R嵌入式系統i2c 外設

2020-12-22 11:54:42

C語言Cortex-A9LED匯編

2021-01-26 06:15:42

Cortex-A9 R嵌入式系統啟動代碼

2021-01-06 05:42:42

Cortex-A9 R嵌入式系統 RTC

2021-01-16 11:40:28

ARM嵌入式開發ADC應用

2021-01-08 12:06:59

WDT定時裝置

2022-08-05 13:38:08

C語言庫函數printf()

2021-02-05 12:04:45

LinuxUARTLinux系統

2024-11-27 08:14:43

2021-04-20 09:26:40

Cortex M架構Cortex A架構STM32系列

2022-09-11 15:02:22

機器學習算法感知器

2010-01-18 17:38:54

C++虛函數表

2018-07-19 15:13:15

深度學習圖像

2017-05-12 16:25:44

深度學習圖像補全tensorflow

2021-08-23 06:59:38

Linux內核代碼

2020-09-02 07:19:41

printf 格式化輸出Unix

2022-02-28 08:17:24

重載函數JS前端

2018-01-09 10:05:55

神經網絡ClojureCortex

2022-09-27 08:01:48

遞歸函數GScript

2020-11-17 08:09:01

webpack配置項腳手架
點贊
收藏

51CTO技術棧公眾號

中文字幕欧美在线观看| 成人精品在线观看视频| 羞羞视频在线观看免费| 国产成人精品亚洲777人妖| 蜜臀久久99精品久久久无需会员 | 99久久免费精品高清特色大片| 欧美亚洲精品一区| 欧美性受黑人性爽| 亚洲男人第一天堂| 石原莉奈在线亚洲二区| 另类专区欧美制服同性| 狠狠人妻久久久久久综合蜜桃| 最新日韩一区| 亚洲成人免费av| 亚洲精品久久区二区三区蜜桃臀| 粉嫩av一区二区夜夜嗨| 美女视频黄频大全不卡视频在线播放 | www.日日操| 欧美1—12sexvideos| 国产亚洲制服色| 国产精品区二区三区日本| 特级西西444www大精品视频免费看| 99久久国产综合精品成人影院| 日韩av在线电影网| 国产精品熟女一区二区不卡| 天堂久久午夜av| 欧美日韩国产精品一区二区不卡中文 | 欧美激情亚洲综合一区| 国产wwwwxxxx| 精品一区免费| 精品黑人一区二区三区久久| 亚洲欧美日本一区二区三区| 综合在线影院| 第一福利永久视频精品 | 菠萝菠萝蜜在线观看| 久久精品无码一区二区三区| 成人欧美一区二区三区黑人免费| 怡春院在线视频| 老牛国产精品一区的观看方式| 欧美激情手机在线视频 | 激情成人中文字幕| 丰满的少妇愉情hd高清果冻传媒 | 国产精品国产馆在线真实露脸| 精品在线一区| 天天摸夜夜添狠狠添婷婷| 国产盗摄精品一区二区三区在线 | 在线日韩成人| 欧美一级午夜免费电影| 亚洲一级片av| gogo大尺度成人免费视频| 欧美日韩国产一二三| 一区二区三区入口| 成人黄色免费网站| 欧美亚洲自拍偷拍| 日本激情综合网| 精品美女一区| 欧美日韩国产电影| 亚洲xxx在线观看| 99综合99| 精品少妇一区二区三区免费观看| 日批视频在线看| 精品国产鲁一鲁****| 日韩欧美一区二区在线视频| 免费不卡av网站| 日韩精品一区国产| 日韩欧美第一区| 在线观看一区二区三区四区| 久久久久高潮毛片免费全部播放| 亚洲精品一区二区三区在线观看| 在线视频 日韩| 色爱综合av| 亚洲人成电影在线| 美女网站视频色| 欧美伊人久久| 韩国精品美女www爽爽爽视频| 国产精品一区二区6| 老妇喷水一区二区三区| 国产一区二区在线免费| 国产黄色高清视频| 91免费看片在线观看| 日本在线视频一区| 黄色av电影在线观看| 亚洲一区在线视频| 国产精品亚洲a| 白嫩亚洲一区二区三区| 精品免费日韩av| 91精品人妻一区二区| 日韩一区欧美| 欧美俄罗斯乱妇| 国产精品免费精品一区| 久久超级碰视频| 国产精品对白一区二区三区| 蜜桃视频在线观看网站| 中文字幕在线一区免费| 搞av.com| 久久麻豆视频| 亚洲二区中文字幕| 中文字幕欧美激情极品| 欧美亚韩一区| 国产精品高清网站| 欧美自拍第一页| 中文字幕+乱码+中文字幕一区| 国产1区2区3区中文字幕| 最新欧美色图| 日韩欧美卡一卡二| 91成人在线免费视频| 午夜久久美女| 国产精品久久久久久网站| 超碰在线播放97| 亚洲国产成人私人影院tom| 国产精彩视频一区二区| 久久91视频| 亚洲精品网站在线播放gif| 91精品一区二区三区蜜桃| 久久一本综合频道| 国产区二精品视| 国产在线高清视频| 欧美综合色免费| 中文字幕乱视频| 亚洲精彩视频| 国产精品自拍偷拍视频| 日本在线视频1区| 亚洲一线二线三线视频| 天天久久综合网| 成人在线免费视频观看| 欧美在线观看日本一区| 欧美少妇bbw| 亚洲人亚洲人成电影网站色| 中文字幕在线导航| 蜜桃精品wwwmitaows| 国模精品系列视频| www.午夜激情| 亚洲女与黑人做爰| 午夜免费福利视频在线观看| 精品国产一区二区三区四区| 538国产精品一区二区免费视频| 亚洲AV无码精品色毛片浪潮| 亚洲欧美在线视频| 中文字幕国产免费| 欧洲杯什么时候开赛| 日韩69视频在线观看| 三级无遮挡在线观看| 午夜私人影院久久久久| av漫画在线观看| 欧美成人亚洲| 亚洲综合成人婷婷小说| 麻豆视频在线观看免费| 欧美日韩色一区| 99久久精品久久亚洲精品| 日本欧美一区二区| 日本不卡在线观看| 欧美色网在线| 国产亚洲成av人片在线观看桃| 欧美精品韩国精品| 久久精品一区二区三区不卡| 激情婷婷综合网| 欧美男同视频网| 国产精品极品美女在线观看免费| 国产永久免费高清在线观看| 一本大道av伊人久久综合| wwwwxxxx国产| 视频一区视频二区在线观看| 亚洲一卡二卡三卡| 色综合视频一区二区三区44| 麻豆乱码国产一区二区三区| 精品人妻少妇嫩草av无码专区| 亚洲图片欧美视频| 中国极品少妇videossexhd| 一区二区精品| 日本在线视频不卡| 国产精久久久| 欧美激情视频免费观看| 色播色播色播色播色播在线 | 亚洲综合网狠久久| 97欧美精品一区二区三区| 欧美理论在线观看| 欧美日韩中文一区| 青娱乐国产在线视频| 91首页免费视频| 污污的网站18| 欧美 日韩 国产精品免费观看| 国产精品免费视频一区二区| 韩国美女久久| 精品中文字幕乱| 色视频在线看| 7878成人国产在线观看| 日韩欧美亚洲视频| 国产精品午夜久久| 中文字幕天堂av| 日本sm残虐另类| 国产xxxx振车| 日韩久久久久| 国产另类第一区| 国产第一亚洲| 久久久噜噜噜久久久| 成人动漫在线免费观看| 欧美va亚洲va香蕉在线 | 日韩欧美在线影院| 一级片视频在线观看| 亚洲欧美偷拍卡通变态| 黄色网址在线视频| 美日韩一区二区| 国内自拍在线观看| 综合在线视频| 日韩免费一区二区三区| 精品av导航| 国产中文字幕91| av综合电影网站| 欧美国产日韩xxxxx| 在线看免费av| 亚洲免费小视频| 丰满人妻一区二区三区免费| 欧美日韩一区三区四区| 久久不卡免费视频| 一区二区三区在线视频播放| 亚洲色图 激情小说| 91丝袜国产在线播放| 波多野结衣三级视频| 久久99精品国产麻豆婷婷| 亚洲中文字幕无码不卡电影| 欧美日韩免费观看一区=区三区| 亚洲国产一区二区精品视频 | 国产 日韩 欧美一区| 欧美精品激情视频| www在线观看播放免费视频日本| 亚洲情综合五月天| 午夜一区在线观看| 亚洲电影免费观看| 亚洲va欧美va| 欧美一区二区三区啪啪| 中文字幕一区二区人妻| 色视频一区二区| 国产www在线| 午夜久久久久久久久久一区二区| 欧美成人精品欧美一| 成人欧美一区二区三区视频网页| 欧美福利第一页| 国产亚洲欧美中文| 久久丫精品忘忧草西安产品| www日韩大片| 亚洲综合网在线观看| 91一区二区三区在线观看| 少妇激情一区二区三区视频| 成人激情文学综合网| 黑人玩弄人妻一区二区三区| 国产999精品久久| 少妇愉情理伦片bd| 国产馆精品极品| 国产sm在线观看| 成人免费视频caoporn| 秘密基地免费观看完整版中文| 粉嫩av一区二区三区| 亚洲av人人澡人人爽人人夜夜| 成人自拍视频在线观看| 逼特逼视频在线观看| 99精品国产91久久久久久| 国产传媒第一页| 国产欧美日韩一区二区三区在线观看| 国产精品20p| 国产精品乱人伦| 99久久99久久精品国产| 一区二区日韩av| 天天插天天操天天干| 色综合久久99| 亚洲一区二区三区高清视频| 91精品国产综合久久久久久漫画 | 亚洲一卡二卡区| 亚洲一级毛片| 国产欧美日韩网站| 亚洲欧美日本日韩| 亚洲36d大奶网| 国产一区二区视频在线| av在线天堂网| www久久久久| 秋霞欧美一区二区三区视频免费| 亚洲免费观看高清在线观看| 日产欧产va高清| 在线观看日产精品| 一级片视频播放| 精品成人a区在线观看| 二人午夜免费观看在线视频| 久久精品人人做人人爽| 91白丝在线| 国产精品久久久久久一区二区| 一区二区在线视频观看| 欧美一区二区三区四区五区六区| 99精品全国免费观看视频软件| 国产精品无码电影在线观看| 日韩一区精品视频| 精品国产鲁一鲁一区二区三区| 99久久综合狠狠综合久久| 妖精视频在线观看免费| 亚洲第一激情av| 中文字字幕在线观看| 亚洲国产一区二区三区四区| aaa日本高清在线播放免费观看| 久久99国产综合精品女同| 亚洲天堂免费电影| 97人人模人人爽人人喊38tv| 蜜臀91精品国产高清在线观看| 91xxx视频| 丝袜诱惑制服诱惑色一区在线观看 | 欧美精品一区二区三区蜜桃视频| 男女av在线| 欧美高清第一页| yiren22亚洲综合| 久久国产精品精品国产色婷婷| 91九色精品国产一区二区| 成年人视频观看| 国产.精品.日韩.另类.中文.在线.播放| 波多野结衣av在线观看| 亚洲成人av在线电影| 国产老女人乱淫免费| 影音先锋欧美精品| 欧美裸体视频| 国产精品成人观看视频免费| 国产精品国产一区| 爱情岛论坛成人| 99国产精品久久久久久久久久| 九九视频免费看| 欧美男男青年gay1069videost| 久久国产精品高清一区二区三区| 久久久久久国产精品久久| 国产精品欧美一区二区三区不卡| 亚洲激情一区二区| 首页综合国产亚洲丝袜| 在线黄色免费网站| 亚洲一区二区三区四区五区中文| 国产免费黄色录像| 色av吧综合网| 久久电影天堂| 亚洲国产精品综合| 免费在线看成人av| 亚洲成人黄色av| 在线精品国精品国产尤物884a| 天堂在线中文字幕| 55夜色66夜色国产精品视频| 另类在线视频| 熟女少妇在线视频播放| jvid福利写真一区二区三区| 国产精品免费av一区二区| 精品捆绑美女sm三区| 男人天堂亚洲| 国产精品久久久对白| 狠狠爱成人网| 亚洲第一黄色网址| 狠狠干狠狠久久| 日本在线一二三| 国产精品91久久| 日本欧美国产| 免费一区二区三区在线观看| 国产精品久久久久久亚洲伦| 91激情在线观看| 毛片精品免费在线观看| **爰片久久毛片| av动漫在线看| 久久久99久久| 中文字幕日本人妻久久久免费| 中文字幕亚洲一区二区三区五十路| 亚洲aⅴ网站| 国产a级黄色大片| 99天天综合性| 黄色片视频免费| 日韩在线视频免费观看| 国产精品视频一区二区三区综合| 天堂а√在线中文在线| 成人国产精品免费观看视频| 天天综合网久久综合网| 亚洲香蕉伊综合在人在线视看 | 欧美丝袜第三区| 麻豆免费在线视频| 99精品在线直播| 亚洲一区黄色| 日本免费www| 日韩免费一区二区| 午夜久久中文| 一区二区三区的久久的视频| 成人一区二区三区视频在线观看| 毛片在线免费视频| 日韩在线不卡视频| caoporn成人| 国产精品久久久久9999小说| 亚洲欧美国产毛片在线| 欧美一级淫片aaaaaa| 国产精品黄页免费高清在线观看| 久久久久久久久久久久久久久久久久 | 日韩av一区二区在线| 97欧美成人| 97干在线视频| 国产精品福利影院| 婷婷综合激情网| 91日韩在线播放| 免费在线欧美黄色| www.av成人| 亚洲日本中文字幕| 51社区在线成人免费视频| 亚洲 欧美 日韩系列| 亚洲444eee在线观看| 黄色在线观看网站| 免费在线观看91|