FreeMASTER 是一个界面友好的,可用于实时观察目标系统中变量内容的数据可视化软件。可以通过多种通信方式将 PC 机和微控制器电路板连接,实时捕获和配置微控制器中(存放变量)的内存信息,并显示在 PC 机的软件窗口中。


FreeMASTER 软件最早用于汽车电子相关的软件开发中,后被广泛应用在多种开发环境,用以提供友好的人机交互界面。


从笔者的开发经历中,特别是分析例如触摸感应等模拟传感器信号时,常用 FreeMASTER 实现一个简易的示波器,将单片机中实时采集的传感器信息绘制成时域曲线,显示在电脑界面上,从而便于分析数据,寻找其中的变化规律,进而提取特征信息用于特定的模式匹配。在进行最近比较火热的嵌入式 AI 开发,在海量的数据处理过程中,通过 FreeMASTER 的可视化界面,监控计算过程中间某些关键变量的变化过程,简直不要太方便了,就是在给领导和客户演示的时候也是逼格满满 .


笔者之前在本公众号中,发表过一篇关于基本使用 FreeMASTER 的短文,可以帮助嵌入式工程师在 5 分钟内上手使用 FreeMASTER v2.0 工具,见: 使用 FreeMASTER 捕获采样记录并导出重现曲线。


近期,NXP 官方发布了 FreeMASTER v3.0,据说进行了很大的更新,在本文中,笔者对新版本的 FreeMASTER 进行了试用,并同大家分享使用体验。


安装过程
在下载页面中还能看到,官网仍然开放了历史版本 v2.0 和 v2.5 的下载链接。笔者常用的是 v2.0 版本。

 


 
比较惊喜的是,FreeMASTER 终于开始能够跨平台了,本次更新提供了 Linux 系统的安装包。但是根据说明,在 Linux 上只支持 FreeMASTER Lite 服务和相关的文档,大家熟悉的桌面版没有提供 Linux 平台的支持。


从安装包的大小来看,新版的安装包整整增大了一个数量级,从 v2.x 的 40MB 左右,一下子剧增到近 300MB,笔者不禁脑补了一下,最近到底给它喂了些什么。


安装
下载之后双击安装包安装。安装过程也是全新的,用了 InstallAnywhere 打包工具对整个软件包进行打包。界面看起来更可爱一些,但略显简单。笔者作为一个资深的嵌入式系统工程师,还是更喜欢之前版本使用 InstallShell 打包工具简洁干练的工业风。

 


 
这里特别注意,在安装过程中,如果不是明确需要使用"FreeMASTER Lite 服务",而只是使用原有大家熟悉的使用 FreeMASTER 桌面版提供的功能,可以在安装过程中勾选掉相关的选项。否则会需要提供专门的激活码 .


一开始安装的时候由于疏忽跳过了激活码,由于不知道怎样获得"激活码",本打算先安装试用部分功能,但没想到没有激活码竟然直接回滚安装,FreeMASTER 的基本功能也被卸载了。后来询问其它同事才知道,这个激活码是在安装过程中自动创建申请的,最关键的,它是免费的。然后笔者重新安装,注意到了安装过程中的一个页面的一段说明:

 


 
之前安装到这个步骤的时候,自动弹出了一个网页,但是被笔者想当然地给关掉了。


现在看来是自动发出的申请激活码的请求。但之前戳"NO"的时候直接回滚了整个安装,这次选"YES"。


弹出网络浏览器并访问 NXP 官网,需要 NXP 注册账户授权,然后在网页中确认软件使用许可声明。

 


 
最后获得激活码。

 


 
PS: 笔者仔细阅读了一下这个激活码的回单,发现激活码是根据 PC 的某种"机器识别码"生成的,也就是说,它是绑定在 PC 上的。好吧,反正是 free 的,如果换台电脑就再申请一次就好。


后续的安装还出现了不少提示说重复复制文件的问题,这可能是使用新的部署工具没有处理好文件的解压顺序导致的,不影响最终的安装功能。另外,安装过程后来还是通过网络执行了一遍在线激活过程。


安装之后查了一下安装根目录,再一次被惊呆了,FreeMASTER 竟然专门包含了一个 JRE(Jave 运行时环境),不必自行匹配相应的软件版本了。

 


 
特别注意,如果需要安装 FreeMASTER Lite 功能,必须确保电脑已经联网,并且能够顺利访问到 nxp.com 的官网。


试用
从 pmp 到 pmpx

按照笔者们对已经熟悉的老版本 FreeMASTER 的使用步骤,创建工程,导入 MCU 端的可执行文件解析符号表,根据符号表项创建变量,创建示波器页面,在示波器页面中加载变量,开始采样。一顿操作猛如虎,最终正常工作。这说明新版本确实是能做到兼容老版本用户的使用习惯。


