2023年7月3日星期一

Linux kernel 4.19版 中,計算執行時間的方法,範例程式

首先需要 include 這個 header file 

#include <linux/time.h>


然後使用下面的方式,搭配 printk 在kernel 端印出計算時間,
這邊我們取 microseconds (10-6)

struct timeval start_time, end_time;

unsigned long elapsed_time;


 printk(KERN_ERR "#### measure time start %s ####\n", __func__);

do_gettimeofday(&start_time);   // Get the starting time

...

...

...

do_gettimeofday(&end_time);     // Get the ending time

 

// Calculate the executing time

elapsed_time = (end_time.tv_sec - start_time.tv_sec) * 1000000 +

                              (end_time.tv_usec - start_time.tv_usec);


printk(KERN_ERR "#### Elapsed time: %lu microseconds\n", elapsed_time);

printk(KERN_ERR "#### measure time end %s ####\n", __func__);



另外在 kernel 較新的版本當中,如果 do_gettimeofday() 無法使用,可以試試看下列方法

#include <linux/ktime.h>
#include <linux/types.h>

ktime_t start, end;
s64 elapsed_ns, 
elapsed_us;

start = ktime_get();

...
...
...

end = ktime_get();

elapsed_ns = ktime_to_ns(ktime_sub(end, start));
elapsed_us = ktime_to_us(elapsed_ns );

printk(KERN_ERR "#### Elapsed time: %lld microseconds\n", elapsed_us);


2023年6月6日星期二

Android 4.2.2 無法使用 YouTube的解決方法,使用 NewPipe Legacy

 在網路上查詢了很久,總算找到了一個解法
 並且讓我的舊平板電腦,也可以上 YouTube看影片

NewPipe 是一個 Open source,如果你的Android 是 4.2.2 (低於 Android 4.4)
可以到以下的網站,下載 NewPipe Legacy (0.20.8版)

https://f-droid.org/packages/org.schabi.newpipelegacy/#latest












If your device is Android 4.2.2 and cannot successfully use the YouTube, you can install the "NewPipe Legacy" APK.

The NewPipe Legacy is an open source. After I install into my Table computer, the YouTube can work now. You can use your Table computer and click the following link. Then download the version 0.20.8, this should be work. 

Best Regards!


[Linux Audio] 使用ALSA API 實作amixer command: amixer -c0 set i2s_clock on

當在我們的device端,可以使用命令 "amixer -c0 set i2s_clock on" 來開啟 i2s_clock
                                   也可以使用命令 "amixer -c0 set i2s_clock off" 來關閉 i2s_clock

這表示我們的device 底層,已經有建立 "i2s_clock" 這個kcontrol,因此我們使用amixer 命令,才可以順利的再取呼叫到kcontrol所定義好的 function,進而做到function裡面所實作好的行為

簡單的kcontrol,大概如下圖所示: (此範例為MTK mt6880 audio card)





*註 SOC_SINGLE_EXT 是Linux底下的巨集,想知道定義可以去kernel底下 include/sound/soc.h 查看

以上簡單描述一下kcontrol,接下來進入本文章的主題,如何使用ALSA API來實作一個API,讓別人呼叫此API,就達到跟 amixer command 一樣的行為,底下是一個簡單的實作範例


#include <stdio.h>

#include <alsa/asoundlib.h>


int set_mixer_onoff(const char *control_name,
                            int option)
{
    const char *device = "hw:0";  // 音訊設備的名稱或識別符號
    //const char *control_name = "i2s_clock";  // 控制元素的名稱, 由API參數帶入

    snd_ctl_t *handle;
    snd_ctl_elem_id_t *elem_id;
    snd_ctl_elem_value_t *elem_value;
    int err;

    // 打開音訊設備的控制界面
    err = snd_ctl_open(&handle, device, 0);
    if (err < 0) {
        printf(":Cannot open device interface: %s\n", snd_strerror(err));  //無法打開音訊設備的控制界面
        return err;
    }


    // 分配並初始化 snd_ctl_elem_id_t 結構
    snd_ctl_elem_id_alloca(&elem_id);
    snd_ctl_elem_id_set_name(elem_id, control_name);


    // 獲取控制元素的索引
    snd_ctl_elem_id_set_interface(elem_id, SND_CTL_ELEM_IFACE_MIXER);

    // 獲取控制元素的數值
    snd_ctl_elem_value_alloca(&elem_value);
    snd_ctl_elem_value_set_id(elem_value, elem_id);
    snd_ctl_elem_value_set_boolean(elem_value, 0, option);  // 設置boolean值為1,由API參數帶入


    // 設置控制元素的數值
    err = snd_ctl_elem_write(handle, elem_value);
    if (err < 0) {
        printf("Cannot set value: %s\n", snd_strerror(err));  //無法設置控制元素的數值
        snd_ctl_close(handle);
        return err;

    }


    // 關閉音訊設備的控制界面
    snd_ctl_close(handle);
    printf("Setting %s %d success\n", control_name, option);  //已成功設置 i2s_clock 為 on
    return 0;

}


最後,編譯成為Library之後,提供對方 library 以及 xxx.h 裡面有包含此API宣告
int set_mixer_onoff(const char *control_name, int option);

