linux系統怎樣寫單片機程序,單片機知識是Linux驅動開發的基礎之一以及如何學單片機...

這是arm裸機1期加強版第1課第2、3節課程的wiki文字版。

為什么沒前途也要學習單片機?

因為它是個很好的入口。

學習單片機可以讓我們拋開復雜的軟件結構,先掌握硬件操作,如:看原理圖、芯片手冊、寫程序操作寄存器等。在上一節視頻里,我剛把單片機貶得一無是處,說單片機沒前途了,這節視頻,我又要告訴你們,沒有前途,也要學習單片機。為什么?

首先,我說不用學習單片機,是指不要使用老一套得學習方法學習單片機。什么叫老一套的方法?

·硬件上:不要使用C51、STM32這些專用的單片機開發板。如果以后,你不打算從事單片機開發,你用這些芯片干嘛,研究了兩三個月,把這些寄存器都用清楚了,你又用不上,沒必要啊。

· 軟件上:不要使用Keil、MDK等集成度太高的軟件。你用這些軟件,你寫個main()就可以了,然后調用各種庫,進行傻瓜式操作。這些好用的工具,封裝了很多技術細節,使得我們沒法了解裸機、單片機的本質。

以后我們會使用新一套的方法來進行單片機的開發。新一套的方法,我們后面再介紹。

126526839_2_20180307113251823

我們之所以還要學習單片機,是因為它里面的知識,對我們后續學習Linux還是有用的。我們首先來看看,一個Linux系統是怎么一回事。 一個嵌入式Linux系統的軟件組成: 單片機大全Bootloader–>Linux驅動–>Linux APP–>Linux GUI(Android/QT)。我們PC機一上電的時候,黑色屏幕上會顯示BIOS,這個BIOS目的是去啟動Windows內核。Windows內核再掛載C盤(系統盤)、D盤(應用盤),最后再去啟動應用程序,像QQ、網游等。

同樣的道理,我們的Android手機或者工控設備,也有BIOS,但嵌入式Linux系統里面不叫BIOS,叫Bootloader,他的目的是去啟動Linux內核。 它首先也是識別應用程序所在的存儲設備,掛載根文件系統(在Windows系統里面的C盤、D盤,在Linux里面稱為根文件系統)。最后去啟動應用程序。

126526839_3_20180307113251948

仔細的分析下Bootloader,它去啟動內核,它去哪里啟動內核呢? 顯然是去某個地方讀出內核,就比如說BIOS是去C盤上讀出Windows內核,我們的Bootloader是去Flash或者SD卡讀取內核。

因此Bootloader要擁有讀取Flash或者SD卡的能力。有些Bootloader還要顯示logo,因此還要具有操作LCD的能力。Bootloader還要設置開發板的環境,比如,初始化時鐘、初始化內存、還要設置網卡等。這么多事情,都是在Bootloader里面實現的,太復雜了,如果你一來就分析整個Bootloader是非常困難的。

那我們怎么學習呢? 把他拆開,寫出單獨的程序,比如:LED點燈、時鐘、網卡、Flash都單獨寫個程序來練習,這些不就是單片機程序嗎?

所以說,Bootloader是單片機程序的大全。我們為了更好的學習Bootloader,我們應該事先一個一個練習硬件,當我們熟悉每個硬件后,再組合起來,就是一個Bootloader。

126526839_4_20180307113252448

我們再來看看Bootloader啟動內核之后,內核再去掛載根文件系統,意味著內核也要有操作硬件的能力,這就是驅動程序。我們首先來看看一個簡單的驅動程序是什么樣子。首先我們的應用程序是調用open()、read()、write()這些標準的接口去訪問硬件。那么就進入驅動程序里面,驅動程序里面有對應的drive_open()、drive_read()、drive_write()。

最后在驅動程序里面,去配置硬件。比如一個LED點燈驅動,那么drive_open()要把GPIO設置為輸出引腳,drive_read(),返回GPIO狀態,driver_write()則寫GPIO,讓引腳輸出高電平或者低電平。

126526839_5_20180307113252605

對于我們的LED驅動程序,你需要提供drive_open()、drive_read()、drive_write()這些接口,這就是它的框架。具體的怎么操作硬件,就是硬件操作。所以說,我們事先在單片機里面,熟悉熟練的掌握硬件操作。即驅動程序的組成:

驅動程序=軟件框架+硬件操作

你需要學會看原理圖、看硬件怎么連接、看芯片手冊、知道怎么讀寫寄存器。這一切都可以先在單片機里面學習,去掌握。以后學習Linux驅動時,把重點放在軟件框架就行了。

我們可以事先學習單片機,單片機的學習可以讓我們先拋開復雜的軟件結構,先掌握硬件的操作,如:看原理圖、芯片手冊、寫程序操作寄存器等。這就是為什么單片機沒有前途,我們也要學習。是因為他里面涉及的硬件操作,對我們后續的學習,非常有用處。

