gpt4 book ai didi

无法使用 IAR ARM 编译器强制函数表到特定地址

转载 作者:行者123 更新时间:2023-11-30 17:04:07 28 4
gpt4 key购买 nike

我有一个像这样定义的函数表类型

typedef struct
{
uint16_t majorRevision;
uint16_t minorRevision;
uint8_t (*CommInit)(void *);
uint8_t (*CommDeInit)(void);
uint16_t (*Write)(uint8_t *, uint16_t);
uint16_t (*Read)(uint8_t *, uint16_t);
uint8_t (*Attached)(void);
uint8_t (*ExitApp)(uint8_t);
uint8_t (*Jump)(uint32_t address);
uint16_t (*GetCRC)(uint8_t*, uint32_t);
int (*Encrypt)(uint8_t *, uint32_t);
int (*Decrypt)(uint8_t *, uint32_t);
uint8_t (*Reset)(void);
uint32_t (*GetTickCount)(void);
void (*Sleep)(uint32_t);
uint8_t (*ReadASCIIByte)(void);
uint16_t (*ReadASCIIWord)(void);
uint32_t (*ReadASCIIDWord)(void);
void (*WriteASCIIByte)(uint8_t);
void (*WriteASCIIWord)(uint16_t);
void (*WriteASCIIDWord)(uint32_t);
void (*PutChar)(uint8_t);
uint8_t (*GetChar)(void);
uint8_t (*WaitChar)(uint8_t *, uint32_t);
uint8_t (*IsOpen)(void);
} BootFunctionTable_t;

然后,我使用 default_function_attribute pragma 声明该类型的变量,将其强制到特定地址并用我的特定函数填充它。

#pragma default_variable_attributes = @ "boottable"
BootFunctionTable_t bootFunctions =
{
MAJOR_REVISION,
MINOR_REVISION,
BootSerialInit, /* Communication Init */
BootSerialDeInit, /* Communication Deinit */
BootSerialWrite,
BootSerialRead,
BootSerialAttached,
BootExitToApp,
BootJump,
BootGetCRC,
NULL,
NULL,
BootReset,
BootGetTickCount,
BootSleep,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
BootSerialPutChar,
BootSerialGetChar,
NULL
};
#pragma default_variable_attributes =

在 main 中,我创建一个新指针并将其指向我尝试强制使用该表的地址

BootFunctionTable_t * bootf;
bootf = (BootFunctionTable_t *)0x080000200;

最后,我在链接器文件中创建该部分

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/

define symbol __ICFEDIT_intvec_start__ = 0x08000000;

/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000300;
define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF;
define symbol __ICFEDIT_region_CCMRAM_start__ = 0x10000000;
define symbol __ICFEDIT_region_CCMRAM_end__ = 0x1000FFFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__ = 0x200;
/**** End of ICF editor section. ###ICF###*/


define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
define region CCMRAM_region = mem:[from __ICFEDIT_region_CCMRAM_start__ to __ICFEDIT_region_CCMRAM_end__];
define region BOOTTABLE_region = mem:[from 0x08000200 to 0x080002FF];

initialize by copy {section boottable};
place in BOOTTABLE_region { readonly section boottable};

define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };

initialize by copy { readwrite };
do not initialize { section .noinit };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };


place in ROM_region { readonly };
place in RAM_region { readwrite,
block CSTACK, block HEAP };

但我无法让链接器将 bootFunctions 放置在请求的地址处。有人可以告诉我我做错了什么吗?我什至无法让该部分显示在 map 文件中。我能找到的唯一示例是 .intvec 部分,但 vector 表是在汇编文件中定义的。我想将我的启动表放入 C 文件中。

最佳答案

未使用的符号被链接器排除。

尝试明确告诉链接器保留该部分。添加一行,例如:

keep { section boottable };

关于无法使用 IAR ARM 编译器强制函数表到特定地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35920282/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com