2015年6月18日 星期四

我不懂C


    最近生活很忙,沒時間顧blog,我筆記用的hackpad誤按"leave"按鍵後,無法再重新登入,所以筆記都不見啦...囧

    前陣子遇到一個問題

main()
{
      int x=20, y=35;
      x = y++ + x++;
      y =  ++y + ++x;
      printf(" %d %d", x, y);
}

   我答案寫了:未定義行為。
 出問題人跟我說這是C語言很基本的,變數要給初始值、還有前序、後序++ ,答案怎麼會是未定義行為。

  我說:我記得   C是不能在同一行程式裡,對變數給值兩次的,然後我們就結束交談了。

我相信對方是技術很強、很有經驗的工程師,但這題真的是未定義行為。

我也發現我還超多不懂的呀,在ARM架構下C怎麼寫效能比較好? 我想我該找個時間重新再多認識C吧。


2015年3月21日 星期六

Raspberry Pi (ARMv6)上自幹一個微小作業系統

      大約半年前,我加入fb的F9 based JuluOS與黃敬群老師(Jserv)成大嵌入式系統課程社團,我才發現原來台灣有那麼多人在研究作業系統開發,我也想試試開發一個小小的OS。

     從0開始寫一個OS是相當有趣的過程,可以檢視自己對C、資料結構、作業系統、計算機組織的瞭解程度,誠實的面對自己,雖然自己在系統廠工作幾年了,還是很多基礎知識不足,也許這就是為什麼那麼多高手可以在ic design house,而我在系統廠吧,寫這個小OS,只是學習的開始,接下來我會多研究其它的OS,例如:xv6、F9 microkernel、freeRTOS...

      我把開發流程一步一步記錄,從bare metal Helloworld,加入printk,配置MMU, IRQ中斷,記憶體管理(Buddy system),到最後加入system call、process fork與round robin scheduling,方便學習。
 
     所有原始程式碼都放在github上: https://github.com/tzuCarlos/RaspberryPi
     我使用qmeu測試:
     這邊有執行的結果:https://github.com/tzuCarlos/RaspberryPi/blob/master/mimiOS/RESULT

     系統說明:
        先拖稿一下,下班還要唸書,顧嬰兒很累的,改天有空補上一步步說明XD

     未來工作:
     1.把ARM的架構跟ARM組合語言弄熟。
     2.系統memory map我還沒好好規畫,只是想到做什麼功能,就找一塊出來。
     3. 沒有檔案系統,沒有shell、沒有驅動程式構架。  
     4. 寫個RTOS吧.






推薦社群、blog、書藉:
1. F9 based JuluOS, https://www.facebook.com/groups/224024274384934/
2. 黃敬群老師(Jserv)成大課程,https://www.facebook.com/groups/ncku.embedded2015/
3. Benux Wei, 精簡版作業系統實戰: 自製OS用Qemu執,
     http://ben6.blogspot.tw/2011/05/qemu.html
4.loda筆記, http://loda.hala01.com
5. 陳鐘誠老師的網站: http://ccckmit.wikidot.com
6. 作者:李無言, 一步步写嵌入式操作系统
7.  Andrew Sloss (Author), Dominic Symes (Author), Chris Wright (Author), "ARM System Developer's Guide: Designing and Optimizing System Software".
8. Randal E. Bryant, David R. O'Hallaron, "Computer Systems: A Programmer's Perspective" (這是CMU教才,我目前主管是CMU博士畢業XD,相當推!)

2015年2月15日 星期日

vim + cscope + ctags + nerdtree + taglist + SrcExpl+trinity, c ya source Insight.


 Bought a MACbook air installed ubuntu+LXDE, time to say good bye to windows & source Insight.

I tried eclipse to develop C about 1 month before, eclipse is nice tool to trace code, but somehow I still feel eclipse a bit laggy.



      

Finally, I use VIM, because both of MAC OS X and Linux have VIM. 

   
  1. website: The NERD tree : A tree explorer plugin for navigating the filesystem
  2. download NERD_tree.zip
  3. unzip NERD_tree.zip 
  4. mkdir -p ~/.vim/plugin 
  5. mv plugin/NERD_tree.vim ~/.vim/plugin 
  1. vim ~/.vimrc
  2. add this line: nnoremap :NERDTree
same producer to install taglist, trinity, and SrcExpl. 

You may need a script to generate cscope and ctags index files.

CSCOPE_FILE=cscope.out
if [ -n "$1" ]; then
 echo "Source code directory: " $1
 echo "Create file map : " $CSCOPE_FILE
 find $1 -name "*.c" -o -name "*.c" -o -name "*.h" -o -name "*.c" -o -name "*.S" >   
$CSCOPE_FILE
 cscope -bkq -i $CSCOPE_FILE
 ctags -R --exclude=.svn
else
 echo "Please key-in path of project"
fi



reference:
Tsung's Blog: http://blog.longwin.com.tw/2009/02/vim-tree-explorer-nerdtree-plugin-2009/

自己動手做OS之Raspberry Pi interrupt example 筆記

Happy Chinese New Year!!  希望我年假,有更多時間好好學習作業系統...T_T
這是個學習筆記,還未整理好,看起來很亂,但是我會盡量把該注意的重點寫下。


Interrupt example Raspberry Pi source code:

這範例中,我們使用timer 產生IRQ,執行時,可以看到,每隔一小段時間,就會印出IRQ_handler,在IRQ_handler()中,先關掉了IRQ再印出IRQ_handler,接著啟動IRQ,這是一個簡單的範例,但不是有效率的處理IRQ方式,以後我們來討論巢式中斷。

