精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

嵌入式開發之Linux系統中C程序的編譯與調試

倩倩 ? 來源:樂創iot ? 2020-04-21 11:31 ? 次閱讀

我主要是做工業自動化方面和物聯網方面的。了解熟悉工業自動化領域的,也開發過物聯網相關的產品。我的初衷是做工業物聯網的,但這個系統太過于龐大。所以就先做小的系統,例如構建一整套智能家居系統,從硬件到軟件全系列。下面就開始這套智能家居系統是如何在物聯網基礎上構建。在這里你可以0開始,然后到1質變,僅僅需要一起跟我學物聯網系列的開發筆記的文章。

第一節物聯網開發筆記——嵌入式開發Linux系統環境搭建搭建主要講解了在Windows系統下,用虛擬機的方法搭建環境。第二節物聯網開發筆記——嵌入式開發之Linux系統中文件和目錄相關命令主要講解Linux系統如何創建文件刪除修改等相關命令。第三節物聯網開發筆記——嵌入式開發之Linux系統Vi編輯器的使用主要講解Vi編輯器的使用。嵌入式開發學習C語言打下基礎。本節介紹《Linux系統中C程序的編譯與調試》。

1 首先了解一下什么是程序設計?

1)計算機基本結構

馮·諾依曼結構也稱普林斯頓結構,是一種將程序指令存儲器和數據存儲器合并在一起的存儲器結構。程序指令存儲地址和數據存儲地址指向同一個存儲器的不同物理位置,因此程序指令和數據的寬度相同,如英特爾公司的8086中央處理器的程序指令和數據都是16位寬。

計算機由以下圖中5個部分組成;存儲程序的思想是:系統的運行過程就是按照一定的順序不斷執行存儲器中程序指令的過程。

馮·諾依曼結構

處理過程

注:MMU是Memory Management Unit的縮寫,中文名是內存管理單元,它是中央處理器(CPU)中用來管理虛擬存儲器、物理存儲器的控制線路,同時也負責虛擬地址映射為物理地址,以及提供硬件機制的內存訪問授權,多用戶多進程操作系統

2)什么是程序

廣義上講,為了實現某個特定的目標,而預先設計的一組可操作的工作步驟,稱之為程序。程序就是系統可以識別得一組有序的指令。存儲在磁盤上,被加載到內存中執行。

3)程序設計語言的發展

A機器語言

機器語言(machine language)是一種指令集的體系。這種指令集,稱機器碼(machine code),是電腦的CPU可直接解讀的數據。機器碼有時也被稱為原生碼(Native Code),這個名詞比較強調某種編程語言或庫,它與運行平臺相關的部份。

雖然大多數的語言可以既可被編譯(Compiled)又可被解譯(interpreted),但大多數只在一種情況下能夠良好運行。在一些編程系統中,程序要經過幾個階段的編譯,一般而言,后階段的編譯往往更接近機器語言。這種常用的使用技巧最早在1960年代末用于BCPL,編譯程序先編譯一個叫做“0代碼”的轉換程序(representation),然后再使用虛擬器轉換到可以運行于機器上的真實代碼。這種成功的技巧之后又用于Pascal和P-code,以及Smalltalk和二進制碼,雖然在很多時候,中間過渡的代碼往往是解譯,而不是編譯的。

B匯編語言

匯編語言(assembly language)是一種用于電子計算機、微處理器微控制器或其他可編程器件的低級語言,亦稱為符號語言。在匯編語言中,用助記符(Mnemonics)代替機器指令的操作碼,用地址符號(Symbol)或標號(Label)代替指令或操作數的地址。在不同的設備中,匯編語言對應著不同的機器語言指令集,通過匯編過程轉換成機器指令。普遍地說,特定的匯編語言和特定的機器語言指令集是一一對應的不同平臺之間不可直接移植。

許多匯編程序為程序開發、匯編控制、輔助調試提供了額外的支持機制。有的匯編語言編程工具經常會提供宏,它們也被稱為宏匯編器。

匯編語言不像其他大多數的程序設計語言一樣被廣泛用于程序設計。在今天的實際應用中,它通常被應用在底層,硬件操作和高要求的程序優化的場合。驅動程序、嵌入式操作系統和實時運行程序都需要匯編語言。

C高級語言

高級語言并不是特指的某一種具體的語言,而是包括很多編程語言,如流行的java,c,c++C#,pascal,python,lisp,prolog,FoxPro,易語言,中文版的C語言習語言等等,這些語言的語法、命令格式都不相同。

低級語言分機器語言(二進制語言)和匯編語言(符號語言),這兩種語言都是面向機器的語言,和具體機器的指令系統密切相關。機器語言用指令代碼編寫程序,而符號語言用指令助記符來編寫程序。