現在我們知道了,我們學習單片機,不是為了掌握單片機的開發技能,而是為了掌握Bootloader,掌握硬件操作。

126526839_6_20180307113252761

單片機和Linux都想學_換個兩全的方法學習單片機

本節教你如何學習單片機,如何選擇合適的開發板和開發工具。

現在我們知道單片機是要學習的,那么怎么去學習單片機?在上一課我們說不要使用老一套的方法學習,實際上是指的兩個問題。

第一:選擇什么開發板;

第二:使用什么開發工具;

我們學習單片機的目的是干嘛?目的是為后續嵌入式Linux學習服務。在這條學習線路上:

單片機->bootloader->Linux系統/驅動->APP(QT)可以使用同一套開發板。

我們選擇開發板的原則是:資料豐富。

126526839_7_20180307113252870

開發板首推三星(SAMSUNG)系列的,資料最開放,

*有S3C2440、S3C6410、S5PV210、Exynos4412;*然后是德州儀器(TI)的,TI開始不開放資料,現在逐漸公開了,有AM437X、AM335X;*然后是飛思卡爾(freescale),有iMX6;*還有其它國產芯片:全志、瑞芯微;

我們用百度進行搜索,看哪個資料最豐富。結果如下:

126526839_8_20180307113252980

再在搜索關鍵詞中加入“教程”后,S3C2440的搜索結果比AM335X更多,因此S3C2440的資料仍是最多的,TI的營銷更好,當然,TI作為工控板,其用戶也是很多的。

所以,從教程的豐富程度來看,S3C2440為首選開發板;

我們后面會考慮使用TI的芯片重新錄制一套視頻,但需要2-3年的功夫,所以,現在還是使用S3C2440吧。

現在普遍有個錯誤觀點:S3C2440過時了,它還是ARM9內核,現在Cortex-A7、Cortex-A8、Cortex-A9、Cortex-A15都出來了,它的性能太差了。性能差沒錯,但它是否過時了呢?

那要看學到的知識是否過時。

我們首先來看看一個芯片是怎么組成的,里面有CPU、外設串口、I2C、SPI、LCD等。

126526839_9_20180307113253167

我們寫程序的時候,是去操作這些模塊的寄存器,訪問這些模塊,并不是去操作CPU。等你工作的時候,你使用不同的芯片,那么差別在于這些模塊,這些硬件的操作,差別不在CPU操作,你寫程序的時候,根本不涉及CPU的內部機制。

**不同芯片的差別:在于外設操作,不在于CPU,寫程序幾乎不涉及CPU,只有涉及中斷時,才會跟CPU的機制有點關系,但是不同CPU的架構差異很小,并且我們后面開發Linux驅動時,內核已經幫我們做好了這些處理,根本不需要去關心。**

從上一課我們知道,驅動=軟件框架+硬件操作。這個軟件框架對于所有的芯片都是一樣的,因為都是用Linux內核。而這個硬件操作,你在2440上掌握了串口操作,I2C操作、SPI操作,掌握了這些硬件的語言,你換一種芯片,是完全類似的。

126526839_10_20180307113253323

我假設你選擇了2440開發板,那么怎么使用2440開發板來學習單片機的開發呢?又使用什么開發工具呢?以前在Windows開發的時候,我們使用ADS、Keil、MDK等,你直接寫個main()函數,所有的細節都幫你實現了,誰來調用main()函數,有他幫你做了。這main()所生成出來的代碼,怎么放入到內存里面,這工具也幫你做了,我們基本上只需要寫main()函數,只需要寫C語言就行了。但是這里掩蓋了太多的技術細節,你看看我們官網->學習路線的這篇文章,里面有個比較:

①Windows下的單片機學習,深度不夠Windows下有很好的圖形界面單片機開發軟件,比如keil、MDK等。

它們封裝了很多技術細節,比如:

你只會從main函數開始編寫代碼,卻不知道上電后第1條代碼是怎么執行的;

你可以編寫中斷處理函數,但是卻不知道它是怎么被調用的;

你不知道程序怎么從Flash上被讀入內存;

也不知道內存是怎么劃分使用的,不知道棧在哪、堆在哪;

當你想裁剪程序降低對Flash、內存的使用時,你無從下手;

當你新建一個文件時,它被自動加入到工程里,但是其中的機理你完全不懂;

②基于ARM+Linux裸機學習,可以學得更深,并且更貼合后續的Linux學習。

實際上它就是Linux下的單片機學習,只是一切更加原始:所有的代碼需要你自己來編寫;哪些文件加入工程,需要你自己來管理。

在工作中,我們當然傾向于使用Windows下更便利的工具,但是在學習階段,我們更想學習到程序的本質。

