+886 Let's roll.

2015年2月15日 星期日


 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/
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


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日 星期四


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 筆記 

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( ). 
 參考資料: