這篇文章是咬牙堅(jiān)持寫的,目標(biāo)是讓你能看懂,寫完發(fā)現(xiàn)的確是很難懂,全是我的錯(cuò),其實(shí)錄個(gè)視頻講一講可能就明白了(后面一定補(bǔ)上,我保證。。。),關(guān)于軟件追蹤,可能是我們?cè)谘邪l(fā)階段中最重要的收尾環(huán)節(jié),希望這篇文章像一粒種子一樣,種在你的小腦袋瓜里,不求看懂,大體知道還有這么一個(gè)玩意兒,等你真正想要應(yīng)用它到你的項(xiàng)目當(dāng)中時(shí),我強(qiáng)烈建議你點(diǎn)個(gè)收藏,memeda,下面開啟復(fù)雜難懂的正文。
軟件追蹤其實(shí)最重要的并不是如何移植,這個(gè)相對(duì)來講比較簡(jiǎn)單,最重要的是如何在目標(biāo)板你需要的追蹤內(nèi)容,并根據(jù)輸出的最終記錄分析你的系統(tǒng)動(dòng)態(tài)運(yùn)行的軌跡,看看是否符合你的狀態(tài)機(jī)圖設(shè)計(jì),確保程序的健壯性。建議先往后拉,文章的末尾有這個(gè)軟件demo的狀態(tài)圖,設(shè)計(jì)的原圖,有點(diǎn)本末倒置,見諒,大體有個(gè)數(shù),然后再繼續(xù)我們的講解。
這里如何通過軟件追蹤記錄來分析軟件的執(zhí)行流程,正常來講其實(shí)應(yīng)該先講一下,這個(gè)軟件大概的一個(gè)功能,有了大體的理解以后再去講追蹤記錄,這里我想嘗試一下在不了解這個(gè)軟件功能的情況下,對(duì)比源代碼來看一下軟件執(zhí)行流程。進(jìn)一步了解狀態(tài)機(jī)的狀態(tài)遷移及執(zhí)行流程。
1.初始化記錄,bsp.c文件中相關(guān)的記錄與源代碼對(duì)應(yīng):
2.初始化記錄,Philo.c文件中相關(guān)記錄與源代碼對(duì)應(yīng):
===RTC===> St-Init (完成了狀態(tài)機(jī)的init初始化,RTC的意思是,運(yùn)行到完成,可理解為連續(xù)執(zhí)行,后面的->Philo_thinking為狀態(tài)轉(zhuǎn)換,也是就是執(zhí)行Q_TRAN的目標(biāo)狀態(tài)),狀態(tài)機(jī)在進(jìn)行狀態(tài)轉(zhuǎn)換的時(shí)候,到目標(biāo)狀態(tài),要執(zhí)行目標(biāo)狀態(tài)的進(jìn)入處理。
3. 初始化記錄,Philo.c文件中相關(guān)記錄與源代碼對(duì)應(yīng):
下面進(jìn)行關(guān)鍵部分的分析,就是這個(gè)軟件是怎么跑起來的,這是事件驅(qū)動(dòng)型的系統(tǒng),所以有輸入的部分,才會(huì)激活這個(gè)系統(tǒng),例如系統(tǒng)定時(shí)發(fā)送一個(gè)事件給目標(biāo)對(duì)象:
目標(biāo)對(duì)象接收事件追蹤記錄:
接下來我們根據(jù)記錄,找到源代碼,看看這個(gè)狀態(tài)處理函數(shù),如何處理這個(gè)事件,然后按照我們的執(zhí)行流程去對(duì)比追蹤記錄的反饋,看看是否一致?狀態(tài)處理函數(shù)如下:
到這里程序運(yùn)轉(zhuǎn)的流程基本上從源代碼的方向分析完了,接下來對(duì)比一下QSPY的追蹤記錄是否吻合,先貼出這塊的追蹤記錄,再逐條分析一下,看看狀態(tài)到底是不是這樣轉(zhuǎn)換的。
整個(gè)系統(tǒng)執(zhí)行反饋的記錄完美的與我們程序設(shè)計(jì)的轉(zhuǎn)換執(zhí)行路線相同,確定軟件是我們?cè)O(shè)計(jì)的運(yùn)行軌跡進(jìn)行狀態(tài)轉(zhuǎn)換的。到這里整篇軟件追蹤就結(jié)束了,有興趣的同學(xué)可以研究研究原文,在對(duì)照我做的分析做下參考。最后送上我們的QM生成的狀態(tài)圖,其實(shí)我們的代碼都是這個(gè)QM狀態(tài)圖自動(dòng)生成的,只是部分內(nèi)容我們自己填寫,如下: