大家好,我是电源漫谈,在使用Microchip的8位PIC单片机中,如何使用XC8 编译器用已知值填充未使用的程序存储器,而不保持默认的0x3FFF呢?这是一个网友经常问的问题,那么今天我们就此话题展开讨论。
这里给大家推荐使用编译器自带的--FILL 驱动选项,它可以允许您使用已知数字值填充未使用的程序内存。
具体而言,您可以在MPLAB® X IDE > XC8 Project Properties > XC8 Linker >Fill Flash Memory 下拉菜单中选择访问此选项,然后在填充字段中输入适当的参数即可,如图1所示。
图1 填充FLASH空间的选项设置
究其根本,此选项是利用XC8所带的Hexmate 应用程序工具,来填充未使用的位置,鉴于这个原因,它仅适用于十六进制的HEX 文件处理,它不会填充二进制文件格式的代码。
图2 填充FLASH空间的选项实现格式
图3 填充FLASH空间的选项示例
上述示例,将未使用FLASH空间以0x3FFF来填充,因此这个结果和默认的未使用空间一致。
图4 填充FLASH空间的说明
从图4说明来看,这个选项主要有几个参数值得注意,首先是填充的内容,填充的变化形式,填充的地址范围。
图4中的第一个示例显示,使用常数0xBEFF来填充所有未使用FLASH空间。第二个示例显示,采用以0xBEFF为基准值,逐步加1的形式,来填充未使用FLASH空间。
第三个示例显示,使用以0xBEFF为基准值,逐步递减0x10的方式填充未使用FLASH空间。
第四个示例显示,使用一个重复的常数序列,来填充整个未使用的程序FLASH空间。这些方式选项的执行,都可以在编译器选项中去设置。
我们以图1为例,如下方式,去填充所有未使用空间为0x3333这个值,而默认值是0x3FFF.
图5 填充后的FLASH MEMORY显示
可以看出未使用空间被填充为了0x3333,和预期一致。除了填充所有的未使用FLASH空间的形式之外,也可以使用选项去设定仅仅填充部分地址范围的未使用FLASH空间,如图6说明。
图6 部分FLASH未使用空间填充定义
上述定义可知,使用@unused参数表示填充所有的未使用FLASH空间,而上图第二个示例表示,在其中一个地址0x1000处填充为常数 fill_expr,注意这里,也可以填充一个单个地址为某一个常数。
上述示例3中采用@0:0xFF表示在0-0xFF地址范围内填充0xBEFF常数,这就是一个FLASH地址范围的填充形式。
图7 部分未使用地址空间填充为常数的设置
这里表示从0x500到0x600之间的地址空间中的未使用FLASH空间被填充为0x3333.
图8 地址范围内未使用空间填充1
可以看出,在0x500,到0x600的FLASH地址范围内,未使用的空间变为0x3333,其中部分空间已经被代码占用。
图9地址范围内未使用空间填充2
从图9来看,截止到0x600 Flash地址,未使用空间都被给填充为了0x3333,但是后面的更大的地址处的未使用空间,还是保持为默认的0x3FFF.
另外,值得一提的是,在FLASH MEMORY窗口,也可以右键直接更改Hex数据并进行填充,但是这里并未使用编译器选项。
图10 在FLASH MEMORY窗口进行FLASH空间直接填充改写Hex
图11 在FLASH MEMORY窗口进行FLASH空间直接填充改写Hex示例
图12 直接对Hex进行填充更改
由上图12可知,指定范围内的FLASH空间被直接填充为0x0000,当然还有更多的操作方式,这里就不一一去说明,有兴趣的朋友可以去尝试。
以上介绍了基于PIC16的单片机如何进行未使用的程序空间进行填充期望值的方法,如有更多问题,可文底评论。