2012年11月11日 星期日
[Lua] Global Variable
全域變數不用宣告,存取尚未有的全域變數會得到 nil (存取未初始化的變數皆會得到 nil)。
一般不需要特地刪除全域變數,但指定為 nil 就是刪除。如果想要變數的生命有個範圍, 應該使用區域變數。
[Lua] local variable
在 Lua 全域變數不需要宣告,但可以宣告區域變數 (local variable),例如:
變數使用 local 宣告是較好的,避免充斥不必要的全域變數,存取也較快。未指定初始值時是 nil。
local foo=foo 可以在區塊內加速 foo 存取,修改但最後保留原值。
在互動模式下使用時要注意,除非不是完整的指令,不然每輸入一行,就是一個 chunk,下一行 local 宣告就失效了。可用 do-end 區塊延續 local 宣告。
參考:
local i=1效用到區塊結束自動消失,區塊可能是一個 control structure、一個函數、或一個 chunk。
變數使用 local 宣告是較好的,避免充斥不必要的全域變數,存取也較快。未指定初始值時是 nil。
local foo=foo 可以在區塊內加速 foo 存取,修改但最後保留原值。
在互動模式下使用時要注意,除非不是完整的指令,不然每輸入一行,就是一個 chunk,下一行 local 宣告就失效了。可用 do-end 區塊延續 local 宣告。
參考:
- Programming in Lua (second edition) by Roberto Ierusalimschy, Lua.org, March 2006
[Lua] multiple assignment
assignment (指定) 就是「變數=值」。而 multiple assignment 就是一次可以多個值指定給多個變數,多個變數跟多個值用「,」隔開。如果變數數目較多,多出來的部份指定為 nil:如果值的數目較多,多出來的部份忽略。
- 會 evaluate 所有值,然後才指定給變數 => 可用來做交換 (swap)
- 例如 x 跟 y 交換:x, y = y, x
- function 可以回傳多個值,需要 multiple assignment 才能接收多個值。
2012年11月9日 星期五
[OpenWrt] AR71xx Flash Partitions
之前提到 OpenWrt 至少要有 4 MiB Flash,例如 TL-WR703N 就用 4 MiB Flash,而 TL-WR1043ND 用 8 MiB,它們的 Flash 利用是怎樣規劃的呢?這裡是以 TP-Link 的路由器做說明:(有兩個數字的欄位,分別為 4 MiB Flash 跟 8 MiB Flash 的情形)
| partition | offset | size | size (KiB) | ||
|---|---|---|---|---|---|
| u-boot (mtd0) | 0x0 | 0x20000 | 128 | ||
| firmware (mtd5) | kernel (mtd1) | 0x20000 | 0x3D0000 0x7D0000 | 3904 8000 | |
| rootfs (mtd2) | [squashfs] /rom | ||||
rootfs_data (mtd3) /overlay | |||||
| art (mtd4) | 0x3F0000 0x7F0000 | 0x10000 | 64 | ||
- u-boot 固定 128 KiB,其中位址 0x1FC00 為 MAC Address、0x1FE00 為 PIN
- art 固定佔用最後的 64 KiB
- u-boot 跟 art 之間的區域就是 firmware,其 image 由 OpenWrt 的工具程式 mktplinkfw 產生,共由 header、kernel、rootfs 三個部份組成。
- header 固定為 512 (0x200) bytes,紀錄許多關於韌體資訊的欄位,mtd 分割併入 kernel。
- kernel 使用剩下的就是 rootfs 空間。kernel 可使用 gzip 或 lzma 壓縮,後者使用的空間較小,讓 rootfs 有更多空間,尤其是使用 4MiB Flash 的時候。
- 可能是 u-boot 不支援 lzma 壓縮的關係,lzma 壓縮的 kernel 其實會多一層 lzma-loader 載入,然後才能載入真正的 kernel,但整體來說使用的空間較小。例如我剛編譯的 kernel (vmlinux) 是 2,817,980 bytes,gzip 壓縮後是 1,282,951 bytes,lzma 壓縮後是 928,491 bytes。lzma-loader 4,630 bytes,但實際佔用 7,680 bytes 空間,加上 lzma kernel 為 93671,比 gzip 少了 338 KiB。
- rootfs 使用 squashfs 唯讀檔案系統,使用剩下的空間又自動分出為 rootfs_data 分割作為可讀寫 overlay。
[Lua] boolean
boolean 是 Lua 八種基本資料型態之一,包括 false 跟 true。判斷時,false 跟 nil 為 false:其它皆為 true,數字 0 跟空字串 "" 也是 true。
[Lua] string
Lua 字串 (Lua 八種基本資料型態之一)
- 可包含任何字元,包括 \000,結尾沒有 \000。
- 內容是不能改變的,改變需要另建新字串
- single or double quoted
- escape sequence
- \a:bell
- \b:backspace
- \f:form feed
- \n:換行
- \r:carriage return
- \t:水平跳位
- \v:垂直跳位
- \\:「\」
- \":「"」
- \':「'」
- \數字:最多三位十進位數字,如果後面不是數字,數字開頭的 0 可省略
- double square bracket,類似註解,可用成對的「[[」跟「]]」或「[=[」跟「]=]」(依此類推,兩邊等號數目要相等),不解釋裡面的 escape sequence,例如
page=[[
<html>
<head>
<title>An HTML Page</title>
<head>
<body>
Hello World
</body>
</html>
]]
write(page) - 數字運算時自動轉換成數字,明確轉換用函數 tonumber
- 「..」字串 concatenation operator,如果前面接數字,要有空格,不然會視為小數點。明確轉為字串用函數 tostring
- length operator:字串前面加「#」
- Programming in Lua (second edition) by Roberto Ierusalimschy, Lua.org, March 2006
訂閱:
文章 (Atom)
SIP header Via
所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...
-
網路界面驅動程式有兩種接收封包的方式 -- 中斷驅動和 NAPI。傳統是用中斷驅動,在中斷服務程式裡接收封包,但封包量大時會有中斷次數太多而效能變差的問題。NAPI (意思是 New API) 改成中斷服務程式只通知有封包,Kernel 再排程一次接收多個封包來提昇效能。 中...
-
busybox ntpd 是 NTP client,也可作為 NTP server。 參數 -d:Verbose -n:不常駐 -q:(quit) 時間設完後結束 -N:高優先權執行 -w:不設定時間,只是詢問 peers,隱含 -n -l:作為 NTP ser...
-
驅動程式除了 read()/write() 外,通常可以透過 ioctl() 系統呼叫進行一些控制或設定,如鎖門、退片、回報錯誤、改變 baud rate、或 self destruct 等。 在 user space 格式如下: #include <sys/ioctl...