链接脚本-变量使用中遇到一个问题

最近在使用链接脚本变量的时候遇到一个问题,示例如下:

uint32_t *gps_ram_end   = (uint32_t *)&_ereserdata;
uint32_t *gps_ram_start = (uint32_t *)&_sreserdata;
uint32_t len = gps_ram_end - gps_ram_start;

虽然gps_ram_end = 0x10800, gps_ram_start = 0x10000,
但是len的值却是512,后来尝试使用下面的示例去解决了一下,发现是len值是正确的。

uint8_t *gps_ram_end   = (uint8_t *)&_ereserdata;
uint8_t *gps_ram_start = (uint8_t *)&_sreserdata;
uint32_t len = gps_ram_end - gps_ram_start;

经过思考之后突然醒悟过来,在用指针去做处理的时候,它是按照指针指向的类型的个数,而不是两个地址之间的差值。

完整的样例如下面所示:

MEMORY
{
    ...
    testsram (rwx) : ORIGIN = 0x10000, LENGTH = 2K
    ...
}

ENTRY(_stext)
SECTIONS
{
	...
	_reserdata = LOADADDR(.reserdata);
	.reserdata : {
		_sreserdata = ORIGIN(testsram);
		*(.reserdata .reserdata.*)
		_ereserdata = ORIGIN(testsram) + LENGTH(testsram);
	} > testsram
	...
}

1, 使用uint32_t *去接变量, len = 512

uint32_t *gps_ram_end   = (uint32_t *)&_ereserdata;
uint32_t *gps_ram_start = (uint32_t *)&_sreserdata;
uint32_t len = gps_ram_end - gps_ram_start;

2, 使用uint8_t *去接变量,len = 2048

uint8_t *gps_ram_end   = (uint8_t *)&_ereserdata;
uint8_t *gps_ram_start = (uint8_t *)&_sreserdata;
uint32_t len = gps_ram_end - gps_ram_start;

2,直接用unsigned int去接变量,大家可以考虑一下,这种情况下得出来的结果是什么。可以肯定的说,这个值基本上不会是2048,

uint32_t gps_ram_end   = _ereserdata;
uint32_t gps_ram_start = _sreserdata;
uint32_t len = gps_ram_end - gps_ram_start;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值