A2L变量地址抓取
在matlab中抓取A2L變量地址
在標(biāo)定時(shí)我們需要A2L文件提供變量信息,而通過MBD生成的A2L中變量的地址是空的,如下圖所示:
在matlab中有一個(gè)自帶的函數(shù) asap2post(ASAP2File, MAPFile); 能夠?qū)AP文件中變量的地址提取出來并替換掉上圖中對應(yīng)變量的空地址。其中兩個(gè)輸入?yún)?shù)ASAP2File、MAPFile分別為a2l和map文件的文件路徑:
ASAP2File = 'C:\Users\Luo\Desktop\Grab_Variable.a2l'; MAPFile = 'C:\Users\Luo\Desktop\ADC.map'; asap2post(ASAP2File, MAPFile);然而并不是有了兩個(gè)文件上來就能直接成功生成最終擁有地址的A2L文件,因?yàn)椴煌幾g器生成的MAP文件有所不同,需要對asap2post函數(shù)中的正則表達(dá)式做出相應(yīng)的修改才能成功抓取變量。下面我先簡要介紹一下函數(shù)內(nèi)容,了解下大概的運(yùn)作流程,函數(shù)內(nèi)容如下
function asap2post(ASAP2File, MAPFile)if nargin~=2DAStudio.error('RTW:asap2:invalidInputParam',mfilename); endaddrPrefix = '0x0000 \/\* @ECU_Address@'; %前綴名 addrSuffix = '@ \*\/'; %后綴if exist(ASAP2File,'file')ASAP2FileString = fileread(ASAP2File);%將文本以txt格式讀取 elseDAStudio.error('RTW:asap2:UnableFindFile',ASAP2File); end% Extract contents of MAP file if exist(MAPFile,'file')MAPFileString = fileread(MAPFile); elseDAStudio.error('RTW:asap2:UnableFindFile',MAPFile); endMAPFileHash = getSymbolTable1(MAPFileString) ; newASAP2FileString = regexprep(ASAP2FileString,...[addrPrefix '(\S+)' addrSuffix], '${MAPFileHash($1)}'); %動(dòng)態(tài)正則表達(dá)式% Write new content to original ASAP2 file fid = fopen(ASAP2File, 'w'); fprintf(fid,'%s',newASAP2FileString); fclose(fid);% ========================================================================= % SUBFUNCTIONS 子函數(shù)部分 % =========================================================================function MAPFileHash = getSymbolTable1(MAPFileString) pairs = regexp(MAPFileString, '\n\s*(\S+)\s+(0x[0-9a-fA-F]+)\W','tokens'); MAPFileHash = containers.Map;for i = 1:length(pairs)MAPFileHash(pairs{i}{1}) = pairs{i}{2};end現(xiàn)在我們逐塊前進(jìn):
if nargin~=2DAStudio.error('RTW:asap2:invalidInputParam',mfilename); endaddrPrefix = '0x0000 \/\* @ECU_Address@'; %前綴名 addrSuffix = '@ \*\/'; %后綴if exist(ASAP2File,'file')ASAP2FileString = fileread(ASAP2File);%將文本以txt格式讀取 elseDAStudio.error('RTW:asap2:UnableFindFile',ASAP2File); end% Extract contents of MAP file if exist(MAPFile,'file')MAPFileString = fileread(MAPFile); elseDAStudio.error('RTW:asap2:UnableFindFile',MAPFile); end這一部分沒什么可講的,首先判斷你輸入的參數(shù)是不是兩個(gè),不是的話就報(bào)錯(cuò);
然后記下前綴名、后綴名,這倆會(huì)在正則表達(dá)式中用到,作為匹配的依據(jù),先暫時(shí)記下有這回事;然后兩個(gè)if意思是判斷兩個(gè)文件存不存在,存在則以txt格式讀取,否則報(bào)錯(cuò)。
接下來就是從map文件中提取變量名以及地址了,我們到其調(diào)用的子函數(shù)來看看他是怎么提取的:
% ========================================================================= % SUBFUNCTIONS 子函數(shù)部分 % =========================================================================function MAPFileHash = getSymbolTable1(MAPFileString) pairs = regexp(MAPFileString, '\n\s*(\S+)\s+0x(0x[0-9a-fA-F]+)\W','tokens'); MAPFileHash = containers.Map;for i = 1:length(pairs)MAPFileHash(pairs{i}{2}) = pairs{i}{};end它通過正則表達(dá)式,將MAPFileString(也就是前面以txt讀出來的字符串)中的symbol以及地址按正則表達(dá)式中的規(guī)則匹配后存入元胞數(shù)組pairs,其中的每個(gè)元胞內(nèi)都含有兩個(gè)元素,也就是symbol和address,最后通過For循環(huán)將pairs中的內(nèi)容建立成一個(gè)數(shù)據(jù)類型為containers.Map的Hash表各部分內(nèi)容如下圖:
最后獲得一個(gè)包含Key-Value(鍵-值)的哈希表其內(nèi)容如下不能直接顯示
可以通過keys(MAPFileHash)查看其所有鍵或values(MAPFileHash);查看其所有值。
然后再將與初始空地址的A2L文件中相匹配的內(nèi)容(也就是框中的Name部分),用哈希表中的鍵(Name)對應(yīng)行值替換掉下圖中框住的內(nèi)容,具體怎么實(shí)現(xiàn)的在正則表達(dá)式一文詳解
newASAP2FileString = regexprep(ASAP2FileString,...[addrPrefix '(\S+)' addrSuffix], '${MAPFileHash($1)}'); % 動(dòng)態(tài)正則表達(dá)式
所有地址替換完成后,將整個(gè)文本寫入ASAP2File,這樣就生成新的包含真實(shí)地址的A2L文件
最終A2L包含真實(shí)的地址信息:
以上內(nèi)容均為原創(chuàng),轉(zhuǎn)載請注明出處
總結(jié)
- 上一篇: 电脑安装不了python3.50_Ana
- 下一篇: 直连路由、静态路由、动态路由