笔者注意到,v3.0 版本创建工程的扩展名是".pmpx",而不是原来的".pmp",多了一个"x"。难道这是学了 MS Office 套件升级文件扩展名的思路? 笔者用 sublime text 打开工程文件查看其源代码,果不其然,新版本的工程文件已经换用可读的 xml 档案组织格式了,而老版本的工程文件是无法查看源代码的。这就意味着,在使用新版本的 FreeMASTER 时,可以以修改源文件的方式精细配置工程,这对于开发工程师来讲绝对是一个"有良心"的设计。

 

 


 
 

另外,笔者还试着在新版的软件窗口中导入原有二进制编码的 pmp 工程文件,同老版使用完全一样,无缝完全兼容。看来 FreeMASTER 的开发人员在历史兼容性上下了很大的工夫。(实际上这个变更在 v2.5 中就已经实现了).


ActiveX 控件
FreeMASTER 的 ActionX 控件应该是它在基本功能外的另一个亮点。ActiveX 控件是 Microsoft Windows 系统中的应用功能扩展库,可用于互联网的很小的程序,有时称为插件程序。


通过使用 ActiveX 控件,在 FreeMASTER 运行框架下,可以使用网页作为界面,访问到单片机中内存中的变量。FreeMASTER 的 ActiveX 控件仅提供面向电路板的内存访问服务,而网页 UI 的呈现则完全由用户自由发挥,这就为创建丰富的 UI 创造了灵活的平台。


虽然 FreeMASTER 的手册中几乎没有提到如何将 ActiveX 控件用于用户产品设计的说明,但凭借笔者极强的想象力,还是摸索出一套可行的用法。


实际上,FreeMASTER 安装包中提供了一个通过 JavaScript 在 htm 网页中调用 ActiveX 控件的例子。位于"FreeMASTER 3.0\FreeMASTER\examples\scripting\JavaScript-ActiveX"目录下的"example.htm"文件。但是为了把这个代码运行起来,需要一波神操作。


首先,从 MCUXpresso SDK 中导出一个 hello_world 工程(基于 lpcxpresso55s69 开发套件),之后在源代码中创建全局变量"var16","var16inc"及"arr16"并确保它们不会被编译器的自动优化掉。


<p><font size="3" face="微软雅黑">volatile uint16_t var16 = 0u;</font></p><p><font size="3" face="微软雅黑">volatile uint16_t var16inc = 0;</font></p><p><font size="3" face="微软雅黑">volatile uint16_t arr16[10] = {0,1,2,3,4,5,6,7,8,9};</font></p>


复制代码

 

之后编译下载工程工程到开发板。


然后就是 FreeMASTER 的操作了。创建 FreeMASTER 工程,导入之前编译好的可执行程序文件,之后在 FreeMASTER 中创建对应的"var16","var16inc"及"arr16"变量。将 FreeMASTER 安装目录下的"example.htm"文件复制到新创建的 FreeMASTER 用户工程目录下,然后在 FreeMASTER 工程中引用这个文件:

 


 
此时,可以看到网页上有一些按钮和一些内容框,试着戳了几下,会报错,显示没有有效连接。

 


 
此时,启动 FreeMASTER 工程,按这些按钮,就能读到和写入位于单片机内存中的变量了。

 


 
查看"example.htm"文件的源代码可以看到 FreeMASTER 的 ActiveX 读写远程变量基本函数的用法:


function read_variable(name,span_id)


{


    /* ReadVariable uses FreeMASTER variable object from current project。Use


     * ReadUIntVariable to access the memory directly using a symbol name。*/


    if(pcm.ReadVariable(name))


        document.getElementById(span_id).innerHTML = pcm.LastVariable_vValue;


    else


        on_error("Error when reading variable " + name + "。" + pcm.LastRetMsg);


}

 

function write_variable(name,input_id)


{


    var val = document.getElementById(input_id).value;
      
   /* WriteVariable uses FreeMASTER variable object from current project。Use


     * WriteUIntVariable to access the memory directly using a symbol name。*/


    if(pcm.WriteVariable(name,val))


        document.getElementById("status").innerHTML = "Write of the " + name + " succeeded.";


    else


        on_error("Error when writting variable " + name + "。" + pcm.LastRetMsg);


}


复制代码

 

JSON-PRC 轻量级远程调用协议
这里暂时略过对 JSON-PRC 协议的介绍。从实用角度看,它是用于替换 ActiveX 的,同样能够提供从网页到电路板的访问服务。
在新版 FreeMASTER 的手册中,将 JSON-PRC 称之为一种"现代的"技术,特别要配合 Chromium 引擎使用。而 Chromium 引擎就是 Google 旗下大名鼎鼎的 Chrome 浏览器使用的内核。相对应地,ActiveX 对应使用的是 Microsoft IE 浏览器技术。

 


 
同 ActiveX 相似,FreeMASTER 的安装目录中也有 JSON-PRC 的样例代码,位于"FreeMASTER 3.0\FreeMASTER\examples\scripting\JavaScript-JSON-RPC"目录下。