高級語言與計算機的硬件結構及指令系統無關,它有更強的表達能力,可方便地表示數據的運算和程序的控制結構,能更好的描述各種算法,而且容易學習掌握。但高級語言編譯生成的程序代碼一般比用匯編程序語言設計的程序代碼要長,執行的速度也慢。所以匯編語言適合編寫一些對速度和代碼長度要求高的程序和直接控制硬件的程序。高級語言、匯編語言和機器語言都是用于編寫計算機程序的語言。

高級語言程序“看不見”機器的硬件結構,不能用于編寫直接訪問機器硬件資源的系統軟件或設備控制軟件。為此,一些高級語言提供了與匯編語言之間的調用接口。用匯編語言編寫的程序,可作為高級語言的一個外部過程或函數,利用堆棧來傳遞參數或參數的地址。

4)程序設計步驟

在Linux系統C程序的設計步驟如下:

C程序的設計步驟

2 計算機數據表示

學習編程,從數據表示開始。表示,存儲等。

送入計算機的數值、字母、符號等信息必須轉換成0,1組合的數據形式才能被計算機識別。能夠進行算術運算得到明確數值概念的信息成為計算機數值數據,其余的信息成為非數值數據。

1)數值數據的表示

包括十進制、二進制、十六進制和八進制。

進制轉換是人們利用符號來計數的方法。進制轉換由一組數碼符號和兩個基本因素“基數”與“位權”構成。 基數是指,進位計數制中所采用的數碼(數制中用來表示“量”的符號)的個數。 位權是指,進位制中每一固定位置對應的單位值。

在進行進制轉換時有一基本原則:轉換后表達的“量”的多少不能發生改變。二進制中的111個蘋果和十進制中的7個蘋果是一樣多的。

十進制中的數位排列是這樣的…… 萬 千 百 十 個 十分 百分 千分……

R進制中的數位排列是這樣的……R^4 R^3R^2 R^1 R^0 R^-1 R^-2 R^-3……

十進制---》二進制

對于整數部分,用被除數反復除以2,除第一次外,每次除以2均取前一次商的整數部分作被除數并依次記下每次的余數。另外,所得到的商的最后一位余數是所求二進制數的最高位。

對于小數部分,采用連續乘以基數2,并依次取出的整數部分,直至結果的小數部分為0為止。故該法稱“乘基取整法”

附:原碼 反碼 補碼

符號位正數為0,負數為1。

正數:5 原碼:00000101 反碼:00000101 補碼:00000101

負數:-5 原碼:10000101 反碼:11111010 (原碼除符號為取反) 補碼:11111011 (反碼加1)

2)非數值數據的表示

非數值數據包括文字、符號、圖像、語言和邏輯信息等,也都是以0,1形式存在的。字符數據在機器內也變變換成二進制編碼形式。普遍采用ASCII碼。

可以用命令:man ASCII 查看ASCII信息。

man ASCII

3 程序編譯與調試

1)gcc編譯器

gcc(GNU Compiler)是GNU推出的多平臺編譯器。可將C/C++源程序編譯連接成可執行文件,支持一下后綴:

.c c語言源代碼

.h h程序所包含的頭文件

.i i已經預處理過的C源代碼文件

.s s匯編語言源代碼

.o o編譯后的目標文件

操作命令:

gcc -o hello hello.c

-o 輸出可執行文件

-c 只要編譯器輸出目標代碼(.o文件),而不必輸出可執行文件

-g 用于調試

。/hello 查看輸出結果

案例:編譯上一節《《嵌入式開發之Linux系統中Vi編輯器的使用》》中test.c

結果

Ctrl +l 清屏

換種方式

換種方式結果

2)程序調試

利用__FILE__,__LINE__,__FUNCTION__實現代碼跟蹤調試。

修改test.c代碼

修改test.c代碼

繼續修改test.c代碼

繼續修改test.c代碼

繼續修改test.c代碼

一步一步修改,調試到不報錯為止。

3)C語言基礎

一個程序應該包含兩個部分內容:

對數據的描述:在程序中要指定數據的類型和數據的組織形式,即數據結構。

對操作的描述:即操作步驟,也就是算法。

在PC上編寫的C程序,如何在AMR上運行?

gcc運行版本不一樣,編譯C結果一樣。選擇合適gcc編譯器版本即可。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 物聯網
    +關注

    關注

    2903

    文章

    44274

    瀏覽量

    371241
  • 嵌入式開發
    +關注

    關注

    18

    文章

    1022

    瀏覽量

    47512
  • 馮·諾依曼結構

    關注

    1

    文章

    7

    瀏覽量

    3624
