家裡馬桶水箱的水,一直太滿,從水箱中的一根管子溢出
因為馬桶水箱,是靠浮球浮起來,來止水灌進水箱的
這裡提供兩個簡易的解決方法,可以先試試看能不能解決
1. 檢查浮球是否進水,導致浮不起來,
=> 有的浮球是可以轉開來的,可以看看裡面是否有進水
把水甩掉,或是弄掉,再試試
2. 把連接浮球的鐵桿,弄彎一點,看看能不能止水
家裡馬桶水箱的水,一直太滿,從水箱中的一根管子溢出
因為馬桶水箱,是靠浮球浮起來,來止水灌進水箱的
這裡提供兩個簡易的解決方法,可以先試試看能不能解決
1. 檢查浮球是否進水,導致浮不起來,
=> 有的浮球是可以轉開來的,可以看看裡面是否有進水
把水甩掉,或是弄掉,再試試
2. 把連接浮球的鐵桿,弄彎一點,看看能不能止水
Linux 當中有個Tool,叫做 taskset,可以限制某個Daemon只跑在規定的CPU編號之下,這邊會先簡單介紹 taskset使用方式,不免俗的,最後會附上一個實際操作
首先簡單寫一個 while迴圈,打印test的字樣,但不顯示在螢幕上,這支來當我們的Daemon,並且使用以下command,讓他在背景執行
=> sh loop_test.sh &
======= loop_test.sh 小程式 =========
#!/bin/sh
while [ 1 ]
do
echo "test" > /dev/null
done
======= 使用方式 =======
首先我們可以用以下的指令,來得知目前設備的 CPU核心數目
=> cat /proc/cpuinfo
查詢目前的 Daemon,所配置的 CPU編號,這有兩種查詢方式
1. 直接列出,此Daemon使用的CPU編號,這邊Daemon的 PID=5622 (ps -aux | grep loop_test.sh)
=>
root:~# taskset -cp 5622
pid 5622's current affinity list: 0,1
2. 以mask方式列出,此Daemon使用的CPU編號,這邊Daemon的 PID=5622
=>
root:~# taskset -p 5622
pid 5622's current affinity mask: 3
這邊的3,為Hex,需要把他換成二進制來解讀,所以為 0x11,表示CPU0,CPU1目前會讓此Daemon使用(如果CPU為8 core,得到的數值為FF(hex),則表示 CPU0~7都會分配)
======= 使用方式 & 實驗 =======
設置目前的 Daemon,只分配CPU1 來做
=>
root:~# taskset -cp 1 5622
pid 5622's current affinity list: 0,1
pid 5622's new affinity list: 1
"top -d 1" 觀察一下cpu 與 process 狀態
=> 可以看到 CPU1 的 idle為0%,loop_test.sh 把整個CPU1用盡了,而CPU0是完全閒置的
這時候,我們再使用指令把 loop_test.sh 平均分配給 CPU0 & CPU1
=>
root@auto2735evb-ivt-vp2:~# taskset -cp 0,1 5622
pid 5622's current affinity list: 1
pid 5622's new affinity list: 0,1
"top -d 1" 觀察一下cpu 與 process 狀態
=> 可以看到 CPU0與CPU1,都有分配給 loop_test.sh使用
今天遇到有客人問一個問題
他想要用 tcpdump 抓封包,指令如下:
tcpdump -i any -C 100 -W 10 -U -w /tmp/tcpdump.cap &
但因為,我們的device,在拔除usb之後,device可以進入 suspend
他想要在 wakeup的時候,抓到是甚麼樣的封包,
另外他想要透過 adb shell 去執行這個指令,所以當下完上面指令,adb shell 斷線之後
tcpdump 也終止了
查詢與嘗試了一下,可以使用以下指令解決
nohup tcpdump -i any -C 100 -W 10 -U -w /tmp/tcpdump.cap > /tmp/tcpdump.log 2>&1 &
只要確保 /tmp 目錄是可寫的,這樣 tcpdump 的輸出和錯誤信息將被寫入到 /tmp/tcpdump.log 文件中
Yocto 目前已經是各大IC廠在使用的專案類型,與之相似的,有OpenWRT 或是 BuildRoot
今天要介紹如何從Yocto Project 編譯出ToolChain,並且會說明如何使用ToolChain,最後會說明如何編譯一個簡單的Hello World.
如何編譯出ToolChain
首先我們可以使用以下的Command來編譯出 ToolChain
# bitbake meta-toolchain
編譯完成後,在 build/tmp/deploy/ 資料夾底下,會多出 sdk 資料夾,而裡面會有 ToolChain安裝檔,如下圖:
如何安裝ToolChain
把上面編譯出來的ToolChain安裝檔,執行並且加上參數 -h ,可以看到此安裝檔的使用說明,如下所示:
./oecore-x86_64-aarch64-toolchain-nodistro.0.sh
-h
Usage:
oecore-x86_64-aarch64-toolchain-nodistro.0.sh [-y] [-d <dir>]
-y
Automatic yes to all prompts
-d
<dir> Install the SDK to <dir>
========
Extensible SDK only options ============
-n Do not prepare the build
system
-p Publish mode (implies -n)
======== Advanced
DEBUGGING ONLY OPTIONS ========
-S Save relocation scripts
-R Do not relocate executables
-D use set -x to see what is
going on
-l list files that will be
extracted
如果沒有使用 "-d" 來指定安裝路徑,則系統預設會安裝在 /usr/local/oecore-x86_64/
簡單的安裝指令如下,會把ToolChain安裝在 /opt/ 路徑下:
# ./oecore-x86_64-aarch64-toolchain-nodistro.0.sh
-d /opt/
可以看到 /opt/ 底下有一些檔案,有一些是環境變數設定檔,而ToolChain都在 sysroot資料夾底下
如何編譯可以放在開發版上的 HelloWorld 程式
假設剛剛我們把ToolChain安裝在 /opt/ 底下,我們可以先使用下面指令來設定一些環境變數
# source
/opt/environment-setup-aarch64-poky-linux
環境變數設定好之後,變數 $CC 會是預設的ToolChain執行檔,印出 $CC 這個變數,可以看到如下圖片:
接著先撰寫好簡單的helloWorld.c 小程式,用下面的Command編譯,就可以編譯出開發板可以Run的小程式
# $CC helloWorld.c -o hello
由這邊也可以發現,當要自己加入Package 到 Yocto Project,通常這個Package的 Makefile裡面,不能指定CC的值,不然編譯會出問題,關於這個議題,我再開一篇文章來講解如何加一個Package到 Yocto Project...
以下方式都是在command 模式,(按小寫i 就會切換到編輯模式,在按一次ESC會切到command模式)
1. 將游標移到字串上,直接按"*" ,可以直接做向下搜尋
2. 輸入"/", 接著輸入字串,可以向下搜尋此字串,接著按"n",可以向下搜尋,按"N",可以向上搜尋
3. 按下"?", 接著輸入字串,可以向上搜尋字串,接著按"n",可以向上搜尋,按"N",可以向下搜尋
4. 按下":",輸入"set num",可以列出整篇文字檔的"行號"
今天在開發platform的時候,準備要把編譯好的 NXP BT module 做insert的動作,卻出現了如下面所列的錯誤訊息:
insmod: ERROR: could not insert module hci_uart.ko: Unknown symbol in module
[ 79.719642] .(1)[5227:insmod]hci_uart: Unknown symbol hci_free_dev (err -2)
[ 79.719810] .(1)[5227:insmod]hci_uart: Unknown symbol hci_alloc_dev (err -2)
[ 79.719875] .(1)[5227:insmod]hci_uart: Unknown symbol hci_unregister_dev (err -2)
[ 79.719889] .(1)[5227:insmod]hci_uart: Unknown symbol hci_recv_frame (err -2)
[ 79.719927] .(1)[5227:insmod]hci_uart: Unknown symbol hci_register_dev (err -2)
以下我們將一步步來說明,如何找出這個問題的原因
1. 首先我們先到linux kernel driver底下,我們使用grep 來找一下,到底哪裡實作了 hci_free_dev()
# grep -rn hci_free_dev
結果找到的都是呼叫此function的地方,於是我們再往上一層路徑去尋找
假設我現在的Source code有git資訊,也就是可以用 "git status" 或是 "git diff" 等指令來查看目前狀態或是差異
假設我目前修改了檔案,路徑與檔名為
/home/danny/src/example/aaa.c
當前所在目錄為 /home/danny/ 底下
打一個patch(讓別人Merge你的修改)
於是我們可以很簡單的,使用下面的命令,先打一個patch檔案
git diff src/example/aaa.c > aaa.c.patch
於是就會多出一個檔案,位於 /home/danny/aaa.c.patch
aaa.c.patch大概內容會如下,可以看到差異:
--- a/src/example/aaa.c
+++ b/src/example/aaa.c
@@ -33,7 +33,11 @@
- printf("Hello\n");
+ printf("Hello World\n");
如何把patch檔Merge入自己的code
假設我現在是在 /home/andy/ 目錄下,先把 aaa.c.patch 複製到此目錄底下
接著確定此檔案確實存在 src/example/aaa.c
使用以下指令把patch檔打入
patch -p1 < aaa.c.patch
這樣就可以了!!