最近在使用链接脚本变量的时候遇到一个问题,示例如下:
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;