一切從零編寫代碼、管理代碼,可以讓我們學習到更多知識:

你需要了解芯片的上電啟動過程,知道第1條代碼如何運行;

你需要掌握怎么把程序從Flash上讀入內存;

需要理解內存怎么規劃使用,比如棧在哪,堆在哪;

需要理解代碼重定位;

需要知道中斷發生后,軟硬件怎么保護現場、跳到中斷入口、調用中斷程序、恢復現場;

你會知道,main函數不是我們編寫的第1個函數;

你會知道,芯片從上電開始,程序是怎么被搬運執行的;

你會知道,函數調用過程中,參數是如何傳遞的;

你會知道,中斷發生時,每一個寄存器的值都要小心對待;

你掌握了ARM+Linux的裸機開發,再回去看Windows下的單片機開發,會驚呼:怎么那么簡單!并且你會完全明白這些工具沒有向你展示的技術細節。

如果我們基于ARM+Linux,不使用這些Windows工具,你可以學得更深,并且單片機的大全Bootloader,他就是ARM+Linux開發的,他并不使用Windows下的工具。

你基于ARM+Linux學裸板、學單片機,你可以學得更多,因為我們一切都從零開始的。我們既管理這些代碼,也可以知道芯片上電的時候做了什么事情,知道程序自己怎么把自己讀到內存,且知道怎么去規劃內存,知道怎么代碼重定位……

我說的這些概念,你可能聽都沒聽過,這是因為Windows下這些好用的工具把這些統統都給屏蔽了。

我們使用ARM+Linux進行裸板開發,一旦掌握了ARM+Linux開發這套機制,再回過頭去看這些Windows工具、看STM32的話,你只需要幾分鐘就可以搞定。并且你可以無縫進入后續的學習,因為你已經熟練掌握了Linux的操作環境,后面的Bootloader是在Linux下開發的,后面的Linux驅動也是在Linux下開發的。

126526839_11_20180307113253448

所以我們怎么去學習單片機的開發呢?

使用S3C2440開發板,在Linux環境(Ubuntu)下使用arm-Linux-gcc工具來編譯程序。你編寫代碼的時候,可以使用Windows下各種好用的工具,文本工具等,但編譯的時候,使用arm-Linux-gcc來編譯。

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

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

相關文章

python教程循環語句_Python教程:關于Python 循環語句

Python 循環語句本章節將向大家介紹Python的循環語句,程序在一般情況下是按順序執行的。編程語言提供了各種控制結構,允許更復雜的執行路徑。循環語句允許我們執行一個語句或語句組多次,下面是在大多數編程語言中的循環語句的一般形式&#x…

math.pow int_Java Math類static int min(int i1,int i2)與示例

math.pow int數學類靜態int min(int i1,int i2) (Math Class static int min(int i1 , int i2) ) This method is available in java.lang package. 此方法在java.lang包中可用。 This method is used to return the minimum one of both the given arguments or in…

bat 批處理 常用命令和亂碼問題

為什么80%的碼農都做不了架構師?>>> rem echo off ECHO OFF XCOPY E:\test.bat D:\ IF ERRORLEVEL 1 ECHO 文件拷貝Failure IF ERRORLEVEL 0 ECHO 文件拷貝Success :start set /p first"1記事本,2遠程:" if %first% LEQ 2 (IF %first% …

SuperMap iServer發布的ArcGIS REST 地圖服務如何通過ArcGIS API加載

作者:yx 文章目錄 一、發布服務二、代碼加載三、結果展示 一、發布服務 SuperMap iServer支持將地圖發布為ArcGIS REST地圖服務,您可以在發布服務時直接勾選ArcGIS REST地圖服務,如下圖所示: 也可以在已發布的地圖服務中&#x…

c語言中的運算符及其含義_按位運算符及其在C語言中與Example一起使用

c語言中的運算符及其含義1)&(按位與) (1) & (bitwise AND)) It does AND on every bit of two numbers. The result of AND is 1 only if both bits are 1. 它對兩個數字的每一位進行“與”運算。 僅當兩個位均為1時,AND的結果才為1。 Example: 例&…

能上網的Linux系統,那一款linux能上網

zhoushao12 于 2009-02-24 19:13:07發表:linux日常使用中,最重要的就是網絡(本人覺得)特別時ubuntu .但是現在電信偏偏搞什么賬號加密要用互聯星空軟件才可以撥號,更可惡的是這X軟件只有Windws版的!! 使得在linux下撥號上網變得十分麻煩!在網上找了很久終于找到解決方法!!下面拿…

李洪強經典面試題37

