# Lab1
* <font color="#0066CC"> Please explain what is `arm-linux-gnueabihf-gcc`? Why don’t we just compile with `gcc`?</font>
* eabi: 嵌入式ABI,嵌入式應用二進制街口指定了文件格式、數據類型、暫存器使用、堆積組織優化和在一個嵌入式軟件中的參數的標準約定。
* hf: armhf架構,用fpu計算,傳參數也用fpu中的浮點暫存器傳,省去了轉換,性能最好,但是中斷負荷高
* 因為 embedded 和 host 的計算機架構不同,所使用的library也不同,所以不能直接用 `gcc`
* <font color="#0066CC"> Can executable `hello_world` run on the host computer? Why or Why not? </font>
* 不行
# Lab2
* <font color="#0066CC"> What are the cmake and make for? What is the relationship between them? </font>
* cmake & make 都是編譯工具
* CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object)).它的作用和qt的qmake是相似的。
* <font color="#0066CC"> Why there are so many arguments in the compilation command(step 4.4.2)? What are they for?</font>
* -I:這用於指定編譯器應該查找header files的其他包含目錄
* -L:這用於指定連接器應該查找library的其他庫目錄
* -Wl,-rpath-link:這用於為連接器指定運行時dependent shared library搜索路徑 RUNPATH。這些路徑用於在執行期間查找動態庫(.so文件)
* provides a hint to the linker about where to find dependent shared libraries during the linking process. It doesn't affect the runtime behavior of the resulting binary or library.
* -lpthread:這鏈接了libpthread庫
* -lopencv_world:這鏈接了OpenCV庫,具體是libopencv_world庫
* <font color="#0066CC"> What is `libopencv_world.so.3.4.7` for? Why do we need to use `LD_LIBRARY_PATH=. ./demo` to run the executable? What would happen if we just run with `./demo` ? Why?</font>
* .so: dynamically linked shared object libraries,在執行時動態載入
* The "world" module in OpenCV is a unified binary/library that contains all the individual OpenCV modules combined. Instead of linking against each module's library separately
* LD_LIBRARY_PATH是Linux環境變數名,該環境變數主要用於指定查找共享庫(動態連結庫)時除了默認路徑之外的其他路徑(/lib & /usr/lib)。
* 程式執行時,當執行函數動態連接.so時,只會從找/lib & /usr/lib,若找不到library則會發生錯誤
* <font color="#0066CC"> It is so complex and difficult to show a picture by using the framebuffer. Why don’t we just use `cv::imshow()` to do this work? </font>
* cv::imshow(): 在指定視窗中顯示影像(受到螢幕解析度的限制)
* No Windowing System (such as X11 (on Linux))
* Direct Control & Performance
* <font color="#0066CC"> What is a framebuffer? </font>
* framebuffer 是把螢幕上的每個點對映成一段線性記憶體空間,程式可以簡單的改變這段記憶體的值來改變螢幕上某一點的顏色
* <font color="#0066CC"> What is the result of the command below? Why? </font>
* screen redirect to file
* file redirect to frame buffer
* So, 螢幕不會改變
```
sudo cat /dev/fb0 > fb0
sudo cat fb0 > /dev/fb0
```
* <font color="#0066CC"> You can find there is a file named `fb1` under `/dev` directory. What is the difference between `/dev/fb0` and `/dev/fb1` ? Why we use `/dev/fb0` rather than `/dev/fb1` ?</font>
* `/dev/fb0`: primary, 是embedded framebuffer(LCD)
* `/dev/fb1`: secondary
___
### LABs Details
* 透過 `open` + `ioctl` 來取得 framebuffer 資訊 (/dev/fb0)
* 藉由 `ofstream` 寫入到 LCD framebuffer
* DOS: 顯卡 bios 直接對螢幕寫屏
* Linux: 顯卡硬體抽象化,提供 framebuffer 讓用戶直接寫屏
* RS-232(UART): 按照1個bit 接著1個bit傳輸 (串列通訊)
* 只用一條線來傳資料,所以它沒有額外的clock
* 非同步收發傳輸器
* 要設定 baud rate ,盡量跟對方傳輸速度一樣
* 1. `cv::imread` 或 `cv::VideoCapture` 取得圖片資訊
* 2. BGR to BGR565 (16-bit image) --> LCD requirement
* 3. ofstream 操作螢幕寫入
* `cv::VideoWriter`: 錄影
* `cv::imwrite`: 截圖
* multi-thread: 偵測按鍵輸入
https://zhuanlan.zhihu.com/p/558495267
https://ecomputernotes.com/computer-graphics/basic-of-computer-graphics/what-is-frame-buffer
https://www.cnblogs.com/createyuan/p/4437912.html
https://www.cnblogs.com/liangliangge/p/14403773.html
https://makerpro.cc/2016/07/learning-interfaces-about-uart-i2c-spi/
https://ithelp.ithome.com.tw/articles/10325085?sc=rss.iron
https://www.strongpilab.com/rs232-uart-difference/