Category: C

  • 編譯帶有除錯資訊的 LLVM/Clang library 並於編譯時替換 dynamic library

    編譯帶有除錯資訊的 LLVM/Clang LLVM CMake Build Reference: https://llvm.org/docs/CMake.html LLVM Getting Started: https://llvm.org/docs/GettingStarted.html 快速編譯以及快速連結請參考 LLVM Getting Started 的 Common Problem 的 CMake 選項,上面的範例 CMake 選項已經將 Common Problem 的選項開啟 (或關閉)。 替換編譯時使用的 dynamic library CMake – CMakeLists.txt Makefile 編譯連結時出現 undefined reference to `llvm::DisableABIBreakingChecks’ 確認 include directories 是不是正確的: target_include_directories( foobar PUBLIC /home/llvm-project/build/include) 確認編譯 LLVM/Clang 時是否有加上 LLVM_ENABLE_ABI_BREAKING_CHECKS=OFF 可以透過 cmake . 來更新…

  • Python C Extension package version 設定

    不論是 setuptools 或是 distutils 都無法直接設定 C Extension package 的 version,必須採用紆迴的方式進行。 總而言之,Python 3.6 的年代,我們直接使用 setuptools。 0. 預期結果 >>> import jchash >>> jchash.__version__ ‘1.0’ 1.原始狀況 原始 Init function: PyMODINIT_FUNC PyInit_jchash(void) { return PyModule_Create(&module); } 原始 setup.py PACKAGE_VERSION = ‘1.0’ jchash = Extension(PACKAGE_NAME, define_macros=[ (‘PACKAGE_VERSION’, PACKAGE_VERSION)], sources=[‘src/jchash.c’]) 只有這樣是不夠的,Extension 的 define_macros 是在編譯時會加上 -DPACKAGE_VERSION=1.0 這樣的 flag,可是不會幫你轉換成為 package 的 version。 2.改用 PyModule_AddStringConstant 參考資料:PyModule_AddStringConstant…

  • 使用 C 來編寫 Python 模組 – 以 jump consistent hash 為例

    使用 C 來編寫 Python 模組 – 以 jump consistent hash 為例

    Extending Python with C – Jump Consistent Hash 本文的目標是以 C 完成 Jump Consistent Hash 的主體,接著透過 Python-C-API 轉為 Python 可以使用的套件。也就是說,模組的本體將會以 C 語言寫成,接著透過 setuptools 編譯為 so 檔,如此編成的模組將可以讓 Python 無縫接軌使用。 參考文章與程式原始碼: A Fast, Minimal Memory, Consistent Hash Algorithm: https://arxiv.org/pdf/1406.2294v1.pdf Python c-api: https://docs.python.org/3/c-api/intro.html Extending Python with C or C++: https://docs.python.org/3/extending/extending.html jchash – Jump Consistent Hash for Python: https://github.com/grapherd/jchash   1.我們的目標 閱讀完 <A Fast, Minimal Memory, Consistent…

  • ARM Semihosting 簡介與範例

    前言 – What is semihosting? Semihosting 是 ARM 中的一個機制,使得 ARM target 可以藉由運行 debugger 的 host computer 的 Input/Output 裝置來進行溝通。 Semihost 的實作是透過使用定義好的軟體中斷 (SVCs),使程式在執行過程中產生中斷。一旦目標系統上的程式呼叫到對應的指令 (semihosting call),便產生軟體中斷,接著 Debug Agent 就會負責處理此中斷,進行與主機的溝通。[1] Semihosting Interface Semihosting 透過 SVC 指令來調用相關的命令, 以下為三種不同的使用方式: SVC 0x123456 In ARM state for all architectures. SVC 0xAB In ARM state and Thumb state, excluding ARMv6-M and ARMv7-M. This behavior…

  • Getting Started with Real-time Operating Systems

    Getting Started with Real-time Operating Systems

    影片網址:https://atollic.wistia.com/medias/gwgee6ev93 影片簡單的介紹了 Bare-metal 下的 Scheduling technique, preemption 以及 FreeRTOS 的特性還有有關 Task 基礎事項 (如何建立,Task Control Block, Task State),如果沒有看過 RTOS 相關的東西的話這個影片可以「快轉的」看一下。  

  • 10分鐘讀懂 linker scripts

    10分鐘讀懂 linker scripts

    背景知識: linker:  將多個 input files 輸出為一個 output file. output file 與 input files 的格式是一種特殊資料格式稱做 object file format (目的檔格式),每個檔案則稱做 object file (目的檔),輸出檔則常稱做 executable (可執行檔),當然也能稱為 object file。 每個 object file 都有一個 section list。 input section: 在 input file 的 section。 output section: 在 output file 的 section。 Sections: 每個 section 在 object file 中都有至少有 名子 (name) 跟 大小 (size) 幾乎每個 section…

  • Mutex, Semaphore, the difference, and Linux kernel

    Mutex, Semaphore, the difference, and Linux kernel

    名詞定義 Mutex: Linux kenrel 中的 mutex lock, <include/mutex.h> Semaphore: Linux kernel 中的 semaphore, <include/semaphore.h> mutual exclusion: 中翻互斥鎖,一個概念,為了防止 concurrency 狀況下出現 race condition.   Mutex 與 Semaphore 最大的差異是: 理論上,你應該要先跟面試官或是問你這個問題的人互動,詢問一下其所謂的差異是指哪個部份 (實作、用途、還是結構?),以及詢問這個問題時,想要將兩者應用在那邊,對於後續的回答會有所幫助。 30秒:最大的差異在於 Mutex 只能由上鎖的 thread 解鎖,而 Semaphore 沒有這個限制,可以由原本的 thread 或是另外一個 thread 解開。另外,Mutex 只能讓一個 thread 進入 critical section,Semaphore 的話則可以設定要讓幾個 thread 進入。這讓實際上使用 Mutex 跟 Semaphore 場景有很大的差別。 _ 60秒 (cont.):舉例而言,Mutex 的兩個特性:一個是只能有持鎖人解鎖、一個是在釋放鎖之前不能退出的特性,讓…

  • Debug f9-kernel make config 的 ncurses 按鈕顏色問題
    黑白人生

    Debug f9-kernel make config 的 ncurses 按鈕顏色問題

    今天要講的是修改 f9-kernel menu config 下排按鈕顏色跑掉的問題。 會發現這個問題是因為把 f9-kernel clone 下來想要編譯,在要做 config 的時候發現這個問題。可以從上圖左邊看到 Linux kernel 的 make menuconfig 下排的 button 是有對比顏色的 (<Select> tag active 是黃色的、<Exit> tag 是紅色的),上圖右邊 f9-kernel make config 的部份則是灰色的而已。 這個 bug 花了 3 小時解完,實在是因為我是新手才會遇到這樣的問題。下面會紀錄我這次的 debug 步驟,以及遇到這種情況可以怎麼解的步驟,寄望後人不要為了這種鳥問題而被困住 3 小時。   0. Linux kernel 好像也有這個東西… Linux kernel 也有相對應於 f9-kernel make config 的 make menuconfig,了解這件事情之後,我先strace make menuconfig看發生什麼事情,之後轉用ltrace make menuconfig觀察。不過沒有觀察到什麼有用的東西。 1. 找尋 make config實際發生的事情…

  • gdb 錦囊妙計

    gdb 錦囊妙計

    Wonderful / Amazing TUI in gdb (but what name?)   很少人知道,但是非常有用的  – TUI (Text User Interface) 這個東西可以讓原本很難用的 gdb 變得非常好用 (應該說比較直觀),開啟之後會將畫面切分為二,上層顯示 source code,下層輸入 gdb 指令。以下是 TUI 的相關示範。   輸入 ctrl x + a 開啟 TUI,再次輸入 ctrl x + a 可以關閉 TUI。 TUI mode 中的上下左右鍵移動的是 TUI。 輸入 ctrl + p 可以回到前一個指令,ctrl + n 可以到後一個指令。 如果因為 printf 等輸出弄爛了整著介面,可以按 ctrl…

  • Declaration and Definition in C

    Definition: 定義 occurs in only one place (只能出現一次) specifies the type of an object; reserves storage for it; is used to create new objects example:  int my_array[100]; Declaration: 宣告 can occur multiple times (可以出現多次) describes the type of an object; is used to refer to objects defined elsewhere (e.g., in another file) example:  extern int…