2020年3月7日 星期六

Message Sequence Chart

Message Sequence Chart (MSC) 可以用非常直觀的方式,來描述系統組件中的對應關係。
這邊紀錄與繪製 MSC 有關的網路資源 。

1. mscgen :
透過設計好的語法,mscgen 程式可自動繪製出MSC圖表,doxygen 產生的文件便是使用此工具繪製。 
例如:
輸入
msc{
  A, B;
  A -> B [label="request"];
  B -> A [label="response"];
}
便會繪製出下列 MSC 圖
語法介紹在此 http://www.mcternan.me.uk/mscgen/ 

2. 網頁版的 mscgen
可以直接在網頁上輸入語法,由 JavaScript 協助繪製 MSC 圖表。
https://mscgen.js.org  

3. Visual Studio Code
一個跨平台的應用程式,安裝 mscgen plugin 之後,就可以直接繪製 MSC 圖表。
Visual Studio Code - Code Editing. Redefinedcode.visualstudio.com 

此處僅整理可透過語法自動產生 MSC 的工具。
若需要比較漂亮的 MSC,可能還是得使用其他工具,手動拉圖繪製。

2020年1月29日 星期三

Autotools 用法舉例


1. 參考網路文章,整理操作步驟如下

  • 先建立程式碼,並在對應目錄內先寫好 Makefile.am
  • 執行 autoscan 生成 configure.scan, 複製成 configure.ac 並進行修改
  • 執行 aclocal 命令。掃描 configure.ac 檔案生成 aclocal.m4 檔案。
  • 執行 autoheader 命令。該命令生成 config.h.in 檔案。
  • touch NEWS README AUTHORS ChangeLog
NEWS README AUTHORS ChangeLog:
這些檔案是GNU軟體的標配,不過在專案中不一定需要加入。
如果專案中沒有這些檔案,每次autoreconf會提示缺少檔案,不過這並不影響。
  • 執行 automake -a -c -f 該命令生成 Makefile.in 檔案。
  • 執行 autoconf 命令。這個命令將 configure.ac 檔案中的巨集展開,生成 configure 指令碼。
  • 執行 ./congigure 命令。將Makefile.in命令生成Makefile檔案,開始編譯
$ ./configure --prefix=`pwd`/../test
$ make
$ make install
  • 若再次修改 configure.ac,則需要重複下列步驟
$ aclocal
$ autoheader
$ automake -a -c -f
$ autoconf


2. 實際測試步驟整理如下
a. 先安裝 autotool
$ sudo apt install autotools-dev m4 autoconf
$ sudo apt install autoconf-archive gnu-standards autoconf-doc libtool
b. 假設原始目錄架構如下
~/test/autotool_test$ tree
.
  ├── inc
  │   └── liba.h
  ├── src
  │   └── liba.c
  └── test
      └── test.c
c. 在對應目錄內先寫好 Makefile.am
Makefile.am
SUBDIRS = src test
src/Makefile.am
AM_CFLAGS = -I../inc
liba_LIBRARIES = liba.a
liba_a_SOURCES = liba.c liba.h
include_HEADERS = ../include/liba.h
test/Makefile.am
LDADD = ../libs/liba.a
AM_CFLAGS = -I../inc
bin_PROGRAMS = test
test_SOURCES = test.c 
d. 按照上述操作步驟生成 configure.ac, 修改後的檔案如下
AC_PREREQ([2.69])
AC_INIT(mytest, 1.0.0, alb423@gmail.com)
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([src/liba.c])
AC_CONFIG_HEADERS([config.h])
AC_PROG_CC
AC_PROG_RANLIB
AC_CONFIG_FILES([Makefile
   src/Makefile
   test/Makefile])
AC_OUTPUT
e. 後續按照上述操作步驟執行即可。

參考資料

  • https://www.slideshare.net/zzz00072/gnu-make-autotools-cmake
  • https://slidesplayer.com/slide/15153334/
  • https://www.lrde.epita.fr/~adl/autotools.html



Makefile 中的 CFLAGS 變數套用順序

當使用 make 編譯程式時,若有多處定義 CFLAGS,則最終結果應該為何呢?

針對此疑問,整理相關資訊如下:

