顯示具有 embedded 標籤的文章。 顯示所有文章
顯示具有 embedded 標籤的文章。 顯示所有文章

2012年10月26日 星期五

Bit-Banding

什麼是Bit-Banding?

Bit-Banding是一種讓使用者atomic修改memory中某個bit的方法,比如說常見的bit set或是bit clear指令。Bit-Banding把一塊比較大memory中的每個word都對應到一塊較小memory中的每個單一bit,如下圖所示:
上圖把一塊32MB SRAM的每個word都對應到一塊1MB SRAM中的每個bit。其中比較大的memory叫做bit-band alias region,比較小的memory叫做bit-band region。當我們access bit-band alias region中的一個word時,會自動對應到bit-band region的bit。而此Read-Modify-Write的過程被設計成不可被中斷的。因此當我們做bit set以及bit clear時是atomic。

以上圖來說明,當我們把0x23FFFFE0設定成1就相當於把0x200FFFFF的bit[0]設定成1。相反地,當我們把0x23FFFFE0設定成0就相當於把0x200FFFFF的bit[0]設定成0。附帶一提,把值寫到0x23FFFFE0的bit[31:1]是沒有意義的,不會產生任何作用。

Bit-Banding的好處

  1. 減少code size,不需要使用mask對特定bit做修改
  2. 由於atomic的特性,可用來實做mutex以及semaphore

2012年3月28日 星期三

嵌入式系統開機流程

1. CPU到指定的memory address抓取第一行instruction執行,有兩種常見的作法
    (1)CPU會把PC設定為一個特定的address,從這邊開始執行
    (2)CPU會把Interrupt Vector Table設定為特定的address,並且發出Reset interrupt
         在Reset的ISR中執行某個開機的function

2. 初始化CPU (IVT的addres, SP)

3. 把code和data從ROM或是 Flash搬到RAM上執行,通常使用DMA搬
    (有些code可直接在external flash上執行就不需要搬)

4. 初始化板子相關設定和參數

5. 初始化系統(ex 執行OS、GUI)

6. 執行主程式,很多嵌入式系統會執行一個無窮迴圈

2011年11月11日 星期五

Designing Embedded Hardware(設計嵌入式硬體)


這是一本給嵌入式初學者看的書,不過這本書和市面上大部分嵌入式的書籍都不太一樣,對大多數資工背景的學生來說,這是一本很硬的書。作者花了很多時間在介紹硬體相關的議題。前幾章在介紹簡單的電子電路學、焊接工具、示波器,中間幾張花了一些時間在介紹嵌入式常見的協定(SPI, I2C, USB, 紅外線, RS232),最後是介紹幾個常見的處理器架構。

和一般書籍不同的地方,這本書每一章幾乎都會舉一個實際的例子,示範怎麼真的把線路圖兜起來,並講解一些電路是如何實做的。因此如果你之前沒有修過微處理機相關課程的話,這本書對你來說會很難看懂他。

這本書我一共看了兩遍,第一遍的時候幾乎都看不太懂。因為我當時完全沒有什麽嵌入式的底子,只是一個會寫軟體的程式設計師。之後實際接觸嵌入式系統一兩年後,我回來再看了一遍這本書。有點底子之後才發現這本書寫得真的不錯,書中舉的一些例子也都是實際上會用到的,尤其是最後幾章介紹了許多常用微處理器的架構(這是2005年的書,不過大多數微處理器到現在2011年都還可以在市面上看得到),非常值得一看,其中甚至有講解Address Decoder和MMU電路的實做。

因此我的建議是,如果你是軟體背景新手的話可以先大概看看就好。幾個重要的協定先看過有概念就好,因為SPI, I2C這些協定沒有實際實做過,只看書是不可能會得(而且書上也只有講最簡單的概念,詳細相關協定還是要去看spec比較好懂)。電路圖如果都看不懂可以先跳過沒關係。等到你真的有實做經驗後再回來看,相信收穫一定會不少。

2011年10月24日 星期一

USB Complete: The Developer's Guide(USB完全開發手冊)


前些日子因為工作要用到USB的關係,我從書局買了這本書。讀完這本書之後再搭配一些網路上的文件。我很快花了一個多禮拜的就搞懂USB的基本原理。

