日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

A2L变量地址抓取

發布時間:2023/12/31 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 A2L变量地址抓取 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在matlab中抓取A2L變量地址

在標定時我們需要A2L文件提供變量信息,而通過MBD生成的A2L中變量的地址是空的,如下圖所示:

在matlab中有一個自帶的函數 asap2post(ASAP2File, MAPFile); 能夠將MAP文件中變量的地址提取出來并替換掉上圖中對應變量的空地址。其中兩個輸入參數ASAP2File、MAPFile分別為a2l和map文件的文件路徑:

ASAP2File = 'C:\Users\Luo\Desktop\Grab_Variable.a2l'; MAPFile = 'C:\Users\Luo\Desktop\ADC.map'; asap2post(ASAP2File, MAPFile);

然而并不是有了兩個文件上來就能直接成功生成最終擁有地址的A2L文件,因為不同編譯器生成的MAP文件有所不同,需要對asap2post函數中的正則表達式做出相應的修改才能成功抓取變量。下面我先簡要介紹一下函數內容,了解下大概的運作流程,函數內容如下

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)}'); %動態正則表達式% Write new content to original ASAP2 file fid = fopen(ASAP2File, 'w'); fprintf(fid,'%s',newASAP2FileString); fclose(fid);% ========================================================================= % SUBFUNCTIONS 子函數部分 % =========================================================================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

現在我們逐塊前進:

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

這一部分沒什么可講的,首先判斷你輸入的參數是不是兩個,不是的話就報錯;
然后記下前綴名、后綴名,這倆會在正則表達式中用到,作為匹配的依據,先暫時記下有這回事;然后兩個if意思是判斷兩個文件存不存在,存在則以txt格式讀取,否則報錯。

MAPFileHash = getSymbolTable1(MAPFileString) ;

接下來就是從map文件中提取變量名以及地址了,我們到其調用的子函數來看看他是怎么提取的:

% ========================================================================= % SUBFUNCTIONS 子函數部分 % =========================================================================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

它通過正則表達式,將MAPFileString(也就是前面以txt讀出來的字符串)中的symbol以及地址按正則表達式中的規則匹配后存入元胞數組pairs,其中的每個元胞內都含有兩個元素,也就是symbol和address,最后通過For循環將pairs中的內容建立成一個數據類型為containers.Map的Hash表各部分內容如下圖:


最后獲得一個包含Key-Value(鍵-值)的哈希表其內容如下不能直接顯示

可以通過keys(MAPFileHash)查看其所有鍵或values(MAPFileHash);查看其所有值。

然后再將與初始空地址的A2L文件中相匹配的內容(也就是框中的Name部分),用哈希表中的(Name)對應行替換掉下圖中框住的內容,具體怎么實現的在正則表達式一文詳解

newASAP2FileString = regexprep(ASAP2FileString,...[addrPrefix '(\S+)' addrSuffix], '${MAPFileHash($1)}'); % 動態正則表達式


所有地址替換完成后,將整個文本寫入ASAP2File,這樣就生成新的包含真實地址的A2L文件

fid = fopen(ASAP2File, 'w'); fprintf(fid,'%s',newASAP2FileString); fclose(fid);

最終A2L包含真實的地址信息:

以上內容均為原創,轉載請注明出處

總結

以上是生活随笔為你收集整理的A2L变量地址抓取的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。