1. 程式人生 > >雜談 | Why RTOS & The Art Of Coding & Machine Learning & Linux

雜談 | Why RTOS & The Art Of Coding & Machine Learning & Linux

這裡用來記錄學習路上偶爾一些感想以及大佬分享的一些知識~

文章目錄

1.Why RTOS

今天偶然間在Moore8看到了armink大神的直播分享為什麼你應該使用RTOS,回想一下自己在嵌入式這條路上的所得,頗有感觸,主要有兩點:

  • Why RTOS
  • The Art Of Coding

1.1.嵌入式系統軟體

1.1.1.輪詢系統

輪詢系統是在裸機程式設計的時候,先初始化好相關的硬體,然後在一個大迴圈裡順序的做各種事情

  • 虛擬碼
int main(void)
{
	/* 硬體初始化 */
	HardWareInit();
	
	/* 主迴圈 */
	while(1)
	{
		/* 處理事情1 */
		DoSomething1
(); /* 處理事情2 */ DoSomething2(); /* 處理事情3 */ DoSomething3(); } }
  • 優點 ——程式碼結構簡單,適合一些簡單且沒有外部事件的應用
  • 缺點
  1. 耗費CPU:delay()函式大量佔用CPU,導致CPU有很長時間處於空迴圈狀態
  2. 實時性差**:CPU順序處理任務,不能及時響應外部事件
  3. 可移植性差**:裸機程式一般適應特定晶片,更改晶片時程式需要移植
  4. 模組化程度低:一個模組的功能往往是特定的,移植性差

1.1.2.前後臺系統

前後臺系統是在輪詢系統的基礎上加入中斷,外部事件的響應在中斷裡(前臺)完成,事件處理回到輪詢系統(後臺)中完成。

  • 虛擬碼
