從個人的角度,總結一下。
1.構建對SDK的整體認識
一個平臺,一般都有一個SDK,並搭配有datasheet,也就是對SDK的整體架構的介紹、各個功能模塊的介紹。因此,我們可以通過閱讀官方的SDK文檔,構建對SDK的整體認識。
官方的SDK文檔,數量非常多。就涉及選擇問題:先讀什麼,後讀什麼?
首先,閱讀SDK的框架(整體介紹)的文檔。第一遍,要略讀,不需每一頁都精讀。理解不了,沒有關係。後面我們會回頭有針對性地重點閱讀。
然後,根據從SDK的框架文檔瞭解的層次或模塊關係,有重點的選擇閱讀子模塊或子系統的文檔。這個階段仍然以略讀爲準。
第一遍以略讀爲準,有2個目的:
(1)對官方所有SDK文檔分類,爲以後開發階段查找資料建立索引;
(2)通過略讀,構建一個SDK的框架圖,獲得SDK的整體認知。
2.閱讀SDK代碼
如果是MCU之類的單片機系統,那麼,首先找到main()函數(或者類似的系統主入口)。然後,識別SDK代碼的主線程(或主循環)。嘗試使用以下方法:
(A)增加打印調試語句;
(B)屏蔽部分函數(代碼);
摸清楚程序的運行邏輯。
如果是rtos之類的OS系統,那麼,就複雜多了。下面以相機的SDK爲例,展開討論。
2.1 淺析RTOS應用層消息機制
一般的rtos系統,它的架構分爲4層,從上到下依次是:
Application
Middleware
System
Hardware
如果我們做驅動軟件開發,下面的內容對我們幫助不大。
如果我們做應用層軟件開發,那麼需要重點了解Application。
應用系統可以實現爲消息驅動(也稱爲事件驅動)。這意味着所有狀態改變和操作都由特定消息驅動。因此,我們需想辦法找到rtos應用層的消息樞紐。它負責接收消息,預處理,轉發消息。
如果我們曾經做過MFC,那麼對於消息機制應該是非常熟悉。MFC是Windows系統的應用框架技術。消息機制也是嵌入式rtos系統的重要組成部分。
下面是消息機制的示意圖:
[消息源] --------> [消息樞紐中心] --------> [消息處理者]
下面以“用戶操作相機開始錄像”實例進行說明。
在這個場景中:
(A)“用戶按下按鍵”會觸發“按鍵中斷”,激活“錄像鍵按下消息”;
(B)此消息通過消息循環發送到“消息樞紐中心”;
(C)“消息樞紐中心”轉發,發送給當前“消息處理者”(備註:current active object);
(D)“消息處理者”接收到“錄像鍵按下消息”後,先判斷相機當前狀態,如果是“預覽”狀態,那麼調用“record_start()”函數開始錄像。
簡而言之,我們可以通過“跟蹤某一個消息流”來學習SDK。
上述方法適用於學習以下基本的流程(場景):
(A)按下/釋放按鍵,觸發菜單設置;
(B)按下/釋放按鍵,觸發錄像/拍照/回放等;
2.2 通過調試打印弄明白某個流程
如果我們曾經做過VC/VC++軟件調試,那麼一定使用過“斷點調試”。“斷點調試”是查看程序運行細節的利器!
嵌入式軟件,如果是在linux上調試一個模塊的代碼,可以使用gdb工具。但是對於運行在相機內的rtos系統,通常無法直接使用gdb工具。不用擔心,我們可以使用最簡單但是一樣有效的方法——“調試語句”。
在代碼的關鍵函數或代碼塊裏,增加類似下面的打印語句:
printf("-------- [%s-%d] -------- %d --------", __FUNCTION__, __LINE__, result);
編譯、燒錄firmware。
先把設備的串口接入電腦的串口(或者USB轉串口),設備上電,操作,觀察串口終端工具(例如:SecureCRT)的打印字符串,可以準確地獲知:
(A)程序跑了哪些流程?
(B)某一個函數的返回值result是什麼?(或者系統的某個狀態值result是什麼?)