1. 若在命令列有先指定 CFLAGS, 則 Makefile 內的變數就不會套用。
例如: 執行 make CFLAGS=-g ,則 Makefile 內的 CFLAGS 便會失效 
原文如下:
If a variable has been set with a command argument (see Overriding Variables), then ordinary assignments in the makefile are ignored. If you want to set the variable in the makefile even though it was set with a command argument, you can use an override directive, which is a line that looks like this:
https://www.gnu.org/software/make/manual/html_node/Overriding.html


2.  若在命令列有先指定 CFLAGS, 但仍想要讓 Makefile 內的 CFLAGS有效,可使用 override 關鍵字
原文如下:
Variable assignments marked with the override flag have a higher priority than all other assignments, except another override. Subsequent assignments or appends to this variable which are not marked override will be ignored.
https://www.gnu.org/software/make/manual/html_node/Override-Directive.html#Override-Directive 
實際例子如下
https://github.com/buildroot/buildroot/blob/master/package/irrlicht/0001-override-CPPFLAGS-CXXFLAGS-and-CFLAGS-in-Makefile.patch

3. 若編譯時,命令列沒有帶入 CFLAGS,則直接參考 Makefile 內的 CFLAGS 設定即可。


2019年12月7日 星期六

Linux priority

Linux priority 基本概念可參考此篇介紹,摘錄如下:
In Linux system priorities are 0 to 139 in which 0 to 99 for real time and 100 to 139 for users. nice value range is -20 to +19 where -20 is highest, 0 default and +19 is lowest. 
The relation between nice value and priority is :
PR = 20 + NI
so , the value of PR = 20 + (-20 to +19) is 0 to 39 that maps 100 to 139.

Linux schedule policy 分成兩大類,如下:

  • normal (只能修改 nice value 進行調整, 調整後的 priortiy 介於 100~139)
  • SCHED_OTHER
  • SCHED_BATCH
  • SCHED_IDLE
  • real-time (調整後的 priortiy 介於 0~99)
  • SCHED_FIFO
  • SCHED_RR
其優先權如下
SCHED_FIFO = SCHED_RR > SCHED_OTHER ~ SCHED_BATCH > SCHED_IDLE

我們可藉著設定 process schedule policy ,更改 process priority,舉例如下

1. 建立 thread 時,指定 priority
struct sched_param param;
param.sched_priority = 1;
s = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
if (s != 0)
   handle_error_en(s, "pthread_attr_setinheritsched");
s = pthread_attr_setschedpolicy(&attr, SCHED_RR);
if (s != 0)
   handle_error_en(s, "pthread_attr_setschedpolicy");
param.sched_priority = sched_get_priority_min(SCHED_RR);
s = pthread_attr_setschedparam(&attr, &param);
if (s != 0)
   handle_error_en(s, "pthread_attr_setschedparam");
 
2. 當 thread 建立之後,動態改變 priority
struct sched_param param;
param.sched_priority = 1;
pthread_setschedparam(pthread_self(), SCHED_RR, &param);


另外當程式執行之後,可以使用下列命令,得知各個 Thread 的 priority
$ ps H -C a.out -o 'pid tid pri nice cmd comm'
  PID   TID PRI  NI CMD                         COMMAND
16062 16062  19   0 ./a.out 123                 a.out
16062 16063  41   - ./a.out 123                 ./a_client
注意:此處 PRI 跟使用 top 看到的 priority 會有差距,其換算公式為 priority = 39 - PRI

Reference:


2018年10月20日 星期六

Apple CarPlay

昨天(20180820) 剛花了一萬幫 mazda 3 裝了CarPlay,用此篇來記錄 CarPlay 的參考資料與個人覺得方便的使用方法。

使用方法:
1. 升級至 iOS 12。
2. 安裝 Google Map。
3. 在iPhone 上選擇「設定」>「一般」>「CarPlay」>「Mazda」,調整 app 位置。
4. 手機加上 mazda hub 之後,直接喊 “hi siri" 下命令即可。
例如:“帶我去大遠百”,“播放音樂”,“打電話給xxx"

問題或限制:

  • Mazda 預設音樂播放程式會顯示專輯圖片,CP則不會。
  • Youtube 影片無法鏡像,但聲音可以透過車上喇吧出聲。但使用GoogleMap之後,youtube 聲音會自動暫停。


參考資料:
  • 縮寫
  • AA: Android Auto
  • CP: Car Play


