Friday, October 6, 2017

Cloud Atlas Original Soundtrack

Cloud Atlas Original Soundtrack

一、資訊

電影:雲圖(Cloud Atlas)
配樂作家: Tom Tykwer、Johnny Klimek、Reinhold Heil
發行:Sony Music
CLOUD ATLAS ORIGINAL MOTION SOUNDTRACK

二、心得感想

這部電影其實我沒看過,我當初是因為偶然聽到了這部電影的配樂<Cloud Atlas Sextet>和<Prelude: The Atlas March>後跑去找了這部電影的原著小說來看。這部電影小說的敘事手法十分有趣。她其實六段故事以A-B-C-D-E-F-F-E-D-C-B-A的方式敘述的,而且每段故事時間相差很久,但是前段的故事會有部份連結到下一段,表現出"輪迴"的感覺。當然這種敘事方式拍成電影爆炸機率相當高的,而電影得票房也真的炸了。

如同敘事手法,配樂本身也是有A-B-C-D-E-F-F-E-D-C-B-A的曲目編排。有多首配樂的風格式成對的。不過其中最引人注目的仍是書中提到的<雲圖六重奏>,這首貫串整個故事的曲子。也就是<Prelude: The Atlas March>,之後包括<Cloud Atlas Opening Title>、<Cloud Atlas Finale>、<The Cloud Atlas Sextet for Orchestra>和<Cloud Atlas End Title>,我覺得光片尾幾首曲子的編排與交響編曲,這張專輯就很有收藏的價值了。當然片中的<Templa of Sacrifice>和<All Boundaries Are Conventions>也是我喜歡的曲子。不過剩下幾段的風格我不是很喜歡。

不過這張專輯聽的時候有發現一個問題,最後幾首有時會有不名聲響,我不確定是不是錄音失誤,還是刻意的。

三、曲目

  1. Prelude: The Atlas March
  2. Cloud Atlas Opening Title
  3. Travel to Edinburgh
  4. Luisa’s Birthmark
  5. Cavendish In Distress
  6. Papa Song
  7. Sloosha’s Hollow
  8. Sonmi-451 Meets Chang
  9. Won’t Let Go
  10. Kesselring
  11. The Escape
  12. Temple Of Sacrifice
  13. Catacombs
  14. Adieu
  15. New Direction
  16. All Boundaries Are Conventions
  17. The Message
  18. Chasing Luisa Rey
  19. Sonmi’s Discovery
  20. Death Is Only A Door
  21. Cloud Atlas Finale
  22. The Cloud Atlas Sextet for Orchestra
  23. Cloud Atlas End Title

Wednesday, October 4, 2017

The Imitation Game Original Soundtrack

The Imitation Game Original Soundtrack 

一、資訊

電影:模仿遊戲(The Imitation Game)
配樂作家:Alexandre Desplat
發行:Sony Music
THE IMITATION GAME

二、心得感想

這部電影我本身蠻喜歡的,因為我是資訊背景,這故事本身就有親切感(讀過資工系的或多或少聽過圖零機吧),雖然劇情魔改了Alan Turing的故事,但是改的還算流暢。唯一需要吐嘈的應該就是把發現德軍密碼會有固定內容,而這些內容可以用來剪枝(替除不可能發生的組合)部份改的太戲劇化了。

音樂部份為了呈現Alan Turing數學家的特質,讓音符很離散,很像一群數字在舞動。尤其在<Crosswords>、<Running>、<Decrypting>會有一種問題被拆解被處理的感覺。當然主題旋律<The Imitation Game>和<Alan Turing's Legacy>寫的很有味道。我當初在戲院看到這部電影時有被這兩首曲子觸動。<The Apple>、<Farewell To Christopher>是片中圖靈生命最悲情的時刻,這些悲傷讓我們對圖靈,還有對同性戀的迫害起了反思。

由於我仍是學生,財力不是十分充足,當初看完這部電影後一直去spotify反覆聽這片原聲帶,最後才決定買實體的,以更好的音質品味這張專輯。

三、曲目

  1. The Imitation Game
  2. Enigma
  3. Alan
  4. U-Boats
  5. Carrots And Peas
  6. Mission
  7. Crosswords
  8. Night Research
  9. Joan
  10. Alone With Numbers
  11. The Machine Christopher
  12. Running
  13. Christopher Is Dead
  14. Decrypting
  15. A Different Equation
  16. Becoming A Spy
  17. The Apple
  18. Farewell To Christopher
  19. End Of War
  20. Because Of You
  21. Alan Turing’s Legacy


Friday, September 8, 2017

Arduino TLC5940與伺服馬達

Arduino TLC5940與伺服馬達

TLC5940介紹


TLC5940是TI的16 channel LED驅動晶片。可以支援同時16通道的PWM灰階輸出,解析度為4096階。同時有兩種模式 12 bit (4096 Steps) Grayscale PWM Control 和 Dot Correction。

重要參數:
供應電壓:Vcc  => 3V ~ 5.5V
操作界面:Serial Data
資料傳輸速率:~30MHz
LED可驅動最大電壓:~17V
LED可驅動電流:0~60mA(Vcc < 3.6V ) 0~120mA(Vcc > 3.6V)

由於是輸出PWM,也可以拿來做PWM擴充。所以也可以拿來推Servo摟。

TLC5940 Ardunio library

在Ardunio IDE中可以透過library manager找到。而github上也有連結:

TLC5940電路接法

以下以PDIP封裝的TLC5940為例還有使用Arduino Mega2560。
TLC5940 Ardunio Mega2560
SIN(pin 26) MOSI(pin 51)
SCK(pin 25) SCLK(pin 52)
XLAT(pin 24) OC1A(pin 11)
BLANK(pin 23) OC1B(pin 12) + 1K ohm上拉電阻
GSCLK(pin 18) OC2B(pin 9)
VPRG(pin 27) VPRG(pin 50) or GND
XERR(pin 16) XERR(pin 10) or GND
SIN(pin 26) SIN(pin 51)
IREF(pin 20) 1K ohm下拉電阻
VCC(pin 21) 5V
GND(pin 22) GND

至於out0到out15的接法比較特別。
這樣即可完成Servo與TLC5940的電路。

程式部份

這部份可以直接使用範例。來做實驗。開啟方式:
Ardunio IDE-> Files-> Examples -> TLC5940 -> Servo


深入探討Ardunio TLC5940 library


  1. pinout
    pinout部份在library中的pinout中可以找到,包含各種Ardunio板子。
    這些腳位是不能隨便更改的,因為library使用了Arduino的硬體週邊做加速。
    EX: PWM SPI等。
  2. Serial Data
    Serial Data有兩種模式:
    1. SPI:因為Serial Data shift-in的方式其實就是SPI的MOSI和SCK腳位在做的事。
               所以透過SPI可以加速資傳輸速率。溝通方式可以在http://www.ti.com/lit/ds/symlink/tlc5940.pdf中見到。
    2. bit-bang:直接對GPIO操作(產生SCK的clock和data)來傳輸資料,只是較慢,但可以更換腳位。
  3. GSLCK XLAT與blank
    這裡是利用Ardunio的硬體pwm(output compare pwm)來辦到的,以GSCLK為例,她產生4096*50HZ的clock(4096為解析度,50為Servo是20ms一個週期)。在透過XLAT(鎖住更新資料),blank清除GS counter。