int main(void)
{
	/* 硬體初始化 */
	HardWareInit();
	/* 中斷初始化 */
	InterruptInit();
	
	/* 主迴圈 */
	while(1)
	{
		/* 如果事件有響應,處理事情1 */
		if(flag1)
			DoSomething1();
		
		/* 如果事件有響應,處理事情2 */
		if(flag2)
			DoSomething2();
			
		/* 如果事件有響應,處理事情3 */
		if(flag3)
			DoSomething3();	
}

/* 中斷服務程式 */
void ISR1(void)
{
	flag1 = 1;
	//DoSomething1();	//如果處理時間短則在中斷中完成
}
void ISR2(void)
{
	flag2 = 1;
	//DoSomething2();	//如果處理時間短則在中斷中完成
}
void ISR3(void)
{
	flag3 = 1;
	//DoSomething3();	//如果處理時間短則在中斷中完成
}
  • 優點
  1. 實時性提高:可以及時響應外部事件(不一定及時處理)
  2. 可以通過中斷優先順序設定及中斷巢狀完成大多數任務可以通過中斷優先順序設定及中斷巢狀完成大多數任務
  • 缺點
  1. 只能及時響應,不能及時處理
  2. 可移植性差:每個晶片的中斷系統差異更加明顯,所以可移植性更差

1.1.3.多執行緒系統

多執行緒系統中將程式主體分割成一個個獨立的互不干擾的無限迴圈且不能返回小程式,即執行緒。

  • 虛擬碼
int main(void)
{
	/* 硬體初始化 */
	HardWareInit();
	
	/* OS初始化 */
	RTOSInit();
	
	/* OS啟動,開始多執行緒排程,不再返回 */
	RTOSStart();
}
/* 多個執行緒來處理事情 */
void DoSomething1(void)
{
	/* 無限迴圈,不能返回 */
	while(1)
	{
		if(flag1)
		{
			/* 處理事情 */
		}
	}
}
void DoSomething2(void)
{
	/* 無限迴圈,不能返回 */
	while(1)
	{
		if(flag2)
		{
			/* 處理事情 */
		}
	}
}
void DoSomething3(void)
{
	/* 無限迴圈,不能返回 */
	while(1)
	{
		if(flag3)
		{
			/* 處理事情 */
		}
	}
}

/* 中斷服務函式用於響應事件 */
void ISR1(void)
{
	flag1 = 1;
}
void ISR2(void)
{
	flag2 = 1;
}
void ISR3(void)
{
	flag3 = 1;
}
  • 優點
  1. 實時性大幅提高:既可以及時響應,也可以及時處理
  2. 併發性高
  3. 可重用性提高:不需要重複造輪子,所有的應用都是在作業系統之上完成的,只需要作業系統適配晶片即可可重用性提高:不需要重複造輪子,所有的應用都是在作業系統之上完成的,只需要作業系統適配晶片即可
  4. 程式設計難度降低:不需要像前後臺系統一樣精心設計程式程式設計難度降低:不需要像前後臺系統一樣精心設計程式
  • 缺點
  1. 作業系統自身會帶來額外的FLASH和RAM開銷

1.2.RTOS的意義

1.2.1.RTOS對於團隊的意義

  • 團隊效率更高
  • 模組功能分工明確
  • 模組之間依賴性低

1.2.2.RTOS對於個人的意義

  • 更高階的軟體知識
  • 使用作業系統完成更高階的應用

1.3.主流RTOS對比

μC/OS FreeRTOS RT-Thread
效能
程式碼可讀性 高(類Unix風格)
元件豐富性 超過50種可重用元件
開發資料 全面 全面 書籍較少
版權 商業收費 開源免費 開源免費
社群活躍度

2.The Art Of Coding

在嵌入式軟體這塊,聯絡大神的分享和我自己的歷程,我覺得有兩點很重要:

  • 程式碼可重用性
  • 程式碼風格

3.Machine Learning

對於機器學習這塊,其實我是不太想玩的,一方面是因為數學能力不太好,另一方面是因為以搞硬體的,凡事都想探究清楚原理,對於呼叫幾個api玩玩應用的事情沒有一點興趣,然而事與願違,學校剛剛學完python的課,參加FPGA邀請賽就需要在Pynq平臺上實現一個神經網路CNN加速,IT界說得好,站在風口上,豬都會飛,在人工智慧的浪潮下,不飛都不行,在Moore8開始了愉快的玩耍之旅,大致安排如下:

在曾新老師的TensorFlow課程引言(Introduction)課上,大神不愧是大神,能在很短的時間向別人普及一個知識,收穫頗豐~

  • 人工智慧是大資料嗎?人工智慧是機器學習嗎?
  • 聊天機器人有感情嗎?
  • 能否通過歷史的彩票資料預測接下來的開獎號碼?

1956年夏農和其它幾位年輕的科學家首次提出人工智慧的概念,這個時候人們的目標是讓機器可以像人類一樣去思考,也就是人工智慧1.0時代,即鳥飛派,這個時候人工智慧 ≠ 大資料 ≠ 機器學習,只是讓機器去模仿人的行為和思想,後來到了1966年,誕生了人工智慧2.0時代,人工智慧變成了資料派,採用了基於資料和統計的方法,後來在1970-1990年代之間,兩派之間各有爭執,資料派逐漸超越了鳥飛派,直到2005年google基於統計+資料的翻譯系統誕生後,這個爭論畫上了句號,此後的人工智慧領域都是以資料說話的資料派,這個時候人工智慧 = 大資料 = 機器學習
資料派的研究方法如下:

  1. 獲取資料
  2. 建立模型
  3. 修改引數
  4. 驗證模型

這其中,建立模型和修改引數是最重要的,在對很多應用場景建模的時候,需要建立不用的模型去適應,常見的模型有以下三種:

DNN RNN CNN
深度神經網路 迴圈神經網路 卷積神經網路
語音處理 影象處理

這個時候再來回答前面的三個問題,相信心中都已有答案~最後借用老師在課上引用的一句話:

The mystery of machine learning is not in the code but is in the data
機器學習的神奇之處不在程式碼中,而在資料裡。

數學之美(第二版) PDF
machine-learning - coursera

4.Linux

對於任何一個研發人員來說,Linux是最強大的作業系統,沒有之一!為什麼這麼說呢,原因有下:

  • 高效: 簡單粗暴有效的命令可以高效的完成很多的日常開發工作
  • 穩定:Linux執行的穩定效能用來作後臺伺服器再好不過了
  • 安全:Linux開源,由很多的開發者共同維護,所以可利用漏洞少之又少
  • 開放:Linux原始碼開放
  • 多使用者:真正的可以多使用者同時工作

那麼這麼強大的一個系統因何而來呢?

1969年AT&T(美國貝爾實驗室)有兩個人——Ken,Dennis為了適配他們的遊戲而研發出了Unix作業系統,並且拋棄了彙編,順便發明了C語言,用C完成了整個作業系統,而Unix就是這個話題中的萬惡之源~
其實Unix是開源免費的,因為它只是單機版,沒有太大的作用,一段時間後在UC Berkeley誕生出了偉大的TCP/IP協議,使得所有的計算機都可以很好地連通,Unix演變成了BSD,以至於後來的FreeBSD,NetBSD,MacOS,iOS等等……
然而別忘了,這一切的起源是Unix,當然不可能看著BSD就這麼火,Unix開始收費了,對於公司而言,收費就收費唄,無非成本價有點高,然而別忘了還有我們這群苦逼的學生,又想學習使用Unix,又買不起Unix,所以美國一個電腦科學教授Andrew Tnanebaum根據Unix寫出了Minix作業系統用來教學,青出於藍而勝於藍,1991年美國大二學生Linus Torvalds覺得Minix不太行,所以自己寫了一個Linux核心,然而它再強大,也只是一個核心~
湊巧的是,在那個年代GNU(GNU is Not Uinx)也是一個致力於自由的類unix作業系統,它發展了幾乎核心以外的所有軟體,並且建立了通用軟體許可證GPL(General Public License) —— 免費得到原始碼永久使用權、可以任意修改、但是有義務公開修改後的程式碼~
於是乎,Linux和GNU一拍即合,天造地設的一對就這樣誕生了,強強聯手,演變成現在最強大的作業系統 —— GNU/Linux

當然,Linux核心和GNU合起來也還不夠,對於使用者的使用,還應包含命令列Shell或桌面環境(KDE、GNOME、Unity等),所以就衍生出來很多的Linux發行版,主要有三大分支:

  • redhat
  • debian
  • openSUSE

這些發行版如果按應用場景來分,主要有兩類:

  • 以命令列Shell為主的伺服器發行版:CentOS/RHEL、openSUSE、Ubuntu Server
  • 以桌面環境為主的桌面發行版:Ubuntu、Linux Mint、Fedora

如此強大有效的一個作業系統,僅作學習之用的話選擇其中一個自己喜歡的發行版就好,我的學習旅程是:
首先在虛擬機器上學習:

  • 會操作:基本Linux命令,Linux檔案系統
  • 會程式設計:shell指令碼程式設計,基本C程式設計,網路程式設計,GUI程式設計

然後在開發板上學習,選用ARM9或ARM11:

  • 會啟動:移植併成功啟動
  • 會驅動:可以編寫常見驅動程式