2016-03-10 1 views
0

У меня есть тип таблицы функций, определенный как такНе можете заставить таблицу функций для конкретного адреса с IAR ARM компилятор

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 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 = 

В основном я создаю новый указатель и указать его адрес, где я пытался заставить эту таблицу

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 по запрошенному адресу. Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно? Я даже не могу получить раздел, который будет отображаться в файле карты. Единственный пример, который я могу найти, это секция .intvec, но векторная таблица определена в файле сборки. Я хотел бы поместить мой загрузочный стол в файл C.

+0

Я думаю, '#pragma default_variable_attributes = @" boottable "создает раздел для вас. Вам нужно разместить раздел в регионе. Если ваш код правильно компилируется, вы должны увидеть символ на карте, но поместить его в раздел по умолчанию. – user3528438

+0

Я создаю раздел в скрипте компоновщика, как указано выше. default_variable_attributes, только что помещенный в раздел, который я уже создал. – lusher00

+0

'от 0x08000200 до 0x000002FF' не является допустимым диапазоном. – ElderBug

ответ

0

Символы, которые не используются, не содержат ссылки.

Попробуйте явно указать компоновщику, чтобы сохранить раздел. Добавить строку как:

keep { section boottable }; 
0

@ user694733 является правильным. Потому что я фактически не использовал

BootFunctionTable_t bootFunctions 

но скорее жесткий адрес, который компоновщик не выпускал. Я изменил код на

BootFunctionTable_t * bootf; 
bootf = &bootFunctions; 

и это также зафиксировано.

Смежные вопросы