2018年9月23日 星期日

[Embedded] Buildroot -- 建置 gstreamer 的流程

本篇說明如何編譯gstreamer以及相關檔案。為了簡單,僅記錄使用 buildroot 的編譯步驟,如下:

 1. 安裝 buildroot
a. 安裝 buildroot,安裝過程可參考此篇  。
b. 執行下列指令,試試 buildroot 建立的image是否正確。 
$ cd output/images
$ QEMU_AUDIO_DRV=alsa qemu-system-arm -kernel zImage \ -M vexpress-a9 -m 512 -drive file=rootfs.ext2,if=sd,format=raw \ -dtb ./vexpress-v2p-ca9.dtb \ --append "root=/dev/mmcblk0 console=ttyAMA0,115200" -nographic
2. 編譯 gstreamer
a. 設定 gstreamer 選項,再次編譯
$ cd buildroot/buildroot-2017.11
$ make menuconfig
b. ToolChain 設定修改成 glib 
Toolchain -> C library -> glibc  
c. 選擇 gstreamer 
Target packages -> Audio and video applications -> gstreamer 1.x
為了方便使用,建議開啟 gst1-libav, gst1-rtsp-serve 
 
另外 gst1-plugins-base, gst1-plugins-good 也要選擇自己需要的,例如選擇rtsp, alsa, souphttpsrc, videoconvert
d. 重新編譯
$ make clean;make 
e. Test Gstreamer 
$ QEMU_AUDIO_DRV=alsa qemu-system-arm -kernel zImage \ -M vexpress-a9 -m 512 -drive file=rootfs.ext2,if=sd,format=raw \ -dtb ./vexpress-v2p-ca9.dtb \ --append "root=/dev/mmcblk0 console=ttyAMA0,115200" -nographic
$ gst-launch-1.0 -v fakesrc num_buffers=5 ! fakesink 
輸出結果如下:到達此步驟,表示編譯成功。
Pipeline is PREROLLING ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
Got EOS from element "pipeline0".
Execution ended after 0:00:00.003942000
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
Setting pipeline to PAUSED ... 
若是剛剛編譯有加入 souphttpsrc則可以試試此命令 
$ gst-launch-1.0 souphttpsrc is-live=true location=http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8 ! hlsdemux ! decodebin ! videorate ! videoconvert ! ximagesink
3. 編譯成功後,若要在嵌入式平台上使用,則要注意相關 library 是否都已存在於平台內。
$ arm-linux-gnueabihf-readelf -d ./gst-launch-1.0
Tag                Type                               Name/Value
0x00000001 (NEEDED)                     Shared library: [libgstreamer-1.0.so.0]
0x00000001 (NEEDED)                     Shared library: [libgobject-2.0.so.0]
0x00000001 (NEEDED)                     Shared library: [libgmodule-2.0.so.0]
0x00000001 (NEEDED)                     Shared library: [libglib-2.0.so.0]
0x00000001 (NEEDED)                     Shared library: [librt.so.1]
0x00000001 (NEEDED)                     Shared library: [libdl.so.2]
0x00000001 (NEEDED)                     Shared library: [libpthread.so.0]
0x00000001 (NEEDED)                     Shared library: [libc.so.6]
參考資料:


2018年8月3日 星期五

coverity 用法

Coverity 是一套靜態程式碼分析工具,現在可以免費提供使用,以下紀錄用法。

a. 連上網站 https://scan.coverity.com/

b. 選擇 "Sign Up For Free"

c. 接著選擇 "Sing in with GitHub"

d. 選擇 "Add a New Project"

e. 選擇 "Register my GitHub project"

f. 選擇 "Reload repository list from GitHub"

g. 選擇設定想要掃描的 project

h. 下載  Coverity Build Tool
$ https://scan.coverity.com/download/cxx/linux64/cov-analysis-linux64-2017.07.tar.gz
$ tar xvf cov-analysis-linux64-2017.07.tar.gz
$ export PATH=~/cov-analysis-linux64-2017.07/bin:$PATH

i. 接著進行 local build,並將編譯結果壓縮成 tar 檔
$ cov-build --dir cov-int make
$ tar czvf myproject.tgz cov-int

j. 選擇 submit build 上傳 tar file,然後等待 Server 分析結果

參考資料:
https://scan.coverity.com/