AVR C: Int 转十六进制地址
AVR C: Int to hexadecimal address
在 Atmega1284P 上使用 AVR GCC,我曾经有以下情况:
#define CMP_START_ADDR 0x18000
static UInt32 loadingAddr = CMP_START_ADDR;
static UInt32 newCmpAddr = CMP_START_ADDR;
在哪里,例如loadingAddr ,在某处使用如下(作为地址):
boot_program_page(loadingAddr,block_page);
其中 UInt32 是 typedef unsigned long UInt32;
现在我想要相同的设置,但如下所示:
#define CMP_START_ADDR ROM_SIZE-RESERVED_CMP_ROM_SPACE
static UInt8 amount_of_files = 0;
static UInt32 loadingAddr = CMP_START_ADDR;
static UInt32 newCmpAddr = CMP_START_ADDR;
其中ROM_SIZE和RESERVED_CMP_ROM_SPACE分别在某处定义为:
#define ROM_SIZE FLASHEND
#define RESERVED_CMP_ROM_SPACE 28000
FLASHEND 来自 iom128.h:
#define FLASHEND 0x1FFFF
新代码编译但不工作。我认为地址出错是因为我使用的整数和十六进制不一致。我将如何最有效地解决这个问题?
RESERVED_CMP_ROM_SPACE 28000
28000 不是页面对齐的,所以如果您的 boot_program_page
实现是 here 程序将编译甚至做一些事情但不会编写您期望的程序。
如果您在引导加载后使用调试器读取内存,我认为您会观察到类似 a3a1a2b3b1b2c3c1c2 而不是 a1a2a3b1b2b3c1c2c3 的内容。
试试 RESERVED_CMP_ROM_SPACE 32768
在 Atmega1284P 上使用 AVR GCC,我曾经有以下情况:
#define CMP_START_ADDR 0x18000
static UInt32 loadingAddr = CMP_START_ADDR;
static UInt32 newCmpAddr = CMP_START_ADDR;
在哪里,例如loadingAddr ,在某处使用如下(作为地址):
boot_program_page(loadingAddr,block_page);
其中 UInt32 是 typedef unsigned long UInt32;
现在我想要相同的设置,但如下所示:
#define CMP_START_ADDR ROM_SIZE-RESERVED_CMP_ROM_SPACE
static UInt8 amount_of_files = 0;
static UInt32 loadingAddr = CMP_START_ADDR;
static UInt32 newCmpAddr = CMP_START_ADDR;
其中ROM_SIZE和RESERVED_CMP_ROM_SPACE分别在某处定义为:
#define ROM_SIZE FLASHEND
#define RESERVED_CMP_ROM_SPACE 28000
FLASHEND 来自 iom128.h:
#define FLASHEND 0x1FFFF
新代码编译但不工作。我认为地址出错是因为我使用的整数和十六进制不一致。我将如何最有效地解决这个问题?
RESERVED_CMP_ROM_SPACE 28000
28000 不是页面对齐的,所以如果您的 boot_program_page
实现是 here 程序将编译甚至做一些事情但不会编写您期望的程序。
如果您在引导加载后使用调试器读取内存,我认为您会观察到类似 a3a1a2b3b1b2c3c1c2 而不是 a1a2a3b1b2b3c1c2c3 的内容。
试试 RESERVED_CMP_ROM_SPACE 32768