如何熟悉一個平臺的SDK(1)

從個人的角度,總結一下。

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是什麼?)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章