邁向嵌入式系統之路

養台四軸當寵物

Browse by Category or Tag


Linux kernel 4.7

Linux kernel 4.7已經於2016年7月24日釋出。 目前自己比較注意的更新有: New ‘schedutil” frequency governor : 動態控制CPU時脈的效率變好了。 Histograms of events in ftrace : 可以看有哪些process正在讀取檔案。 perf這次新增了很多功能(太多了來不及看)。 Allow BPF programs to attach to tracepoints: tracepoints可以用來分析系統表現,不過沒用過。 Support for creating virtual USB Device Controllers in USB/IP : 虛擬USB裝置 LoadPin, a security module to restrict the origin of kernel modules : 保證kernel載入的檔案都來自同樣的檔案系統?...

Comment  Read more

C的內聯函式(inline function)

內聯函式(inline function)的作用 內聯函式是一種編譯最佳化的方式。 對於一些內容較為簡短又常使用的函式,編譯器在程式設計師的建議(使用關鍵字inline)下, 可以將指定的函式插入並取代每一處呼叫該函式的地方, 從而減少呼叫函式耗費的時間。 例如: #include <stdio.h> inline int f(int num) { return num-1; } int main(){ int i = f(4); } 如果編譯器採納程式碼中的建議,結果就會變成 #include int main(){ int i = 4-1; } C++很早就支援內聯函式,而C是到了C99才正式把內聯函式納入標準, 而GCC在C99之前就已經有內聯函式的extension了。 內聯函式與巨集(Macro)的差別 最大的差別就是,巨集(macro)是預處理器(preprocessor)處理的,而內聯函式是編譯器(compiler)處理的。 所以實際使用上會有以下的區別。 編譯器可以不接受原始碼給的inline建議,不用取代的方式而維持呼叫該指定函式。但是巨集一定得替換。 巨集並不檢查輸入參數的類型,內聯函式則會。 巨集使用的是文本替換,很難發現編譯錯誤,也可能導致無法預料的後果。 函式基本上是用時間換取空間,透過在函式堆疊的切換,程式如果必須頻繁重複某些動作, 只要將其抽出成為函式,則大家共用同一份程式即可。 巨集則是拿空間換取時間,在編譯前,預處理器將該字串替換至各個呼叫區塊,所以相同的動作或字串在會重複出現在各個地方, 但是由於執行時間不需要在函式堆疊切換,可節省切換時間,但是程式有可能會因為字串重複出現變大。 內聯函式就比較像函式跟巨集的折衷產物:編譯器覺得要求合理就將此函式內聯展開,不合理就當一般函式呼叫。 不過內聯函式跟巨集相比編譯的時間會相對增加(因為要複製程式碼或偵錯等), C99/C11的inline function 根據C99/C11...

Comment  Read more

Embedded system programming on arm cortex m3m4 -- 02: 詳細架構

cortex M3/M4 開發者須知資訊 程式設計模型(programming model) 例外處理(exceptions) 記憶體映象(memory map) 外設裝置介面(peripheral interface) 驅動程式(S/W driver)的使用 Programming model 有兩個主要的部份需要注意: Operational modes / Access levels Operational modes是指處理器的執行模式,有兩種: - 執行緒模式(Thread mode): 此為處理器執行一般應用程式的模式,可以有優先權(privileged level)或非優先權(unprivileged level)。 當處理器被重新啟動時會先進入此模式。 - 處理模式(Handler mode):此為處理器處理例外處理或中斷時的唯一模式,一定有優先權。 Access levels是針對處理器資源的存取限制,分為: - 優先級(privileged level):對處理器的所有資源都可存取,處理模式(Handler mode)一定有優先權, 而執行緒模式(Thread mode)是預設為優先級的(可以變更)。 - 非優先級(unprivileged level):對處理器的資源存取受限,執行緒模式可以在此level下執行。 切換 access level 處理器一開始一定是在優先級的執行緒模式,這時候可以將其切換到非優先級(Control[0]=1)。 但是在執行緒模式下,非優先級不能直接變成優先級。 非優先級的執行緒模式要是想回到優先級,必須使用例外處理,當處理器處在處理模式時會變成優先級(Control[0]=0)。 然後再跳回執行緒模式即可。...

Comment  Read more

Embedded system programming on arm cortex m3m4 -- 01: 簡介

為啥要用 ARM Cortex M3/M4? 因為很便宜:Cortex M3/M41 系列(32 bit)的價位相當於一個常見的8或16bit的普通microcontroller(大量購買的情況下), 同樣的價位卻有更好的效能。 高速:雖說是32bit處理器,頻率卻比MSP430、AVR或PIC等高多了,甚至勝過8bit的microcontroller。 低耗電量:效能比ARM7TDMI好,但是耗電量卻較低。 Code density較高:Cortex M3/M4使用thumb2指令集(16bit指令+32bit指令), 所以code density2 較一般16bit指令集來得高。ROM跟flash能因此得到有效率的應用。 較好的中斷管理:內建中斷控制可支援最多240個外部中斷,而且中斷延遲也因此大幅改善,成為即時系統的一個好選擇。 參考資料 Embedded System Cortex-A為具有高效能的應用型配置,Cortex-M為微處理器配置,Cortex-R則使用在即時系統。 ↩ Code density : 每單位的memory可以傳送多少指令 ↩

Comment  Read more

C/C++ 十三誡

原文來自ptt C_and_CPP 置底文:[重要] 發文前務必閱讀:常見問題十三誡 以下為本人編修過後的版本 01. 你不可以使用尚未給予適當初值的變數1 錯誤例子 int accumulate(int max) /* 從 1 累加到 max,傳回結果 */ { int sum; /* 未給予初值的區域變數,其內容值是垃圾 */ for (int num = 1; num <= max; num++) { sum += num; } return sum; } 正確例子 int accumulate(int max) { int sum = 0; /*...

Comment  Read more