Thursday, September 7, 2017

STM32 LCD 使用 BSP 與STM32CubeMX

STM32 LCD 使用 BSP 與STM32CubeMX


本文以STM32F469NI Discovery為範例。目標是以STM32F469的BSP lib操作STM32F469 Discovery的TFT-LCD。

STM32CubeMX configuration

先將周邊開啟如以下設定。

LTDC : LCD-TFT Display Controller,硬體優化的LCD控制介面。
DSIHOST: Display Serial Interface Host,由MIPI alliance建立的行動顯示protocol。提供高速的LCD framrate。
DMA2D : Chrom-Art Accelerator™ 用來做圖像操作的DMA,可以做出限定範圍的填滿等記憶體操作。適用AHB bus,可以將結果導入AHB slave端(DSI HOST)。
RCC : LTDC , DSI HOST需要時序。
I2C : 觸控需要。(stm32f469_discovery.c需要I2C)。
FMC : 用BSP時可以選擇使用SDRAM存儲資料。


時脈控制,由於開啟HSE,所以DSI有了clock source。(這部分要注意STM32CubeMX產生出來的程式碼是否會讓clock超過硬體限制)。
選擇RGB565為color mode。
Pixel format選用ARGB8888。


引入Driver

在專案資料夾下的Drivers/BSP/Components/otm8009a 中,將該路徑下的otm8009a.c 加入keil專案。otm8009a為STM32F469_Discovery上的觸控顯示螢幕。
在專案資料夾下的Drivers/BSP/STM32469I_Discovey中,將該路徑下的stm32469i_discovery.c、stm32469i_discovery_lcd.c、stm32469i_sdram.c加入keil專案中。
去下載STM32CubeMX STM32F4 firmware link: http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32cube-embedded-software/stm32cubef4.html
解開來,將Utilities資料夾放入project根目錄。

新增好的檔案架構如下。
在options for target -> C/C++ -> include path中加入那兩個資料夾。如下:

程式撰寫

main.c中include "stm32469i_discovery_lcd.h"
其中的初始流程為:

  1. 初始化LCD =>以BSP_LCD_Init()
  2. 選擇LCD layer => BSP_LCD_SelectLayer()
  3. 啟動LCD => BSP_LCD_DisplayOn()
剩下繪製部分所提供的函式都在stm32469_discovery_lcd.h中。
不過功能僅有基本。

成果


Monday, September 4, 2017

STM32CubeMX初探

STM32CubeMX初探

STM32CubeMX是code generator(程式碼產生器),與Microchip code configurator一樣。目標是用圖形化方式規劃MCU的外部模組與內部Middlewares設定。我個人覺得使用STM32cubeMX可以讓整個開發更加"工程化",產生的專案會更有組織。

一、安裝與更新

安裝網址如下:http://www.st.com/en/development-tools/stm32cubemx.html

下載完成後,桌面會產生兩個icon,一個是STM32CubeMX,一個是STM32CubeUpdater。
開啟STM32CubeUpdater,選擇所需的STM32系列library,即可完成相依library建設。更新也是透過此工具。

二、基本使用(以STM32F469NI_Discovery為範例)

開啟STM32CubeMX,選擇New Project->選擇晶片或是開發版即可進入。如下圖畫面。

# pinout


左邊為周邊模組(peripheral)綠色為已經啟用。左邊為腳位設定(綠色為已規劃,橘色為開發版已經硬體連接的腳位但未啟用)。左鍵點選腳位可以開啟小選單選擇所需腳位定義。
透過上方tab進入進階規劃。

#Clock Configuration

這個tab將STM32的所有時序和PLL、prescaler列出整理成流。
幾乎所有設定都可以修改。後方藍色框框中可以直接鍵入所需Clock值,系統會幫你調整整個流。當然有硬體限制,STM32cubeMX會提醒你,當你出現錯誤設定會有警示。


#Configuration

這個tab將前面所開啟的周邊模組列出,每個都可點選以進階設定。更詳細的設定之後文章會介紹。

#power consumption calculator

這個tab可以幫助計算能源消耗,還可以計算各個環境下的情況(就是把datasheet後面的數據列出),不過無法計算開發版的能源消耗,僅限晶片本身。

# project Settings

點選上方menu->Project->Project Settings,開啟以下專案設定。
基本上就按照環境選了。不過這裏特別提一個選項,我覺得對後續開發很以幫助。
紅框中選項可以將周邊裝置的初始化函式(以MX_為前綴的函式)產生成獨立的.c/.h配對,避免全部Init函式都在main中,造成main function很肥大,而且當你有多個source檔(並非主要程序都集中在main.c)時,可以讓其他函式更方便引用這些初始程序。


#產生Project與報告

紅框中這兩個東西可以產生Project 與報告。

#結果與檔案樹(以ARM MDK keil為例)


User裡面是初始化函式和main.c。可以發現main.c中有一堆USER code begin和USER code end的註解,這些註解是希望user將自己的code加入其中,因為如果要重新使用STM32CubeMX產生code到同一專案時,可以確保user code不會被覆蓋。

Drivers/STM32F_4xx_HAL_Driver是STM官方在推的HAL函式庫,現在的主流,這部分引用都是由STM32CubeMX完成,其中若是想要自行開啟周邊模組,可以在這個資料夾中的stm32f4xx_hal_conf.h中解除註解或新增註解(外面檔案樹的Inc中)。若有新增模組需要手動將該周邊的HAL的.c新增進專案中。

# 小結

STM32CubeMX的有點是可以讓開發工程化,開發速度加快,可以用高層級的方式思考整個系統架構,而且不用去一直翻閱datasheet(最好還是要了解整個周邊的架構與使用)。

缺點是一些官方套件,例如:STemWin和BSP要自行新增進入專案中,有點可惜。

Thursday, July 13, 2017

C/C++中避免unused variable造成報錯的方法(void cast of argc/argv)


一些Signal handler或是Thread(CMSIS-RTOS)的建立會要求你的的函數強制吃一些argument。

當你的compiler開 -Werror -Wall -Wunused-variable選項時,這些未被使用的變數會報錯。

這時有兩個解法。

1.void cast

例如:

void f(void * argc)
{
         (void) argc;
}

這會無害的去用到這個變數。


2.自己等於自己

例如:

void f(void * argc)
{
         argc = argc;
}

這兩招就是欺騙compiler這些變數已經被使用。

我第一次看到這寫法真的嚇到了。

以下是stackoverflow的討論。
https://stackoverflow.com/questions/21045615/what-does-voidvar-actually-do
https://stackoverflow.com/questions/8052091/void-cast-of-argc-and-argv?rq=1