對方就可以使用了!



2023年5月9日星期二

Linux底下,一個控制CPU Loading的 Open Source tool,cpulimit (Tool使用方式)

 此篇直接介紹 cpulimit 該如何使用,讓我們做stress-test 可以直接指定想要的CPU Loading

先假設我們的設備為 雙核心(dual-core)的device

我們先撰寫一個loop的shell script,這個script可以把一個CPU使用率,占用到100%
====== loop_1.sh ======
#!/bin/sh

while [ 1 ]
do
    echo 5566 > /dev/null
done
====================

上面這個簡單的小程式,就可以占用100%的一個CPU使用率
所以如果是雙核心的device,很簡單,我們就再搞一個loop script

====== loop_2.sh ======
#!/bin/sh

while [ 1 ]
do
    echo 5566 > /dev/null
done
====================


接著我們再去撰寫一個主要的shell script,可以帶起 loop_1.sh 與 loop_2.sh
並且會去使用 cpulimit 去限制這兩個 loop程式的 cpu 使用率
進而達到我們想要維持的 CPU 使用率

====== cpuload.sh =======
#!/bin/sh

if [ "$#" -lt "1" ]; then
    echo "ex: ./cpuload.sh 40 (limit at 40%)"
    exit
fi

VAL=$1

killall loop_1.sh loop_2.sh

./loop_1.sh &
L1=`ps | grep loop_1.sh | awk -F ' ' '{print $1}'`     #get pid
./loop_2.sh &
L2=`ps | grep loop_2.sh | awk -F ' ' '{print $1}'`     #get pid

./cpulimit --limit=$VAL --pid=$L1 &
./cpulimit --limit=$VAL --pid=$L2 &

=======================

Linux底下,一個控制CPU Loading的 Open Source tool,cpulimit (Cross-compile)

 今天要跟大家介紹一個好用的工具,可以限制某一個Process只允許他使用多少的CPU Loading
 另外,如果要做壓力測試(stress test),只要稍微再搭配一些自己撰寫的shell script
 可以達到自行指定壓力測試所要的cpu loading

 先介紹這個open source,名為 "cpulimit",source code link如下:
 https://github.com/opsengine/cpulimit

 如果要在你的平台上,作壓力測試,請先自行做 Cross Compile,這邊先簡單教你如何編譯出你平台可以使用的tool

 我們可以看到此opensouce的目錄結構如下圖:

 










Step1:

在你下載好的source code,如上圖的路徑底下,先指定好你的CC環境變數
ex: 我要編譯電腦x86 用的tool,我的Toolchain就會是 /usr/bin/gcc,於是我用以下方式指定CC
=>   export CC=/usr/bin/gcc

Step2:

執行make,就可以成功編譯出我們要的工具,"cpulimit"
(如果要重新編譯,記得先make clean)







Step3:

編譯出來的執行程式,會在cpulimit-master/src/ 路徑底下,如下圖:




Step4:

執行cpulimit,可以看到使用方式,如下圖:
我們主要會用到 limit 與 pid 這兩個參數







下一篇文章,再來繼續介紹,怎麼加一些shell script,來做到壓力測試!

2023年5月5日星期五

[shell script] script如何做小數點運算,實際範例

 今天要記錄一個小數點運算的 shell script 範例

我們要把12去除以10,然後要得到值1.2,實際範例如下:


########## Floating point operation #############

#!/bin/sh

VAL=12
VAL=`echo | awk "{print $VAL/10}"`

echo "VAL=$VAL"


結果:




2023年3月5日星期日

永豐大戶綁定行動裝置

 永豐大戶的銀行APP, 目前需要重新綁定裝置

 目前有兩種方式可以來綁定

1. 直接APP內操作綁定: 
如果你的手機SIM卡,電話號碼與你當初申請的號碼是同一個,可以直接使用APP,按照APP建議的步驟來做APP與手機綁定

2. 透過永豐的網頁版,網路銀行來做裝置綁定:
如果你有兩個門號,A與B門號,當初申請永豐是用A門號,而你目前常用的手機是B門號,就需要用這個方式來綁定你B門號的手機
做這個動作,你必須要有電腦,讀卡機,以及永豐金融卡(白色那張),來做認證
步驟如下:
a. 到MMA金融交易網,登入網路銀行,網址如下:
https://mma.sinopac.com/MemberPortal/Member/NextWebLogin.aspx
b. 登入之後,選擇"申請/設定",管理我的行動裝置














c. 選擇新增裝置










d. 選擇晶片晶融卡驗證

















金融卡密碼驗證通過之後,會有個QR Code頁面,接著就使用手機掃描QR Code
手機部分會跳過去永豐APP
接著,就使用APP,選擇 更多->設定-> 裝置綁定,此時就會提醒你,有作過晶片金融卡認證,就可以綁定成功了

使用 lsblk 印出 emmc 每個 partition的"名字"與"size"

使用以下的command可以印出 eMMC的 partition資訊 lsblk --bytes --output name,partlabel,size   參數說明 --bytes: partition的大小,以byte的方式輸出 --output: 後面可以指定要輸出的內容...