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