Sunday, July 9, 2017

A Narrative History of BSD 心得

A Narrative History of BSD

這篇文為我修課時做的心得,由於原文是用hackmd寫的,在這裡版型會有差異(原文)
  • 什麼是BSD
    • 全名:Berkeley Software Distribution(柏克萊軟體套件)
    • 類型:作業系統(UNIX-like)
    • 創立者;Bill Joy
    • 程式語言:C
    • license:BSD license
    • 描述:常用於工作站與伺服器
    • 下圖為UNIX譜系
  • 全片大綱
    以下是以影片中Dr. Kirk McKusick的解說分段。
    • Bill Joy Era
      • 在柏克萊大學建立
      • Bill Joy時期(1BSD,2BSD)納入的軟體套件:EX(vi),pascal interpreter,C Shell
    • TCP create
      • BSD 4以後的TCP/IP建立
      • BNN與柏克萊團隊的衝突
    • lawsuit of license
      • 與AT&T的著作權問題
  • BSD歷史與<A Narrative History of BSD>提及的對照
    以下是BSD的歷史與影片中的內容相互參照。
    • 1BSD
      • 釋出:1978年
      • 由Bill Joy創立,從早期貝爾實驗室的UNIX改寫而來
        原本是Bill Joy對AT&T的UNIX進行修改,雙方彼此間是合作關係,後來Bill Joy版本與AT&T差異加大,Bill Joy因此打包釋出1BSD
      • 加入ex(vi前身)、Pascal等
      • 執行環境:PDP-11
    • 2BSD
      • 釋出:1979年
      • 主要仍由Bill Joy開發(後期版本,如:2.9、2.10、2.11等多由別人改寫)
        這些後期版本的釋出時間比3BSD來得晚多是針對在PDP-11下的BSD進行維護與修改,甚至在2.9BSD納入了一些4.1cBSD的code。
      • 加入vi、C shell、Network package(Berknet、區網服務)
      • 執行環境:PDP-11
    • 3BSD
      • 釋出:1979年
      • 柏克萊團隊合作撰寫
      • 主要是將BSD port到VAX
      • 這版的BSD開始受到DARPA(美國國防高等研究計劃署)的重視,要求柏克萊成立CSRG(Computer Systems Research Group)來維護BSD。
        • DARPA開始注重BSD的原因是因為當時美國國防部底下的協力廠商使用太多種程式語言與環境,造成統合困難,所以選用BSD。
        • BSD當時效能超越AT&T發行的UNIX,不過因為BSD內含AT&T的程式碼,所以在當時很多購買AT&T license然後使用BSD。
        • VAX + VMS(IBM建立的作業系統)與VAX+BSD的競爭
          VMS的效能測試(micro benchmark)原本都比BSD好(pipe、取得PID、ping等),後來Bill Joy等人修改至相同(4.1BSD)。另外由於BSD的可移值性比較好所以獲得DARPA青睞。
    • 4BSD
      • 釋出:1980年
      • 特色:Job Control、deliver mail、PRAM’list(待查明)、Curses library(ncurese前身,terminal的控制函式庫)、Signal
      • 開始受到DARPA注資
      • 執行環境:VAX
    • 4.1BSD
      • 釋出:1981年
      • 效能改善
      • 4.1a BSD:
        當時DARPA請BNN(Bolt, Beranek and Newman ,BBN Technologies前身)與柏克萊團隊來實做TCP/IP協定,柏克萊負責介面(socket、connect等),BBN負責底層實做。由於Bill Joy進度超前,所以他向BBN的此專案領導Rob Gurvitz要了些雛型程式,並做了Rlogin與RCP在VAX 750上測試,多次測驗後達到該測試環境的上限表現。而這些進度後來納入了4.1a BSD中。
      • 4.1b BSD:
        • 後來Samuel J Lefflerr加入CSRG,並改寫TCP/IP介面,使得4.1b BSD可以開始支援多個連線。(主要修改為,當建立連線後會回傳一個新的socket,而不是同一個socket重複使用)。
        • 另外影片講者Marshall Kirk McKusick也協助開發新的檔案系統Berkeley Fast File System。
      • 4.1c BSD:修改完Signal後,成為4.1中散布最廣版本。
    • 4.2BSD
      • 釋出:1983年
      • Bill Joy離開建立Sun公司,Mike Kareks加入
      • 納入更完整的TCP/IP程式,造成柏克萊團隊與BBN的紛爭
        由於BBN的程式未被納入,影響其聲譽,所以釋出可自行編譯版本的TCP/IP程式,造成是市面上有兩種TCP/IP程式實做的BSD,最後在效能評估上由柏克萊團隊勝出,所以4.3使用柏克萊的TCP/IP。
    • 4.3BSD
      • 釋出:1986年
      • 實做OSI分層、對虛擬記憶體系統改善
      • 用BSD license發行不含AT&T license的BSD,也就是NET/1(Networking Release 1)。
        趣事:柏克萊釋出NET/1有兩個管道,一是用1000美元購買實體版,二是透過網路下載,結果由超過千人付錢購買。
    • NET/2
      • 釋出:1991年
      • 柏克萊認為他們的BSD已經與AT&T的UNIX原始碼完全不同,所以以低價開始釋出NET/2,但也因此激怒AT&T,造成了BSDi與AT&T得訴訟。
        最後雙方和解,柏克萊針對有問題原始碼做修正
    • 4.4BSD
      • 釋出:1994年
      • 訴訟結束後的clean code與一些修正所作的釋出。
    • other distribution
      • freeBSD,NetBSD等社群版本。
  • 名詞解釋與補充
    • ZFS lawsuit
      • 時間:2007年
      • 雙方:NetApp , Sun(Oracle)
      • 內容:NetApp控告Sun開發的自由軟體ZFS(常用於freeBSD、BSD上,擁有snapshot功能的檔案系統)侵權,Sun後來也反訴回去。
      • 結果:和解收場
      • 其他:Sun贏得訴訟後,將ZFS技術帶到linux,變成Btrfs。
    • Sun lawsuit
      • 影片中Dr. Kirk McKusick提到其為Sun lawsuit專家,指的可能為Sun在JVM上的訴訟。
      • JVM lawsuit:
        • Sun vs Microsoft
        • 爭端源於MSJVM(微軟開發的JVM)
        • 結果為和解,但Microsoft結束MSJVM開發
  • 心得
    • 這影片的資訊量有點大,因為Dr. Kirk McKusick他把三小時課程壓到50分鐘內說完,而且幾乎完整敘述了BSD的歷史,還有在這歷史中衍生的TCP/IP開發事件與BSDi和AT&T的法律訴訟。從這個BSD的歷史,可以了解BSDi與AT&T訴訟的源頭。而從UNIX分出來的BSD最後也影響整個資訊產業生態。BSD對於可移植性的要求,也讓BSD仍存活於世上。
    • 我覺得Dr. Kirk McKusick對於Bill Joy的描述很有趣。他形容Bill Joy是一個可以快速找到處理一件事情的最短路徑,程式寫的很快,問題一下就解決了。不過他的code有點亂,所以需要後人的維護。沒想到早年的程式設計大師也有程式碼不易維護的問題。
    • Dr. Kirk McKusick好喜歡用at any rate這片語喔,整片大約說了50幾次吧。
  • Question
  • BSD前期(1BSD、2BSD、3BSD)的license採用BSD license與AT&T license,這個混亂的授權是AT&T許可的嘛?
  • 為什麼BSD開發到BSD 4.4 lite2就停了?變成其他發行版本?
  • DARPA為什麼會讓柏克萊以開源釋出BSD,而不是讓這些變成國防部的祕密武器?
  • 有些縮寫如PMAC、PRAM找不太到只得是甚麼