1.寫一個NSString類的實現 (id)initWithCString:(c*****t char *)nullTerminatedCString encoding:(NSStringEncoding)encoding; (id) stringWithCString: (c*****t char*)nullTerminatedCString encoding: (NSStringEncoding)encoding { NSString *obj; obj [self al…

new file會創建文件嗎_Rust 文件系統處理之文件讀寫 Rust 實踐指南

Rust 中,文件讀寫處理簡單而高效。代碼也很緊湊,容易閱讀。我們從讀取文件的字符串行、避免讀取寫入同一文件、使用內存映射隨機訪問文件這三個文件處理中的典型案例來了解一下。文件處理場景大家都很熟悉,因此閑言少敘,直接看代碼…

python 打印文件名_在Python中打印文件名,關閉狀態和文件模式

python 打印文件名Prerequisite: Opening, closing a file/open(), close() functions in Python 先決條件: 在Python中打開,關閉文件/ open(),close()函數 1)文件名(file_object.name) (1) File name (file_object.name)) To get the file …

linux搭建直播步驟,Linux 下 nginx + rtmp 搭建直播服務

簡單粗暴直接上步驟吧:注 : 以下示例使用的是nginx(版本1.15.3) rtmp(版本1.2.1)下載nginx和rtmp模塊下載nginx解壓? tar xvf nginx-1.15.3.tar.gz下載nginx rtmp模塊解壓? tar xvf v1.2.1進入nginx目錄? cd nginx-1.15.3執行:#--add-module 指向rtmp模塊目錄,ad…

【Maven學習筆記(二)】Maven的安裝與配置

為什么80%的碼農都做不了架構師&#xff1f;>>> 1、默認本地倉庫路徑 C:\Users\97449\.m2\repository 2、修改本地倉庫路徑 打開D:\apache-maven\conf\settings.xml <?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apa…

npm 全局安裝vuecli報錯_cnn explainer本地使用--被npm坑慘

最近在知乎上面看到&#xff0c;看到一個cnn解釋器&#xff0c;把每個步揍都很清楚的展示了出來&#xff0c;我想自己搞來玩玩。第一次使用npm&#xff0c;很多地方不會&#xff0c;第一步&#xff1a;先在網頁上下載下來cnn_explainer&#xff0c;然后解壓在沒有中文路徑的文件…

Python程序從給定的N個數字中找到最大倍數

Here, we will be framing code for finding the maximum multiple of a number x from a given set of a number (set of 5 numbers in this program). 在這里&#xff0c;我們將使用成幀代碼&#xff0c; 從給定的一組數字(此程序中的5個數字組成的集合)中找到x的最大倍數 。…

ubuntu linux本地源,如何制作UbuntuLinux操作系統的本地源?

最簡單制作本地源的方法&#xff1a;在packs文件夾中有如下兩種類型的包&#xff1a;一種是。deb包(全部的依賴包和軟件包)&#xff0c;另一種是Packages。gz著重介紹一下第二個類型的包&#xff1a;在這個包中包含了必需的軟件包列表和依賴信息。這個包是后生成的&#xff0c;…

openmpi安裝_Intel Parallel Studio XE 2019安裝設置

1.Intel Parallel Studio XE 2019簡介Intel Parallel Studio XE 是Intel在單獨一款軟件開發套件中整合了英特爾公司業界領先的 C/C 和 Fortran 編譯器、性能和MPI并行庫、錯誤檢查、代碼健壯和性能分析的工具&#xff0c;有助于大幅提升應用程序性能&#xff0c;同時提高代碼質…

Python | 在列表中指定索引處添加元素的程序

Given a list and we have to add an element at specified index in Python. 給定一個列表&#xff0c;我們必須在Python中的指定索引處添加一個元素。 list.appened() Method is used to append/add an element at the end of the list. But, if we want to add an element …

Linux九大哲學原理,Linux/Unix設計思想(全新闡釋開源哲學,Jon “maddog” Hall作序推薦)...

《Linux/Unix設計思想》第1章  Unix哲學&#xff1a;集思廣益的智慧    11.1  NIH綜合征    21.2  Unix的開發    21.3  Linux&#xff1a;一個人加上一百萬人的智慧    41.4  Unix哲學概述    5第2章  人類的一小步    92.1  準則1&#xff1a;小即是美  …

[Android] 開源View組件(一)

Material Design系列&#xff0c;自定義Behavior實現Android知乎首頁 仿今日頭條最強頂部導航指示器&#xff0c;支持6種模式 MagicIndicator系列之一 —— 使用MagicIndicator打造千變萬化的ViewPager指示器 Android 優雅的為RecyclerView添加HeaderView和FooterView Android …

sql server修改字段編碼格式_關于MySQL如何修改character_set_client的編碼問題

問題引入&#xff1a;我們經常會遇到一些向MySQL數據庫中插入中文&#xff0c;但是select出來的時候&#xff0c;卻發現是亂碼的情況。如我們向表a出入這樣一段記錄&#xff1a;iinsert into a values(‘你好helloworld你好’,’helloworld’);可能當你訪問它的時候&#xff0c…