這本書寫得不但詳細而且好懂。因為我是搭配USB spec一起看,有些地方spec沒寫清楚,回頭看一下這本書就瞭解之前不懂得地方了。書中舉了很多Windows USB Driver的sample code(written in C# and VB),雖然我最後沒有用書中的範例,不過sample code還是幫助我瞭解了整個USB的概念。總而言之,這是本很好介紹USB的起步書,推薦給想要瞭解USB的新手!

附註: 這本書同時還有中譯本,翻得也不錯。如果覺得英文書太貴也可以考慮買中文書。

Programming Embedded Systems in C and C++(嵌入式系統–使用 C/C++)



這本書是很多人推薦的嵌入式入門書,內容針對嵌入式系統做了一些基本的簡介。如果你是一個完全沒有嵌入式概念的人,看這本書或許是一個不錯的選擇。因為作者寫得很淺顯,只要你會基本的C和C++就能看懂這本書。

或許這是一本不錯的新手入門書,不過這本書有個問題。現在已經是2011年了,而這本書出版的日期是1999年。書中使用的一些硬體(80186)現在都不是主流的產品。此外一些Embedded Systems重要的元件像是Keypad, LCD, Button, ADC......都沒有介紹。簡單的說,這真的就是一本給初學者簡單認識Embedded Systems的書。如果你是完全沒概念的新手,這本書或許可以給你一些協助。不過我還是建議去看 現代嵌入式系統開發專案實務 這本中文書,這本才是真正可以帶你進入Embedded Systems的入門書。

至於有經驗的開發者完全不建議來看這本書,因為你根本學不到什麼。

附帶一提,這本書有翻譯成中文版。不過我覺得翻譯的沒有很好,有些名詞怪怪的。還是建議新手要看的話看原文書會比較好。

註: 這本書有第二版不過我沒看過,第二版是2006年出得。

2011年10月14日 星期五

Startup code

startup code是程式在正式執行main function前所執行的一段code。在一般的軟體開發中,這段code是由compiler所自動產生並安插在main執行之前。因此平常我們可能不會注意到這段code。一般軟體的startup code最主要的工作就是初始化stack。

在embedded system,startup code是開機上電後第一段會執行的程式,通常是由組合語言所寫成。大部分都叫做startup.asm或是crt0.s。他比一般PC上的軟體會多作一些事情,以下是一個embedded software startup code的流程:

1. 關掉所有的interrupt
2. 配置一塊空間給stack
3. 初始化stack pointer, frame pointer
4. 把資料從ROM搬到RAM上,通常是用DMA來搬
5. 把.bss section清空為0,因為未初始化的變數一開始皆為0
6. 打開interrupt
7. 初始化系統的一些設定
8. jump到main function,開始執行main function中的程式

2011年10月6日 星期四

設定Register常用的Code

將某bit設為1
C
flag |= (1 << n);
Verilog
flag[n] = 1'b1;
將某bit設為0
C
flag &= ~(1 << n);
Verilog
flag[n] = 1'b0;
將某bit做toggle (0變1,1變0)
C
flag ^= (1 << n);
Verilog
flag[n] = ~flag[n];
判斷某bit是否為1
C
if ((flag & mask) == mask)
Verilog
if (flag[n])
判斷某bit是否為0
C
if ((flag & mask) != mask))
Verilog
if (~flag[n])

2010年6月19日 星期六

現代嵌入式系統開發專案實務


最近從圖書館借到這本書來看,花了兩天時間看完
書中講解一個菜鳥實際開發專案的過程
利用和主管問答的方式,很輕鬆的講解了嵌入式系統開發會遇到的問題
有些地方真的是感同身受
想想過去這一年我也是像這位菜鳥一樣不太懂嵌入式系統
書中菜鳥的問題,同時也是我這一年中時常碰到的問題
這些東西都不是上課可以學到的
一定要自己實際開發過嵌入式系統才能體會
看完後對嵌入式系統有整個融會貫通的感覺

總而言之,很推薦有心想走嵌入式領域的新手看看這本書
作者用很輕鬆的方式講解整個嵌入式系統的開發流程和複雜的觀念
看完之後一定會對整個嵌入式系統的來龍去脈有初步的認識

書中另外有提到一個重點,CS基礎科目的重要性
要解決嵌入式系統各種奇怪的問題
不二法門就是把計算機組織、作業系統這些基本科目學好!

2009年12月17日 星期四

ARM Branch Label

有時候會看到Label明明是標記2
但是instruction會這樣寫
blt 2b
adr r5, 2f
在用的時候Label多加了一個b和f
這是因為ARM可以使用0-99之間的數字做為臨時Label
臨時的Label命名可以重複
instruction中的"2f"表示forward,會向後找Label 2
instruction中的"2b"表示backward,會向前找Label 2
這樣設計最主要的原因是為了不用煩惱每個Label的命名
只要命名最重要的地方就好了

2009年12月10日 星期四

MCF52259 ColdFire QSPI 燒到外接的Flash

最近Lab新買了一批Freescale MCF52259 ColdFire
我們要把舊的開發板功能Port到52259上

試了好久才發現Freescale附的Driver有些問題

QSPIInit(500, 0, 8, 100, 255, 1)
初始化QSPI,第二個參數是SPI mode,在這邊我們設成0
這邊請參考你用的Flash datasheet

在Init的時候要把QWR的CSIV enable,不知道為什麼Driver預設是disable
設成disable的話,CS一開始就會被拉成High
MCF_QSPI_QWR = MCF_QSPI_QWR_CSIV

因為是QSPI,所以會配給一塊RAM用來存command跟data
command就是QCR那些設定
不論是command還是data,要存到RAM上的方法都是透過QAR和QDR
把要存的位置放到QAR,command或是data放到QDR
這樣就會被存到對應的RAM上
然後QAR會自動遞增,用來存下一個command或是data
被放到RAM上的command和data會按照他在RAM上的位置兩兩一組
當QSPI被enable時(MCF_QSPI_QDLYR = MCF_QSPI_QDLYR_SPE)
會用0x20的command把0x00的data送出去
收回來的資料會存在0x10
以此類推,buffer一次最多可以存16bytes

在這邊我們發現的問題是用光碟上的QSPI範例,command沒有被修改到。後來我們發現原因是QCR只有用8~15 bit,但是Driver沒有把我們填的值shift到正確位置,多了一個shift的動作就可以正常運作了

最後寫到Flash的步驟,他的格式是先送write的op code,之後送要write的位置,接下來送要write的資料過去,就會依序寫到Flash裡頭,要注意的地方是,當Write完成之後要把CS拉成high,拉成high有點像reset的意思,這樣Flash才會知道你寫完了,接下來又可以送新的op code給他

我們舊的sensor node是用eeprom,這邊是eeprom的datasheet
做法跟flash差不多

http://www.datasheetcatalog.com/datasheets_pdf/A/T/2/5/AT25080.shtml