The Unix System: Making Computers Easier to Use 心得

The Unix System: Making Computers Easier to Use

這篇文為我修課時作的心得
  • 摘要
    這部影片主要在介紹UNIX的功能與UNIX的好
    • 創造緣由:為了處理電話轉接工作還有解決問題
    • UNIX作業系統系統特色
      • time-sharing
      • portable
      • multi-tasking
      • hierachical file system
      • IPC
      • pipes
    • UNIX作業系統架構
      分層 描述
      kernel |底層與硬體溝通 、管理資源
      shell |與kernel溝通的界面
      utility program  |上層的應用程式
    • utility program範例
      • sort
      • 拼字檢查(超炫的)
      • 編輯器…等
  • 考古
    我有點好奇當時的電腦等級是如何,所以稍微找了一下youtube底下所說的DEC PDP-7規格。

圖片來源:wikipedia PDP-7
規格:
參數 數值
記憶體 4K words 可加到 64K words
CPU DEC chipset
指令速度 8 us ~ 1.5 us
儲存裝置 磁帶
售價 72000 USD (當時美金:現在美金 = 1:7.6)
這台電腦當時被稱作minicomputer,看起來一點都不mini阿。
ref:
1. Wikipedia - PDP-7
2. The Soemtron Collector
  • 心得
    在1982年那個我還不在世上的年代,微電腦才剛開始普及的年代,就有分時多工的作業系統出現,還可以做拼字檢查這類需要較多資源的程式,而且還可以播出聲音,我真的很佩服前人的程式能力,能夠資源相較現在不這麼充足的環境下創造出一個作業系統,還為其創造如此多的應用程式。而且這個作業系統與為了其而創造出的程式語言C語言到現在還是影響著整個電腦產業。
  • Question
  • 影片中的拼字檢查,是用two finger approach還是用KMP之類演算法做的?
  • 片中提到他們做出有用的程式,其他實驗室也做出有用的程式,然後彼此間交換使用,這是否是Richard Stallman Freesoftware思想的起源? 為什麼後來幾十年閉源軟體當道?
  • 片尾的小動畫是用PDP-7算出來的嘛?當時有GUI的觀念嘛?
  • 當時有Time-sharing的程式,那當時有有處理Race condition的機制嘛?

Revolution OS 心得

Revolution OS

這篇文為我修課時做的心得
  • 摘要
    內容與The Code有所重疊,但對於Linux,GNU,Free software,Open Source的成長其著墨較深,還有各期開發者與使用者加入Linux的情況有所描述。還有開源陣營與Microsft閉源陣營的對抗。主要內容涵蓋:
    • GNU、BSD、Linux等社群體系的建立
    • Linux成長與網路的關聯(apache project)
    • 開源社群的成長與所被業界接受(cisco採用,Oracle,Sybase等企業的貢獻)
    • 運用開源的商業模式(服務:Redhat、VALinux、Cygnus)
    • Linux Torvalds對於用Linux賺錢的看法
    • Netscape開源與Mozilla
    • Richard Stallman對於Copyleft與自由軟體理念
    • 開源與自由軟體運動的影響
      • ex:消費者可以購買不含Windows的電腦,Microsoft對於開源態度的改觀(這部影片當時Microsoft仍有點抗拒,到了Satya Nadella當任CEO時期才正式投入)
  • Note
    片中Debian社群提到的Open Source定義原文link
    • Free Redistribution
    • Source Code
    • Derived Works
    • Integrity of The Author’s Source Code
    • No Discrimination Against Persons or Groups
    • No Discrimination Against Fields of Endeavor
    • Distribution of License
    • License Must Not Be Specific to a Product
    • License Must Not Restrict Other Software
    • License Must Be Technology-Neutral
  • 心得
    這部影片彌補了我對The Code的一些疑問,為什麼Linux可以這麼成功的推廣?除了有Richard Stallman在前頭對自由軟體觀念的奠基外,還有相關社群的助力,套件如gcc、apache,gnome的出現,讓越來越多飛程式設計施予開發者都可以使用這個環境。除此之外,隨著網路泡沫化時期前的網路產業榮景,開源一詞隨這個榮景(還有Linus Torvald登上富比士雜誌),開始出現在主流媒體中,我想這也是Linux在桌上型市場仍有一席之地的原因。而我想Revolution OS這部紀錄片,不僅僅是在作業系統上對閉源商用壟斷的作業系統做出革命,還有對整個軟體生態圈做出革命。這部影片中Microsoft有點像是個壞人,但在開源軟體推廣這麼多年後,Microsoft開始做Open source,同時加入Linux Foundation,我想這也是開源軟體這個活動的一個里程碑吧。
  • Question
  • VALinux後來怎麼了,為什麼現在只能聽到RedHat?
    • VALinux離開Server服務後,改名為VA Software更專注於軟體開發,後來賣掉Jupitermedia Corporation(動畫公司)與SourceForge Enterprise Edition的版權。後來又改名為SourceForge Inx.,最後更名為Geeknet。Wiki連結
  • 1992年的Sun OS跑得比Linux慢,硬體又比較貴,為什麼還可以存活這麼久?
  • Apache是跨平台的,那為什麼大家都愛用Linux+apache?

The Code心得

The Code

* 系列為我修課時留下的心得

* 摘要

  • Linus Torvarlds 的生平與Linux創作背景
    包括家庭背景與當時的社經環境(ex:蘇聯解體)。
    因為Minix僅限教育用途,加上當時其他的作業系統過於昂貴(SCO Unix要20000馬克),還有just hobby等因素,開始著手開發Linux。
  • open source精神
    這裡直接節錄 Richard Mathhew Stallman 於片頭所說的話『開放原始碼就像是食譜,當有好的食譜,我們可以與他人分享,其他人可以對食譜加入自己的元素與口味,並將食譜回饋給原本的人或是繼續開放食譜下去。』,除此之外,open source不只是將程式原始碼開放下去這個動作,其背後可能同時創造了一個社群。
  • Free Software VS Open Source
    Richard Mathhew Stallman 提出的Free Software觀念與Free Software運動,還有Free Software Foundation對於自由軟體的推廣,讓人們認識到Free Software的意含,但是由於 Richard Mathhew Stallman 與 Free Software Foundation的言論通常較激進,導致齊備一些商人貶低,但是那群人們卻擁抱Open Source觀念(其實包括的軟體多有重疊),所以Eric S.Raymond認為應該倡導Open Source讓人們接受。
  • GNU/Linux對世界的影響
    GNU/Linux影響著許多開發者,還有業界一些公司,同時開發中國家的中國與印度的開發人員也對Linux有許多貢獻。Dot com風暴後影響開源軟體的發展與關注度,但是Linux作業系統卻開始進入小型裝置,如:電子鐘、手機等裝置,使一般使用者開始接觸到Linux。

