最近在開發(fā) BMS 項目中,由于需要兼容很多電芯參數(shù)模型,同時還需要軟件算法可以應(yīng)對不同電芯以及應(yīng)用場景,給用戶提供高可配置型的功能,因此提供一個好的界面,讓用戶可以快速的配置基本模型和算法參數(shù)變得非常重要,今天來介紹一下我用 MDK 實現(xiàn)的方法。
一、MDK 的Configuration Wizard
Configuration Wizard翻譯成中文可以叫做配置向?qū)?,它是由一些特殊?guī)則的語法構(gòu)成的,可以解釋成圖形化的配置菜單,在圖形化界面中,可以很清晰的配置程序相關(guān)參數(shù),而不需要在具體的代碼中修改。
Configuration Wizard有點類似于Markdown原理,可以實現(xiàn)所見即所寫,它采用注釋的形式來構(gòu)建菜單,在 MDK 中,它支持匯編、C/C++以及初始化文件(如.s文件)。如下圖,先展示一張直觀的配置界面,再從源碼上來詳細地介紹它的實現(xiàn)方法。
實現(xiàn)上圖的源碼:
/***************************************************
PACK 參數(shù)
***************************************************/
#if (1) /**Pack Information*/
// <h> Pack Infomation
/************BATTERY_PACK_INFO*****************/
// <o> Pack Cell Series Counts <4=> 4 <5=> 5 <6=> 6 <7=> 7 <8=> 8 <9=> 9 <10=> 10
#define?PACK_SERIES_COUNT??????(10)?//Pack串?dāng)?shù)=電壓采樣點數(shù)
// <o> Pack Cell Parallel Counts <1=> 1 <2=> 2 <3=> 3 <4=> 4
#define?NUM_PARALLEL???????????(2)??//Pack并數(shù)
// <o> Pack Temp Sensors Counts <1=> 1 <2=> 2
#define?NUM_CELL_TEMP_SENSORS? (2)??//電芯溫度采樣點數(shù)
/********CURRENT SENSOR TYPE******************/
// <o> Pack Current Sensors Resister(mR) <1=> 1 <2=> 2 <4=> 4 <8=> 8
#define DIVER_RESISTER (4) //電流采樣電阻傳感器mΩ
/*********AFE TYPE***************************/
#define?AFE_TYPE???????????????(AFE_CG861XX_TYPE)?//當(dāng)前PCB使用的AFE的型號
//?</h>??
二、如何在 MDK 中啟用Configuration Wizard
一般情況下,我們在.c或.h文件中的頭部,使用注釋的方式增加如下代碼,就可以使用配置向?qū)Я?,?dāng)然,我們只需要保證這段開啟向?qū)У淖⑨屨Z句在代碼文件的前 100 行之內(nèi)就可以。
// <<< Use Configuration Wizard in Context Menu >>>
下面的注釋代碼可以告訴解釋器,結(jié)束配置向?qū)У慕忉專贿^這不是必須的。
// <<< end of configuration section >>>
在前面的示例代碼中,配置向?qū)覍懺?bms_config.h中,當(dāng)我們添加了以上注釋代碼啟用配置向?qū)Ш螅枰匦麓蜷_一下 bms_config.h文件,這時,在文件的左下角就會出現(xiàn)Text Editor和Configuration Wizard兩個界面選項,它們分別對應(yīng)程序源碼和配置界面。
三、Configuration Wizard的語法規(guī)則
大家如果有使用過HTML語法,這里就非常容易理解了,它和 HTML一樣,使用成對的標(biāo)簽來代表不同的功能,如<*>和</*>,其中 * 代表不同的功能標(biāo)簽。
標(biāo)簽h
通過使用和來設(shè)置一個分組,它可以在配置向?qū)е羞M行折疊。
// <h> 分組標(biāo)題// …
// </h>
?
標(biāo)簽i
使用+提示內(nèi)容來設(shè)置對上一個配置項的提示,可以配置多行。
// <i> 提示內(nèi)容 如 Select the cell type for calcu the soc
當(dāng)鼠標(biāo)移動到配置項時顯示提示內(nèi)容。
標(biāo)簽e
使用和來設(shè)置一個分組,該類分組可以整體被禁止或使能,也可以在配置向?qū)е羞M行折疊。
當(dāng)禁止時無法修改配置該組內(nèi)容,組內(nèi)文字變灰暗;反之即可修改內(nèi)容。
這里對于,還有一個規(guī)則<e1.2>,這種e1.2表示修改該配置項下面出現(xiàn)的第2個配置參數(shù)的第2位(0位開始),它只能修改一個位,可以嵌套使用。
// <e> 使能分組標(biāo)題
// …
// </e>
這里看一個折疊的例子,其中也包含了 o 和 e 標(biāo)簽作用于參數(shù)的位域的操作。
// <e1.13> Enable Chip Select 0 (CSR0)
// <e1.5> WSE: Enable Wait State Generation
// <o1.2..4> NWS: Number of Standard Wait States <1-8><#-1>
// </e>
// <o1.9..11> TDF: Data Float Output Time <0-7>
// <i> Number of Cycles Added after the Transfer
// </e>
#define A1 (0xFFE00000)
#define A2 (0x010024A9) // EBI_CSR0: Flash
標(biāo)簽o
使用標(biāo)簽o可以在配置界面添加一個數(shù)值修改框或使能框(只修改一個位時),它與標(biāo)簽e同樣還有添加規(guī)則<o1.2>和<o1.2..3>。比如表示修改該配置項下面出現(xiàn)的第1個配置參數(shù)的第1位,它只修改一個位;比如表示修改該配置項下面出現(xiàn)的第4個配置參數(shù)的第2到5位,它可以修改多個位。
// <o> 標(biāo)題內(nèi)容
另外,標(biāo)簽 o 還可以設(shè)置修改范圍和步進,其中步進可以省略。
// <o> 標(biāo)題內(nèi)容 <最小值-最大值:步進>
如果想使用下拉菜單的話,可以在標(biāo)簽o的后面增加如下的選項內(nèi)容。
// <o> 標(biāo)題內(nèi)容 <0=> 選項0 <1=> 選項1 <n=> 選項n
標(biāo)簽q
它標(biāo)簽o差不多,不過它只能修改數(shù)值的一個位,不能修改多個位,支持<q1.2>。
// <q> 標(biāo)題內(nèi)容
標(biāo)簽c
使用標(biāo)簽c可以在配置界面添加一個使能框注釋或取消注釋代碼內(nèi)容,其實就是用來操作是否將宏定義內(nèi)容注釋掉。
// <c>
//#define DEBUG_FLAG
// </c>
// <!c>
#define DEBUG_FLAG
// </c>
四、結(jié)語
這里介紹了MDK中的Configuration Wizard 主要用法。掌握了配置向?qū)н@個方法,并不能提升編程效率,但對于代碼的維護非常有益。另外,當(dāng)我們做一些例程或者評估板的算法代碼時,希望能夠給用戶提供一個比較好的參數(shù)設(shè)置界面,對于這個配置向?qū)У膽?yīng)用是再好不過了。