将这个目录整个复制到新创建的 FreeMASTER 工程目录下。之后在 FreeMASTER 工程中创建一个新的页面"JS-JSON-PRC"并引用 JSON-PRC 版本的"example.htm"网页文件。此时启动 FreeMASTER 工程后会报错,因为缺少一个关键的步骤。


将 FreeMASTER 工程的网页解释器换成 Chromium 引擎。选中"project" -> "option",在"option"对话框中,选中"使用 Chromium 引擎"的选项。注意,切换到 Chromium 引擎后,基于 IE 的 ActiveX 控件就不能使用了。

 


 
此时再启动 FreeMASTER 工程,就能看到之前使用 ActiveX 控件实现的操作单片机内存变量的网页, 戳戳看也能正常读写内存了。从功能上看,使用 Chromium 引擎实现的网页同之前使用 ActiveX 几乎完全一样,但是显示效果看起来好很多,字体比较圆润。考虑到 Chromium 引擎已经成为众多流行浏览器内核的事实,FreeMASTER 在技术上需要与时俱进,这可能也是 v3.0 的设计初衷吧。

 


 
看一下 JSON-PRC 版的示例网页源码,可以看到在 javascript 脚本部分引用的关键组件:


<font size="3" face="微软雅黑"><!-- load JSON-RPC and FreeMASTER wrapper object -->


<script type="text/javascript" src="./simple-jsonrpc-js.js"></script>


<script type="text/javascript" src="./freemaster-client.js"></script></font>


复制代码


这是同 ActiveX 方式的关键区别,对应地,在 ActiveX 版的样例代码中,在网页显示部分引用了 ActiveX 组件:


<font size="3" face="微软雅黑"><!-- The main FreeMASTER ActiveX communication object -->


<object id="pcm" height="0" width="0" classid="clsid:48A185F1-FFDB-11D3-80E3-00C04F176153"></object></font>


复制代码


当然,对变量读写函数的使用方式上也有一些不同:


<font size="3" face="微软雅黑">function read_variable(name,span_id)


{


   /* ReadVariable uses FreeMASTER variable object from current project。Use


     * ReadUIntVariable to access the memory directly using a symbol name。*/


    return pcm.ReadVariable(name)


        .then((value) => {


            document.getElementById(span_id).innerHTML = value.data;


        })


        .catch((err) => {


            on_error(err.msg);


        });


}
    
function write_variable(name,input_id)


{


    var val = document.getElementById(input_id).value;


    /* WriteVariable uses FreeMASTER variable object from current project。Use


     * WriteUIntVariable to access the memory directly using a symbol name。*/


    pcm.WriteVariable(name,val)


        .then(() => {


            document.getElementById("status").innerHTML = "Write of the " + name + " succeeded.";


        })


        .catch((err) => {


            on_error(err.msg);


        });


}</font>


复制代码


FreeMASTER Lite 服务


FreeMASTER Lite 是 v3.0 新增的独立组件,用于脱离经典的 FreeMASTER 框架提供从桌面到电路板的数据访问。


实际上,这几乎是一个并列于 FreeMASTER 桌面版的全新软件包。它以"服务"的形式运行在系统后台,提供了 JSON-PRC 接口用于访问远程连接的电路板。就像大多数操作系统服务的运行方式一样,FreeMASTER Lite 没有用户窗口,通过命令行和配置文件传入参数。根据手册的描述,FreeMASTER Lite 在操作系统中像一个标准的网页服务器一样,一方面同远程的电路板交互,另一方面可以接收来自 python 或者 node.js 脚本中的请求。


由于时间关系,笔者还没有仔细研究如何使用这个 FreeMASTER Lite 的功能,以后有时间再做介绍。


总结

FreeMASTER v3.0 兼容了经典 FreeMASTER 的所有功能,新增了 Chromium 引擎和 JSON-PRC 协议组件,用于作为 IE 引擎和 ActiveX 的换代产品。首次引入了 FreeMASTER Lite 软件包,用于提供命令行版本的连接 PC 机网页和电路板的服务。


新版的 FreeMASTER 定位于提供运行某些新的 FreeMASTER 应用工程的运行时环境,而没打算让用户在这个平台上进行二次开发,设计自己的 FreeMASTER 应用工程。


经过试用,笔者个人建议,经典 FreeMASTER 用户不用着急迁移到新平台上。如果你一定想使用 Chromium 引擎,在你的 UI 界面中增加一些炫酷的特效,那么可以试试桌面版的 FreeMASTER v3.0。


如果只是简单地使用一个数据可视化的工具,v2.5 仍是目前的最佳选择。(没错,借着试用 v3.0 的兴致,笔者也试用了 v2.5,然后决定把用了多年的 v2.0 更新到 v2.5 版本)。