* 心得

由於在高中時有在接觸Linux作業系統加上現在主要都以Linux作為我的筆電預設作業系統,對<The Code>對於Linux的歷史本身就有一些了解,不過對於Linux創立前的歷史不甚熟悉,不知道有Richard Mathhew Stallman這位在Linux開發出來前就已經開始宣揚自由軟體理念的靈魂人物,還有BSD本身對於開源觀念的殿基,讓我們可以在現今不受拘束的宣揚Open Source與使用Open Source的軟體,而且由於這些Open Source軟體的出現,讓我們這些後人可以研究這些軟體的技術,還可以貢獻所學於這些軟體中,並讓世界更美好。

* Qustion

  • Linus常說Linux kernel的開發人員的組織架構是十分扁平的,大家可以自由的提出意見,但是如果開發出Code,想要commit到Linux kernel中,到底是誰負責審理的?
  • 為什麼Linux社群最蓬勃發展?同樣是開源的BSD系統還有Minix等專案的能見度卻沒這麼高?
  • Linus說印度的基礎溝通較不好,所以可能會衍生出在地版的Linux,不知有沒有出現?
  • 另外印度網路不發達,他們如何養出這麼多軟體工程師?難道是人口基數多造成的錯覺?

Saturday, April 29, 2017

I2C 使用Microchip plib

I2C 使用Microchip plib

本篇以dsPIC30F為主。

plib 安裝

Legacy PIC24 MCU & dsPIC DSC Peripheral Library下載最新的plib,然後她會要求將plib安裝到你電腦中xc16 complier的資料夾下(linux在”/opt/microchip/xc16”下)。

函式概覽

安裝後文件會在xc16 complier的docs/periph_libs下。
其中plib提供以下函式。
AckI2C
CloseI2C
ConfigIntI2C
DataRdyI2C
IdleI2C
MastergetsI2C
MasterputsI2C
MasterReadI2C
MasterWriteI2C
NotAckI2C
OpenI2C
RestartI2C
SlavegetsI2C
SlaveputsI2C
SlaveReadI2C
SlaveWriteI2C
StartI2C
StopI2C
還有一些MARCO
EnableIntMI2C
DiableIntMI2C
SetPriorityIntMI2C
EnableIntSI2C
DisableIntSI2C
SetPriorityIntSI2C
這份文件16 bit language tools第191頁開始有詳述這些函式的介面。所以本文主要會面向如何運用這些函式達成master與slave溝通。

I2C (dsPIC30F as Master with 7bit address)

reception

以下圖片來自於http://ww1.microchip.com/downloads/en/DeviceDoc/70046E.pdf

對應到plib的流程為。(以下為我在i2cdevlib中所新增的片段,為一次讀多個bytes)。

請先透過ConfigIntI2C和OpenI2C設定好硬體參數。
值得注意的是在dsPIC30F manual中第5步驟。要透過StartI2C再次產生start condition。而讀入多個data bytes可用MastergetsI2C函式。

transmission

transmission只要全部都由Master端給資料即可。
對應到plib的流程為。(以下為我在i2cdevlib中所新增的片段,為一次寫多個bytes)。
請先透過ConfigIntI2C和OpenI2C設定好硬體參數。

Written with StackEdit.

Thursday, April 27, 2017

MPU6050 Gyroscope/Accelerometer 使用筆記

MPU6050 Gyroscope/Accelerometer 使用筆記

特性與參數

  • 用途:量測姿態
  • 精度:
    • Gyro : 250/500/1000/2000 dps (degree per second)
    • Accel : +-2/4/6/16 g
  • 輸出資料:為angular rate(角速度) ,16bit , LSB/g
  • 原始感應器電壓VDD(僅有晶片):2.375V-3.46V
  • 原始晶片通訊電氣參數:
    • Vlogic = 1.8V (+-5%) OR VDD
    • VIH(Voltage high level) : 必須超過0.7*Vlogic(MPU6050)
    • VIL(Voltage low level):必須低於0.3*Vlogic(MPU6050)
    • Ci(Input Capacitance): <5pF
    • I2C address: 1101000(when AD0 = 0),1101001(when AD0 = 1)
    • I2C最快頻率:400KHZ
  • 模組(GY521)電壓:3~5V
  • 其他特色:
    • 有內建low pass filter可供程式選擇
    • 中斷信號選擇
    • Auxiliary I2C port可與其他模組串接
    • 可作自我校正
    • 可透過FSYNC pin與外部模組做synchronization (Gyro)
    • On-chip DIgital motion processor
    • 有內建FIFO
  • 通信方式:I2C(MPU6050,MPU6000)/SPI(MPU6000)
  • 晶片datasheet:連結在此

資料單位換算

Gyroscope

首先先看下表為MPU6050 datasheet。

最重要的是scale factor。
透過公式
Gyro_value = (Data Register value) / (Scale factor)
其中單位為degree/second

Accelerometer

首先先看下表

一樣,最重要的是scale factor。
透過公式
Accel_value = (Data Register value) / (Scale factor)
其中單位為g

軟體應用方式

Ardunio使用i2cdevlib。運用其中的MPU6050 lib來溝通。其中,可以安裝processing IDE並開啟i2cdevlib的examplelink,這樣你可獲得一個有小飛機形狀的gui,她會呈現感測器的當前姿態。
dsPIC30F也可以使用i2cdevlib,近日有開始支援MPU6050。
而MPU6050的digital motion proccesor是其一大亮點。透過開啟這個功能,你可以透過interrupt直接獲得sensor當前姿態。她會幫你將角加速度轉成角度,這樣你就不用一直輪詢了。(輪詢計算範例:L3G4200)。
Written with StackEdit.

Friday, March 3, 2017

[Note] GDB 一些指令功能速查

[Note] GDB 一些指令功能速查

前情提要

這篇主要是介紹gdb的一些常用功能,遇到的時候方便google。

常用功能

  • backtrace
  • breakpoint
  • watchpoint
  • stopwatch
  • dump register
  • dump variable
  • continue and stop
  • disasmmebly
  • return

指令速查

  • backtrace
    • bt
  • breakpoint
    • b
    • br
  • watchpoint
    • watch variable_name or watch variable_address
  • stopwatch
  • dump register
    • info r
  • dump variable
    • print variable_name
    • print &variable_name => get address
    • print *variable_address => get address contents
    • info display
  • continue and stop
    • c => continue
    • r= > run
    • stop => Ctrl+c
  • disasmmebly
    • disassemble (func…) link
    • layout asm
    • layout src
  • return
    • return (return this stack)