當IRQ發生時,硬體會自動跳到0x18的位址上去執行程式,但我們系統是掛在0x10000上,跳到0x18時並沒有東西,這時有幾個解決方式,1是利用mmu把0x18 mapping 至 0x10018上,或是設定CP15,跳轉到正確的中斷處理向量表上。

ARM的官方網站有很好說明,值得一看。
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0203j/Cacbhjjj.html

以下是節錄 陳鐘誠老師的網站(http://sp1.wikidot.com/arm)
-------------------------------------------------------------------------------------------------------------------------
ARM 的可存取暫存器為 R0-R15,其中 R13為堆疊指標 SP (Stack Pointer),R14 為連結暫存器 LR (Link Register),R15 為程式計數器 PC (Program Counter)。
ARM的狀態暫存器有 CPSR (Current Processor Status Register) 與 SPSR (Saved Processor Status Register)。其中 SPSR 乃是在中斷時用來自動儲存CPSR的暫存器。
在 ARM 處理器當中,共有七種模式,包含 1. 使用者模式 (User Mode) 2. 系統模式 (System Mode)、3. 快速中斷模式 (Fast Interrupt Request:FIQ)、4. 特權呼叫模式(Superviser Call:SVC)、5. 中止模式(Abort:ABT)、6. 中斷請求模式 (Interrupt Request:IRQ)、7. 未定義模式(Undefine:Undef) 等。 除了使用者模式外,其它六種模式稱特權模式,而除了使用者模式跟系統模試,其它五種稱為異常模式。

不同的模式會有獨立的堆疊暫存器 SP (R13) 與連結暫存器 LR (R14)-返回地址,這使得 ARM 的模式切換更快,因為不需要以額外的指令儲存這些暫存器。圖二顯示了 ARM 當中的所有暫存器,在每個模式當中,R0-R15 及 CPSR 都是可以存取的,但在後五種模式中,會使用獨立的 R13, R14、以及 SPSR,取代使用者模式的暫存器[1]。 
--------------------------------------------------------------------------------------------------------------------------

R15(PC)當前程式執行的位置
FIQ比IRQ模式多了R8_fiq~R12fiq私有暫存器,可以提高中斷速度。 (原因:.....待補)

中斷發生時要做的事:

  • 保存CPSR到SPSR
•要保存暫存器狀態( SP和LR (除FIQ模式) )
•CPU模式切換應於該異常模式
•設置中註冊的量表來PC的地址




參考資料:
[1] http://sp1.wikidot.com/arm 陳鐘誠老師的網站。

ARM System Developer's Guide
一步步写嵌入式操作系统

2015年1月29日 星期四

MAC OS X 10.10 minicom USB to serial 安裝


1. 下載 minicom 2.7
https://alioth.debian.org/projects/minicom/

2.解開後
./configure (我的安裝時說automake需要安裝Xcode,就安裝先囉)
make
sudo make install

3. 上usb-to-serial cable網站我的chip是PL2303 ->
系統偏好設定>安全性與隱私>允許安裝

查詢我的設備是tty.usbserial

ls -1 /dev/tty.*
/dev/tty.usbserial 


4.執行minicom -s 設定>
Serial port setup -> A - Serial Device:/dev/tty.usbserial
-> F - Hardware Flow Control:NO
選: save setup as dfl  -> 發現錯誤 sudo mkdir /usr/local/etc -> sudo chmod 777 /usr/local/etc

nailed it!!!

2015年1月26日 星期一

Linux VLAN 筆記

Linux VLAN 筆記 

kernel 開啟802.1q功能後,便可以透過簡單指令,設定VLAN. 
brctl delif br0 ath0
brctl delif br0 eth0

vconfig add ath0 555
vconfig add eth0 555
ifconfig ath0.555 up
brctl addbr br555
brctl addif br555 ath0.555
brctl addif br555 eth0.555
ifconfig ath0.555 up
ifconfig eth0.555 up

ifconfig br555 10.0.0.11 up

Wireless AP mode運作正常,抓無線封包有看到帶了VLAN ID 555.
不幸的是,我的Wireless STA,不能成功ping到我的AP,只好下去看程式,這邊有幾個部份要看. 
1. Linux kernel 802.1q 
2.Wireless driver.(我手邊的是Atheros proprietary LSDK driver,所以這部份內容都不會放上來)
 3.hostapd跟wpa_supplicant.  
 
 Linux的net_dev是用一個list串起來,每個net_dev都有會呼叫ev_queue_xmit ->dev_hard_start_xmit ,去傳送封包至下一步。
 
 vlan.c::vlan_proto_init()時會invoke,dev_add_pack(&vlan_packet_type);
 
  •  static struct packet_type vlan_packet_type __read_mostly = {
  •         .type = cpu_to_be16(ETH_P_8021Q),
  •         .func = vlan_skb_recv, /* VLAN receive method */
  • };
vlan_packet_type()宣告了, type是8021q(0x8100)封包接收時是由它來使用vlan_skb_recv()處理。

 所有帶VLAN tag header的封包會經過vlan_dev.c::vlan_skb_recv()處理,去掉VLAN header,再處理接下來的header ex: ARP or IP。
 
 傳送時vlan_dev_hard_start_xmit()會invoke __vlan_put_tag()去加入VLAN header。
 
 整個流程是wifi_Dev_RX->vlan_skb_recv()->bridge->中間處理比方說ARP->送出ARP reply->dev_hard_start_xmit()->加入VLAN header後由實體網卡送出。
 
 
 參考資料:
 
 
 vconfig add ath0 555  will invoke ospriv_vlan_add_vid( ). 
 參考資料: