本發(fā)明屬于計算機領(lǐng)域,尤其涉及一種監(jiān)測程序變量值的方法及系統(tǒng)。
背景技術(shù):
在嵌入式底層程序開發(fā)中,經(jīng)常需要監(jiān)測程序中變量的值的變化。使用仿真器在線調(diào)試的時候,可以在集成開發(fā)環(huán)境(ide,integrateddevelopmentenvironment)的功能窗口上查看到程序中變量的值的變化,但是很多時候,不能夠?qū)崿F(xiàn)仿真器在線調(diào)試(例如安全問題、pcb布板問題等),這時可以通過通訊端口(例如串口、spi接口、can接口等)來實現(xiàn)程序的調(diào)試和升級。在使用通訊端口進(jìn)行調(diào)試程序的時候,為了監(jiān)測程序中變量的值的變化,可以發(fā)送命令到底層的mcu,mcu解析命令,然后反饋相應(yīng)的信息,實現(xiàn)對數(shù)據(jù)的監(jiān)測?,F(xiàn)有的技術(shù)方案中,使用if…else或者switch…case語句來實現(xiàn)監(jiān)測程序變量值,在需要監(jiān)測的變量比較多的情況下,代碼量大,執(zhí)行效率低。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于提供一種監(jiān)測程序變量值的方法及系統(tǒng),旨在解決使用if…else或者switch…case語句來實現(xiàn)監(jiān)測程序變量值,在需要監(jiān)測的變量比較多的情況下,代碼量大,執(zhí)行效率低的問題。
第一方面,本發(fā)明提供了一種監(jiān)測程序變量值的方法,所述方法包括:
聲明至少一個變量結(jié)構(gòu)體,每個變量結(jié)構(gòu)體的成員為至少一個待監(jiān)測的程序變量,聲明監(jiān)測程序變量值的結(jié)構(gòu)體,監(jiān)測程序變量值的結(jié)構(gòu)體的成員為指向每個變量結(jié)構(gòu)體的指針;
定義變量結(jié)構(gòu)體的對象和監(jiān)測程序變量值的結(jié)構(gòu)體的對象;
初始化監(jiān)測程序變量值的結(jié)構(gòu)體的對象,將每個指針指向?qū)?yīng)的變量結(jié)構(gòu)體的對象;
mcu接收到待獲取程序變量值的信息后,解析所述待獲取程序變量值的信息,得到待獲取程序變量的編號,所述信息攜帶了程序變量的編號;
mcu根據(jù)待獲取程序變量的編號計算出待獲取程序變量對應(yīng)的絕對地址;
mcu讀取所述絕對地址中的程序變量值,并向用戶反饋。
第二方面,本發(fā)明提供了一種監(jiān)測程序變量值的系統(tǒng),所述系統(tǒng)包括:
聲明模塊,用于聲明至少一個變量結(jié)構(gòu)體,每個變量結(jié)構(gòu)體的成員為至少一個待監(jiān)測的程序變量,聲明監(jiān)測程序變量值的結(jié)構(gòu)體,監(jiān)測程序變量值的結(jié)構(gòu)體的成員為指向每個變量結(jié)構(gòu)體的指針;
定義模塊,用于定義變量結(jié)構(gòu)體的對象和監(jiān)測程序變量值的結(jié)構(gòu)體的對象;
初始化模塊,用于初始化監(jiān)測程序變量值的結(jié)構(gòu)體的對象,將每個指針指向?qū)?yīng)的變量結(jié)構(gòu)體的對象;
解析模塊,用于mcu接收到待獲取程序變量值的信息后,解析所述待獲取程序變量值的信息,得到待獲取程序變量的編號,所述信息攜帶了程序變量的編號;
計算模塊,用于mcu根據(jù)待獲取程序變量的編號計算出待獲取程序變量對應(yīng)的絕對地址;
反饋模塊,用于mcu讀取所述絕對地址中的程序變量值,并向用戶反饋。
在本發(fā)明中,由于監(jiān)測程序變量值的結(jié)構(gòu)體的成員為指向每個變量結(jié)構(gòu)體的指針,mcu接收的待獲取程序變量值的信息攜帶了程序變量的編號,mcu根據(jù)待獲取程序變量的編號計算出待獲取程序變量對應(yīng)的絕對地址,獲取程序變量值。因此減少了程序的代碼量,提高了執(zhí)行效率。
附圖說明
圖1是本發(fā)明實施例一提供的監(jiān)測程序變量值的方法流程圖。
圖2是本發(fā)明實施例二提供的監(jiān)測程序變量值的系統(tǒng)的結(jié)構(gòu)示意圖。
具體實施方式
為了使本發(fā)明的目的、技術(shù)方案及有益效果更加清楚明白,以下結(jié)合附圖及實施例,對本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
為了說明本發(fā)明所述的技術(shù)方案,下面通過具體實施例來進(jìn)行說明。
實施例一:
請參閱圖1,本發(fā)明實施例一提供的監(jiān)測程序變量值的方法包括以下步驟:
s101、聲明至少一個變量結(jié)構(gòu)體,每個變量結(jié)構(gòu)體的成員為至少一個待監(jiān)測的程序變量,聲明監(jiān)測程序變量值的結(jié)構(gòu)體,監(jiān)測程序變量值的結(jié)構(gòu)體的成員為指向每個變量結(jié)構(gòu)體的指針;
由于本發(fā)明實施例一通常是應(yīng)用于需要監(jiān)測的程序變量比較多的情況,因此s101具體可以是聲明兩個或兩個以上變量結(jié)構(gòu)體,每個變量結(jié)構(gòu)體的成員為兩個或兩個以上待監(jiān)測的程序變量,以監(jiān)測更多的程序變量。
例如,以32位mcu,數(shù)據(jù)存儲為4字節(jié)對齊為例,聲明電壓變量結(jié)構(gòu)體具體為:
typedefstruct_voltage{
uint8u1;
uint8u2;
uint8u3;
uint8u4;
}voltage;
該電壓變量結(jié)構(gòu)體的成員為4個待監(jiān)測的程序變量;
聲明電流變量結(jié)構(gòu)體具體為:
typedefstruct_current{
uint8i1;
uint8i2;
uint8i3;
uint8i4;
}current;
該電流變量結(jié)構(gòu)體的成員為4個待監(jiān)測的程序變量。
聲明監(jiān)測程序變量值的結(jié)構(gòu)體具體為
例如:
typedefstruct_monitor{
voltage*voltage;
current*current;
}monitor;
表示聲明監(jiān)測程序變量值的結(jié)構(gòu)體的成員為指向電壓變量結(jié)構(gòu)體的指針和指向電流變量結(jié)構(gòu)體的指針。
s102、定義變量結(jié)構(gòu)體的對象和監(jiān)測程序變量值的結(jié)構(gòu)體的對象;
s103、初始化監(jiān)測程序變量值的結(jié)構(gòu)體的對象,將每個指針指向?qū)?yīng)的變量結(jié)構(gòu)體的對象;
例如:
monitormonitor;
monitor.voltage=&voltage;
monitor.current=¤t;
表示將監(jiān)測程序變量值的結(jié)構(gòu)體的對象的第一個成員指針指向?qū)?yīng)的電壓變量結(jié)構(gòu)體的對象,第二個成員指針指向?qū)?yīng)的電流變量結(jié)構(gòu)體的對象。
s104、mcu接收到待獲取程序變量值的信息后,解析所述待獲取程序變量值的信息,得到待獲取程序變量的編號,所述信息攜帶了程序變量的編號;
在本發(fā)明實施例一中,程序變量的編號可以包括主編號和至少一級子編號,主編號對應(yīng)監(jiān)測程序變量值的結(jié)構(gòu)體的對象的成員編號(例如第一個成員為1,第二個成員為2,以此類推),當(dāng)程序變量的編號包括一級子編號時,子編號對應(yīng)變量結(jié)構(gòu)體的對象的成員編號(例如第一個成員為1,第二個成員為2,以此類推),子編號對應(yīng)的變量結(jié)構(gòu)體為主編號對應(yīng)的指針指向的變量結(jié)構(gòu)體。本發(fā)明實施例一不限于兩個層次,根據(jù)需求,可以多個層次。
例如,要獲取s101步驟中舉例中的u2的值,則程序變量的主編號設(shè)為1,子編號設(shè)為2。
s105、mcu根據(jù)待獲取程序變量的編號計算出待獲取程序變量對應(yīng)的絕對地址;
在本發(fā)明實施例一中,s105具體為:
mcu根據(jù)待獲取程序變量的主編號和至少一級子編號計算出待獲取程序變量對應(yīng)的絕對地址。
所述mcu根據(jù)待獲取程序變量的主編號和至少一級子編號計算出待獲取程序變量對應(yīng)的絕對地址具體可以包括:
mcu根據(jù)待獲取程序變量的主編號,計算出對應(yīng)監(jiān)測程序變量值的結(jié)構(gòu)體的對象的成員指針指向的地址,即對應(yīng)變量結(jié)構(gòu)體的對象的首地址;
當(dāng)程序變量的編號包括一級子編號時,mcu根據(jù)待獲取程序變量的子編號,結(jié)合主編號計算的地址,計算出對應(yīng)變量結(jié)構(gòu)體的對象的成員地址;當(dāng)程序變量的編號包括多級子編號時,mcu根據(jù)待獲取程序變量的子編號,結(jié)合主編號以及上一級子編號計算的地址,計算出指向下一級對應(yīng)變量結(jié)構(gòu)體的對象的首地址,依此類推,直至計算出對應(yīng)變量結(jié)構(gòu)體的對象的成員地址。
s106、mcu讀取所述絕對地址中的程序變量值,并向用戶反饋。
實施例二:
請參閱圖2,本發(fā)明實施例二提供的監(jiān)測程序變量值的系統(tǒng)包括:
聲明模塊11,用于聲明至少一個變量結(jié)構(gòu)體,每個變量結(jié)構(gòu)體的成員為至少一個待監(jiān)測的程序變量,聲明監(jiān)測程序變量值的結(jié)構(gòu)體,監(jiān)測程序變量值的結(jié)構(gòu)體的成員為指向每個變量結(jié)構(gòu)體的指針;
由于本發(fā)明實施例二通常是應(yīng)用于需要監(jiān)測的程序變量比較多的情況,因此聲明模塊11具體可以是用于聲明兩個或兩個以上變量結(jié)構(gòu)體,每個變量結(jié)構(gòu)體的成員為兩個或兩個以上待監(jiān)測的程序變量,以監(jiān)測更多的程序變量。當(dāng)mcu是32位,數(shù)據(jù)存儲為4字節(jié)對齊時,變量結(jié)構(gòu)體的成員為4個待監(jiān)測的程序變量。
定義模塊12,用于定義變量結(jié)構(gòu)體的對象和監(jiān)測程序變量值的結(jié)構(gòu)體的對象
初始化模塊13,用于初始化監(jiān)測程序變量值的結(jié)構(gòu)體的對象,將每個指針指向?qū)?yīng)的變量結(jié)構(gòu)體的對象;
解析模塊14,用于mcu接收到待獲取程序變量值的信息后,解析所述待獲取程序變量值的信息,得到待獲取程序變量的編號,所述信息攜帶了程序變量的編號;
在本發(fā)明實施例二中,程序變量的編號可以包括主編號和至少一級子編號,主編號對應(yīng)監(jiān)測程序變量值的結(jié)構(gòu)體的對象的成員編號(例如第一個成員為1,第二個成員為2,以此類推),當(dāng)程序變量的編號包括一級子編號時,子編號對應(yīng)變量結(jié)構(gòu)體的對象的成員編號(例如第一個成員為1,第二個成員為2,以此類推),子編號對應(yīng)的變量結(jié)構(gòu)體為主編號對應(yīng)的指針指向的變量結(jié)構(gòu)體。本發(fā)明實施例一不限于兩個層次,根據(jù)需求,可以多個層次。
計算模塊15,用于mcu根據(jù)待獲取程序變量的編號計算出待獲取程序變量對應(yīng)的絕對地址;
在本發(fā)明實施例二中,所述計算模塊具體可以用于:mcu根據(jù)待獲取程序變量的主編號和至少一級子編號計算出待獲取程序變量對應(yīng)的絕對地址。
所述計算模塊具體可以包括:
第一子計算模塊,用于mcu根據(jù)待獲取程序變量的主編號,計算出對應(yīng)監(jiān)測程序變量值的結(jié)構(gòu)體的對象的成員指針指向的地址,即對應(yīng)變量結(jié)構(gòu)體的對象的首地址;
第二子計算模塊,用于當(dāng)程序變量的編號包括一級子編號時,mcu根據(jù)待獲取程序變量的子編號,結(jié)合主編號計算的地址,計算出對應(yīng)變量結(jié)構(gòu)體的對象的成員地址;當(dāng)程序變量的編號包括多級子編號時,mcu根據(jù)待獲取程序變量的子編號,結(jié)合主編號以及上一級子編號計算的地址,計算出指向下一級對應(yīng)變量結(jié)構(gòu)體的對象的首地址,依此類推,直至計算出對應(yīng)變量結(jié)構(gòu)體的對象的成員地址。
反饋模塊16,用于mcu讀取所述絕對地址中的程序變量值,并向用戶反饋。
在本發(fā)明中,由于監(jiān)測程序變量值的結(jié)構(gòu)體的成員為指向每個變量結(jié)構(gòu)體的指針,mcu接收的待獲取程序變量值的信息攜帶了程序變量的編號,mcu根據(jù)待獲取程序變量的編號計算出待獲取程序變量對應(yīng)的絕對地址,獲取程序變量值。因此減少了程序的代碼量,提高了執(zhí)行效率。
本領(lǐng)域普通技術(shù)人員可以理解實現(xiàn)上述實施例方法中的全部或部分步驟是可以通過程序來指令相關(guān)的硬件來完成,所述的程序可以存儲于一計算機可讀取存儲介質(zhì)中,所述的存儲介質(zhì),如rom/ram、磁盤、光盤等。
以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。