Written with StackEdit.

Saturday, February 18, 2017

L3G4200 gyroscope使用筆記

L3G4200 gyroscope使用筆記

特性與參數

  • 用途:量測姿態
  • 精度:250/500/2000 dps (degree per second)
  • 輸出資料:為angular rate(角速度) ,16bit
  • 原始感應器電壓(僅有晶片):2.4V ~3.6V
  • 模組(GY50)電壓:3~5V
  • 其他特色:有內建high pass filter和low pass filter可供程式選擇,還有中斷信號選擇
  • 通信方式:I2C/SPIs
  • 晶片datasheet:連結在此
  • 模組(GY50)購買網頁:連結在此

用此模組量測當前姿態方式

軟體部份

Ardunio先安裝wire library和L3G4200D
用這個網站上的code和library即可。

角速度轉成角度

由於該感測器輸出為角速度(離散資料),所以我們須將角速度做離散積分得到角度。
角度 = 初始角度 + (角速度*取樣時間的總和)
下圖為利用QT自製的視覺化工具。其中若要得到角度責須得到線與0軸的面積。



下圖為L3G4200 datasheet p.10 一小部份,其中Sensitivity代表精度,以FS=200dps為例,代表從感測器輸出的數字1代表8.75mdps,如果輸出為兩千時,當前角速度為2000*8.75/1000000dps = 0.0175 dps。

應用限制與誤差處理

由於是作離散積分所以會有誤差,最好使用濾波器(有內建)。
另外由於它需要一直取樣,對Master CPU來說是很大的負擔。
Written with StackEdit.

Friday, January 13, 2017

Valgrind:C/C++分析工具

Valgrind:C/C++分析工具

Valgrind是開源的測試框架,可以用來動態分析記憶體配置、快取使用、多執行序bug。

安裝

sudo pacman -Sy valgrind

基本用法

$ valgrind 程式名稱 args
預設會是用memcheck工具分析,在這個工具下她會匯出heap使用、memory leak、還有記憶體使用錯誤的部份backtrace。

進階用法

$ valgrind --tool=toolname 程式名稱 args
這是valgrind最有方便的地方,valgrind旗下有九個使用者端的工具,和幾個開發者工具。

1. Memcheck:記憶體錯誤分析工具。

2.Cachegrind:預測你的cache使用。

3.Callgrind:分析程式的function call次數,還有call graph,可以幫助快取分析。

4.Helgrind:多執行序錯誤分析工具,有race condition檢測功能。

5.DRD:另一個多執行序分析工具。

6.Massif:分析heap的使用,在一個程式執行中她會測量多次。

7.DHAT:另一種heap分析工具。

8.SGcheck:實驗性的全域變數與stack分析工具。

9.BBV:實驗性SimPoint相關工具。

這些工具比較常用的是前七個。接下來看一下個別的使用。

memcheck

$ valgrind --tool=memcheck 程式名稱 args
首先我先寫一個廢物code來做實驗。以下code new完之後沒有delete。
#include<iostream>
using namespace std;
int main()
{
    int *ptr;
    ptr = new int;
    *ptr = 2;
    cout << *ptr << endl;
}
然後我們來看一下分析結果。
==12313== Memcheck, a memory error detector
==12313== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==12313== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==12313== Command: ./garbage
==12313==
2
==12313==
==12313== HEAP SUMMARY:
==12313== in use at exit: 4 bytes in 1 blocks
==12313== total heap usage: 3 allocs, 2 frees, 73,732 bytes allocated
==12313==
==12313== LEAK SUMMARY:
==12313== definitely lost: 4 bytes in 1 blocks
==12313== indirectly lost: 0 bytes in 0 blocks
==12313== possibly lost: 0 bytes in 0 blocks
==12313== still reachable: 0 bytes in 0 blocks
==12313== suppressed: 0 bytes in 0 blocks
==12313== Rerun with --leak-check=full to see details of leaked memory
==12313==
==12313== For counts of detected and suppressed errors, rerun with: -v
==12313== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

她寫了definitely lost: 4 bytes in 1 blocks,int是4 byte,我new完之後沒有回收所以memory leak了4 byte,不過由於這程式很間單所以很好找到錯誤來源,當程式變得複雜時我們可以加上--leak-check=full來找到源頭,來看一加完的結果。
==14268== Memcheck, a memory error detector
==14268== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==14268== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==14268== Command: ./garbage
==14268==
2
==14268==
==14268== HEAP SUMMARY:
==14268== in use at exit: 4 bytes in 1 blocks
==14268== total heap usage: 3 allocs, 2 frees, 73,732 bytes allocated
==14268==
==14268== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1
==14268== at 0x4C2B1EC: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14268== by 0x4007C7: main (in /home/tommycc/garbage)
==14268==
==14268== LEAK SUMMARY:
==14268== definitely lost: 4 bytes in 1 blocks
==14268== indirectly lost: 0 bytes in 0 blocks
==14268== possibly lost: 0 bytes in 0 blocks
==14268== still reachable: 0 bytes in 0 blocks
==14268== suppressed: 0 bytes in 0 blocks
==14268==
==14268== For counts of detected and suppressed errors, rerun with: -v
==14268== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
可以發現這兩行,指出了錯誤點。
==14268== at 0x4C2B1EC: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14268== by 0x4007C7: main (in /home/tommycc/garbage)

Cachegrind

$valgrind --tool=cachegrind
它可以分析你程式的快取優化程度。它的結果總共有以下類別。以下擷取至valgrind manual
  • I cache reads (Ir, which equals the number of instructions executed), I1 cache read misses (I1mr) and LL cache instruction read misses (ILmr).
  • D cache reads (Dr, which equals the number of memory reads), D1 cache read misses (D1mr), and LL cache data read misses (DLmr).
  • D cache writes (Dw, which equals the number of memory writes), D1 cache write misses (D1mw), and LL cache data write misses (DLmw).
  • Conditional branches executed (Bc) and conditional branches mispredicted (Bcm).
  • Indirect branches executed (Bi) and indirect branches mispredicted (Bim).
一般來說I和D是首要分析的部份。以下的範例是二維陣列存取,我們都知道二維陣列在記憶體上其實是一維的,所以(row major)先row在column會比(column major)先column在row快。我們先執行row major的code如以下。
 for (int i = 0 ; i < 1000 ; i++ ){                                                                    
     for (int j = 0 ; j < 1000 ; j++ ){                                      
         a[i][j] = i+j;                                                      
     }                                                                       
 } 