收藏 人收藏

    評論

    相關推薦

    零基礎嵌入式開發學習路線

    Linux基本操作 什么是Linux?為什么要學LinuxLinux是一個操作系統,類似于平常使用的Windows
    發表于 10-25 15:55

    嵌入式開發常用軟件有哪些?

    用于編寫、編譯調試嵌入式系統軟件。它提供了一個集成的開發環境(IDE),包括代碼編輯器、編譯
    發表于 09-09 15:22

    嵌入式linux開發的基本步驟有哪些?

    嵌入式Linux開發是一個復雜的過程,涉及到硬件選擇、操作系統移植、驅動開發、應用程序
    的頭像 發表于 09-02 09:11 ?398次閱讀

    嵌入式linux開發板怎么操作

    嵌入式Linux開發板是一種基于Linux操作系統嵌入式
    的頭像 發表于 09-02 09:09 ?327次閱讀

    嵌入式linux開發板芯片的工作原理

    嵌入式Linux開發板是一種基于Linux操作系統嵌入式
    的頭像 發表于 09-02 09:07 ?335次閱讀

    嵌入式開發前景怎么樣?

    嵌入式開發前景非常廣闊,這主要得益于物聯網、人工智能、大數據等技術的快速發展,以及嵌入式系統在各個領域的廣泛應用。以下是對嵌入式開發前景的詳細分析
    的頭像 發表于 07-10 09:00 ?2499次閱讀
    <b class='flag-5'>嵌入式開發</b>前景怎么樣?

    ARM Cortex-A53嵌入式開發平臺FETT507-C OKT507-C用戶編譯手冊

    電子發燒友網站提供《ARM Cortex-A53嵌入式開發平臺FETT507-C OKT507-C用戶編譯手冊.pdf》資料免費下載
    發表于 04-28 15:20 ?0次下載

    C語言:嵌入式開發的關鍵編譯器角色

    嵌入式程序開發跟硬件密切相關,需要使用C語言來讀寫底層寄存器、存取數據、控制硬件等,C語言和硬件之間由
    發表于 04-26 14:53 ?550次閱讀
    <b class='flag-5'>C</b>語言:<b class='flag-5'>嵌入式開發</b><b class='flag-5'>中</b>的關鍵<b class='flag-5'>編譯</b>器角色

    嵌入式軟件開發應該掌握哪些知識?

    知識點學習 熟悉 Linux 的基本使用對于嵌入式軟件開發至關重要。包括文件系統的管理、用戶權限的控制、軟件包管理等。嵌入式開發人員需要能夠
    發表于 02-19 11:23

    嵌入式自學好書推薦

    令、編輯器VI、編譯器GCC、調試器GDB以及Make項目管理工具、Shell和Makefile腳本編寫等知識,并搭建嵌入式開發環境。推薦書籍:《Linux從入門到精通》。 無論從就
    發表于 01-11 15:13

    嵌入式開發常見的C語言技巧與方法分享

    嵌入式開發,常常要操作寄存器,對寄存器進行寫入,讀出等等操作。每個寄存器都有自己固有的地址,通過C語言訪問這些地址就變得尤為重要。
    的頭像 發表于 12-26 09:55 ?1056次閱讀

    嵌入式開發學習的十三法則分享

    嵌入式開發學習是一個不斷積累和總結的過程,來自一個嵌入式開發高級工程師為我們總結的關于嵌入式開發學習的十三法則,大家不妨參考一下: 一、冗余度法則 在嵌入式
    發表于 12-21 06:32

    【從0開始創建AWTK應用程序編譯應用到嵌入式Linux平臺運行

    。搭建Linux平臺交叉編譯環境在上一篇文章我們介紹了使用AWTK開發簡單的應用并在PC上模擬運行,本篇文章就來介紹一下怎么讓應用程序運行在嵌入式
    的頭像 發表于 12-07 12:08 ?670次閱讀
    【從0開始創建AWTK應用<b class='flag-5'>程序</b>】<b class='flag-5'>編譯</b>應用到<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>平臺運行

    嵌入式開發的交叉編譯詳解

    嵌入式開發,經常會遇到目標平臺資源貧乏,無法運行需要的編譯器。亦或是目標平臺上不允許或不能夠安裝需要的編譯器。這時候就需要使用交叉編譯
    的頭像 發表于 12-01 13:24 ?1153次閱讀
    <b class='flag-5'>嵌入式開發</b><b class='flag-5'>中</b>的交叉<b class='flag-5'>編譯</b>詳解

    嵌入式開發為什么需要輸出調試信息?

    嵌入式開發為什么需要輸出調試信息? 因為輸出調試信息是嵌入式開發中一項非常重要的實踐,它有助于保證軟件的可靠性、穩定性和性能,也是故障排查的關鍵工具之一。
    發表于 11-28 16:46