如何使用链接文件设置填充值(Fill Value)

在嵌入式开发中,大家是否遇到这样一种场景:段(SECTIONS)中不用的字节填充特定的填充值(eg:0xFF)。预期效果如下所示:
在这里插入图片描述
实现的方式很多,本文介绍一种方式:通过设置链接文件,编译器编译时自动填充。
提示:本文使用的编译器Hightec,链接文件格式(*.lsl)

1、Hightec的Section格式

首先,先了解一下Hightec中,Section的格式定义,如下所示:

section [address] [(type)] :
[AT(lma)]
[ALIGN(section_align)]
[FLAGS(section_flags)]
[SUBALIGN(subsection_align)]
[constraint]
{
output-section-command
output-section-command
...
} [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp]

其中,在格式的最后,有一个[=fillexp],所以,如果想在Section不用的字节中填充特定填充值,可以在此处设置填充值。

2、填充值设置操作

(一)在链接文件(eg:*.lsl),将目标Section设置特定填充值0xFF

MEMORY
{
  ......
  pfls0 (rx!p): org = 0x80000000, len = 2M
  pfls0_nc (rx!p): org = 0xa0000000, len = 2M
  ......
}
......
SECTIONS
{
  ......
  .startup (0xA0000020) : FLAGS(rxl)
  {
    BootModeIndex = .;
    . = ALIGN(16);
    KEEP (*(.start));
    . = ALIGN(16);
  } > pfls0_nc =0xFF
  ......
}
......

如上,段(.startup)对应的起始地址0xA0000020,该段放置自定义段(.start)内容,.start的定义方式如下所示:

#pragma section
#pragma section ".start" x
void _START(void)
{
    __non_return_call(_Core0_start);
}
#pragma section

解释:将函数_START(),放到.start段,.start段的起始地址为0xA0000020。此段16 Byte对齐(ALIGN(16))。该段放置到pfls0_nc内存中,不用的字节使用0xFF填充。

(二)编译器编译

(三)填充值确认

首先,查看.start段实际使用量,实际.start段消耗6 Byte,如下所示:
在这里插入图片描述
本文采用16 Byte对齐,意味着有10 Byte未使用,即:未使用的10 Byte需要填充为0xFF。使用Notepad++检查生成的*.hex文件,未使用的10 Byte填充为预期的0xFF,如下所示:
在这里插入图片描述
所以,如上通过修改链接文件,编译器在生成最终的*.hex文件时,即可将不使用的字段填充为特定的填充值。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值