結果如下。
==11719== Cachegrind, a cache and branch-prediction profiler
==11719== Copyright (C) 2002-2015, and GNU GPL'd, by Nicholas Nethercote et al.
==11719== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==11719== Command: ./tt
==11719== 
--11719-- warning: L3 cache found, using its data for the LL simulation.
==11719== 
==11719== I   refs:      16,204,946
==11719== I1  misses:         1,401
==11719== LLi misses:         1,357
==11719== I1  miss rate:       0.01%
==11719== LLi miss rate:       0.01%
==11719== 
==11719== D   refs:       7,729,575  (6,536,262 rd   + 1,193,313 wr)
==11719== D1  misses:        78,407  (   13,698 rd   +    64,709 wr)
==11719== LLd misses:        71,617  (    7,734 rd   +    63,883 wr)
==11719== D1  miss rate:        1.0% (      0.2%     +       5.4%  )
==11719== LLd miss rate:        0.9% (      0.1%     +       5.4%  )
==11719== 
==11719== LL refs:           79,808  (   15,099 rd   +    64,709 wr)
==11719== LL misses:         72,974  (    9,091 rd   +    63,883 wr)
==11719== LL miss rate:         0.3% (      0.0%     +       5.4%  )
特別注意D1 miss rate是1.0%。接下來是column major的code,如下。
for (int i = 0 ; i < 1000 ; i++ ){                                                            
    for (int j = 0 ; j < 1000 ; j++ ){                                                              
        a[j][i] = i+j;                                                                        
    }                                                                                               
}       
結果如下。
==11522== Cachegrind, a cache and branch-prediction profiler
==11522== Copyright (C) 2002-2015, and GNU GPL'd, by Nicholas Nethercote et al.
==11522== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==11522== Command: ./tt
==11522== 
--11522-- warning: L3 cache found, using its data for the LL simulation.
==11522== 
==11522== I   refs:      16,204,946
==11522== I1  misses:         1,401
==11522== LLi misses:         1,357
==11522== I1  miss rate:       0.01%
==11522== LLi miss rate:       0.01%
==11522== 
==11522== D   refs:       7,729,575  (6,536,262 rd   + 1,193,313 wr)
==11522== D1  misses:     1,015,906  (   13,698 rd   + 1,002,208 wr)
==11522== LLd misses:        71,617  (    7,734 rd   +    63,883 wr)
==11522== D1  miss rate:       13.1% (      0.2%     +      84.0%  )
==11522== LLd miss rate:        0.9% (      0.1%     +       5.4%  )
==11522== 
==11522== LL refs:        1,017,307  (   15,099 rd   + 1,002,208 wr)
==11522== LL misses:         72,974  (    9,091 rd   +    63,883 wr)
==11522== LL miss rate:         0.3% (      0.0%     +       5.4%  )
可以發現D1 miss rate大幅上升至13.1%。另外cachegrind一樣會產生output file,可以透過cg_annotate分析,或是用Kcahcegrind分析。

Callgrind

用來分析整個程式的function call數目。
$valgrind --tool=callgrind 程式名稱
這會開始執行你的程式,通常會執行的比較慢。在執行過程中,你可以透過$callgrind_control -e -b或是$callgrind_control -b 來看程式當下執行的function call backtrace。以下是費氏數列遞迴版結果。
    PID 6989: ./fb
sending command status internal to pid 6989

  Totals:           Ir 
   Th 1  2,560,275,485 

  Frame:             Ir Backtrace for Thread 1
   [ 0]  23,685,553,356 fb(long long) (58138276 x)
   [ 1]  41,379,358,433 fb(long long) (58138297 x)
   [ 2]  41,379,358,449 fb(long long) (58138297 x)
   [ 3]  41,379,358,465 fb(long long) (58138297 x)
   [ 4]  41,379,358,481 fb(long long) (58138297 x)
   [ 5]  41,379,358,497 fb(long long) (58138297 x)
   [ 6]  41,379,358,513 fb(long long) (58138297 x)
   [ 7]  41,379,358,529 fb(long long) (58138297 x)
   [ 8]  41,379,358,545 fb(long long) (58138297 x)
   [ 9]  23,685,553,523 fb(long long) (58138276 x)
   [10]  41,379,364,892 fb(long long) (58138297 x)
   [11]  41,379,364,908 fb(long long) (58138297 x)
   [12]  41,379,364,924 fb(long long) (58138297 x)
   [13]  23,685,559,902 fb(long long) (58138276 x)
   [14]  23,685,630,165 fb(long long) (58138276 x)
   [15]  41,379,619,162 fb(long long) (58138297 x)
   [16]  41,379,619,178 fb(long long) (58138297 x)
   [17]  41,379,619,194 fb(long long) (58138297 x)
   [18]  41,379,619,210 fb(long long) (58138297 x)
   [19]  23,685,814,188 fb(long long) (58138276 x)
   [20]  41,382,920,321 fb(long long) (58138297 x)
   [21]  41,382,920,337 fb(long long) (58138297 x)
   [22]  23,689,115,315 fb(long long) (58138276 x)
   [23]  41,405,546,424 fb(long long) (58138297 x)
   [24]  41,405,546,440 fb(long long) (58138297 x)
   [25]  23,711,741,418 fb(long long) (58138276 x)
   [26]  41,560,627,883 fb(long long) (58138297 x)
   [27]  23,866,822,861 fb(long long) (58138276 x)
   [28]  24,523,758,344 fb(long long) (58138276 x)
   [29]  43,937,442,813 fb(long long) (58138297 x)
   [30]   2,558,084,449 fb(long long) (1 x)
   [31]   2,558,084,465 fb(long long) (1 x)
   [32]   2,558,084,472 main (1 x)
   [33]   2,558,187,428 (below main) (1 x)
   [34]   2,558,187,439 _start (1 x)
   [35]               . 0x0000000000000d70 
可以看到執行當下的遞迴到哪裡,不過由於費氏數列浮動快,這用callgrind_control -e -b的深度會不同。要看到整個function的呼叫次數,可以透過callgrind執行完產生的calgrind.out.pid檔案,這時有兩種分析這個檔案的方式,一是透過callgrind_annotate callgrind.out.pid 來看結果,另一是用KCachegrind (KDE應用程式)。以下是KCachegrind結果,可以看到左下角的框框,fb被call了1+331160280次(第一層call+第二層以上call)。


helgrind

$valgrind --tool=helgrind
這次我們使用官方範例。
#include <pthread.h>

int var = 0;

void* child_fn ( void* arg ) {
   var++; /* Unprotected relative to parent */ /* this is line 6 */
   return NULL;
}

int main ( void ) {
   pthread_t child;
   pthread_create(&child, NULL, child_fn, NULL);
   var++; /* Unprotected relative to child */ /* this is line 13 */
   pthread_join(child, NULL);
   return 0;
}
很明顯的var沒有做mutex lock,會有race。結果如下。
==19156== Helgrind, a thread error detector
==19156== Copyright (C) 2007-2015, and GNU GPL'd, by OpenWorks LLP et al.
==19156== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==19156== Command: ./race
==19156== 
==19156== ---Thread-Announcement------------------------------------------
==19156== 
==19156== Thread #1 is the program's root thread
==19156== 
==19156== ---Thread-Announcement------------------------------------------
==19156== 
==19156== Thread #2 was created
==19156==    at 0x51427AE: clone (in /usr/lib/libc-2.24.so)
==19156==    by 0x4E431A9: create_thread (in /usr/lib/libpthread-2.24.so)
==19156==    by 0x4E44C12: pthread_create@@GLIBC_2.2.5 (in /usr/lib/libpthread-2.24.so)
==19156==    by 0x4C31810: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so)
==19156==    by 0x4C328FD: pthread_create@* (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so)
==19156==    by 0x4005C6: main (in /home/tommycc/race)
==19156== 
==19156== ----------------------------------------------------------------
==19156== 
==19156== Possible data race during read of size 4 at 0x60103C by thread #1
==19156== Locks held: none
==19156==    at 0x4005C7: main (in /home/tommycc/race)
==19156== 
==19156== This conflicts with a previous write of size 4 by thread #2
==19156== Locks held: none
==19156==    at 0x400597: child_fn (in /home/tommycc/race)
==19156==    by 0x4C31A04: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so)
==19156==    by 0x4E44453: start_thread (in /usr/lib/libpthread-2.24.so)
==19156==  Address 0x60103c is 0 bytes inside data symbol "var"
==19156== 
==19156== ----------------------------------------------------------------
==19156== 
==19156== Possible data race during write of size 4 at 0x60103C by thread #1
==19156== Locks held: none
==19156==    at 0x4005D0: main (in /home/tommycc/race)
==19156== 
==19156== This conflicts with a previous write of size 4 by thread #2
==19156== Locks held: none
==19156==    at 0x400597: child_fn (in /home/tommycc/race)
==19156==    by 0x4C31A04: ??? (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so)
==19156==    by 0x4E44453: start_thread (in /usr/lib/libpthread-2.24.so)
==19156==  Address 0x60103c is 0 bytes inside data symbol "var"
==19156== 
==19156== 
==19156== For counts of detected and suppressed errors, rerun with: -v
==19156== Use --history-level=approx or =none to gain increased speed, at
==19156== the cost of reduced accuracy of conflicting-access information
==19156== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
她很明確得告訴我們有可能的race問題。而且名稱叫做var。結果十分直觀。

Massif

valgrind --tool=massif 程式名稱
他是用來分析data segement 中heap使用。
heap在data sgment通常是由malloc等函式創造的,是適當的優化減少heap可以paging和盡量避開使用swap space。
在執行完massif後會有一個massif.out.pid檔,可以透過ms_print來印出。不過一般高速運行的程式,他的malloc和free執行很快,在輸出圖形的時候看起來是一條線,所以可以透過valgrind --tool=massif --time-unit=B 程式名稱 讓massif透過allocate與deallcoate記憶體大小作圖。範例程式如下。
#include<stdio.h>
#include<stdlib.h>

int main()
{
    malloc(1000);
    int* a[10];
    for (int i = 0 ; i < 10 ; i++ )
        a[i] = malloc(1000);
    for (int i = 0 ; i < 10 ; i++ )
        free(a[i]);
}
結果如下。
--------------------------------------------------------------------------------
Command:            ./heap
Massif arguments:   --time-unit=B
ms_print arguments: massif.out.2213
--------------------------------------------------------------------------------


    KB
10.91^                                     ####                               
     |                                     #                                  
     |                                  :::#   :::                            
     |                                  :  #   :                              
     |                              @@@@:  #   :  ::::                        
     |                              @   :  #   :  :                           
     |                           :::@   :  #   :  :   :::                     
     |                           :  @   :  #   :  :   :                       
     |                        ::::  @   :  #   :  :   :  :::                  
     |                        :  :  @   :  #   :  :   :  :                    
     |                    :::::  :  @   :  #   :  :   :  :  ::::              
     |                 ::::   :  :  @   :  #   :  :   :  :  :   :::           
     |                 :  :   :  :  @   :  #   :  :   :  :  :   :             
     |             :::::  :   :  :  @   :  #   :  :   :  :  :   :  ::::       
     |             :   :  :   :  :  @   :  #   :  :   :  :  :   :  :          
     |          ::::   :  :   :  :  @   :  #   :  :   :  :  :   :  :   :::    
     |          :  :   :  :   :  :  @   :  #   :  :   :  :  :   :  :   :      
     |      :::::  :   :  :   :  :  @   :  #   :  :   :  :  :   :  :   :  ::: 
     |      :   :  :   :  :   :  :  @   :  #   :  :   :  :  :   :  :   :  :   
     |   ::::   :  :   :  :   :  :  @   :  #   :  :   :  :  :   :  :   :  :  @
   0 +----------------------------------------------------------------------->KB
     0                                                                   20.84

Number of snapshots: 23
 Detailed snapshots: [9, 12 (peak), 22]

--------------------------------------------------------------------------------
  n        time(B)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
  0              0                0                0             0            0
  1          1,016            1,016            1,000            16            0
  2          2,032            2,032            2,000            32            0
  3          3,048            3,048            3,000            48            0
  4          4,064            4,064            4,000            64            0
  5          5,080            5,080            5,000            80            0
  6          6,096            6,096            6,000            96            0
  7          7,112            7,112            7,000           112            0
  8          8,128            8,128            8,000           128            0
  9          9,144            9,144            9,000           144            0
98.43% (9,000B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->87.49% (8,000B) 0x400569: main (in /home/tommycc/heap)
| 
->10.94% (1,000B) 0x400556: main (in /home/tommycc/heap)

--------------------------------------------------------------------------------
  n        time(B)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
 10         10,160           10,160           10,000           160            0
 11         11,176           11,176           11,000           176            0
 12         11,176           11,176           11,000           176            0
98.43% (11,000B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->89.48% (10,000B) 0x400569: main (in /home/tommycc/heap)
| 
->08.95% (1,000B) 0x400556: main (in /home/tommycc/heap)

--------------------------------------------------------------------------------
  n        time(B)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
 13         12,192           10,160           10,000           160            0
 14         13,208            9,144            9,000           144            0
 15         14,224            8,128            8,000           128            0
 16         15,240            7,112            7,000           112            0
 17         16,256            6,096            6,000            96            0
 18         17,272            5,080            5,000            80            0
 19         18,288            4,064            4,000            64            0
 20         19,304            3,048            3,000            48            0
 21         20,320            2,032            2,000            32            0
 22         21,336            1,016            1,000            16            0
98.43% (1,000B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->98.43% (1,000B) 0x400556: main (in /home/tommycc/heap)
| 
->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%
可以看到malloc和free的作用。

其他工具

有些是valgrind的開發工具所以就跳過了。
ref:http://valgrind.org/docs/manual/manual.html



Written with StackEdit.

精選文章

使用Ardunio Atmega2560 連接 nRF24L01+

使用Ardunio Atmega2560 連接 nRF24L01+ 關於library 目前主流有 https://github.com/maniacbug/RF24 與 https://github.com/TMRh20/RF24 這兩個。 其中TMRh20大大做...