2016-06-21 11 views
0

Мне нужен символ alias как псевдоним для функции function, как описано в this question, но для компилятора/компоновщика IAR. Я попытался ответы на GCC, но те не работают, очевидно:Псевдоним для функции C в IAR

// source code 
void alias(void) __attribute__ ((alias ("function"))); 
Error[Pe130]: expected a "{" C:\project\test.c 61 

void alias(void) asm("function"); 
Error[Pe065]: expected a ";" C:\project\test.c 61 

#pragma weak alias=function 
Error[e46]: Undefined external "alias" referred in ?ABS_ENTRY_MOD () 

// linker options: 
-Dalias=function 
Fatal Error[e163]: The command line symbol "function" in -Dalias=function is not defined. 

Кто-нибудь знает, как я могу определить функцию псевдоним в IAR/XLink?

Немного фона: Я несу ответственность за модуль, который используется в нескольких проектах. Чтобы проверить его, я разработал тестовые примеры для инструмента testIDEA, которые проверяют утверждения в определенных точках прерывания. Однако некоторые общие функции имеют разные имена в разных проектах (например, функцию инициализации можно назвать init(), init_mcu(), startup() и т. Д.), Поэтому каждый раз, когда мой модуль интегрируется в новый проект, мне приходится изменять свои тестовые примеры в соответствии с новыми имена функций. Вместо этого я хотел бы определить общий псевдоним (например, test_init()) для любой функции init, так что мои тестовые примеры всегда могут устанавливать точку останова с использованием этого общего имени. Я ожидаю, что этот символ превратится в файл ELF, где его можно увидеть отладчиком.

+1

Пробовал это? http://stackoverflow.com/a/25620087/2703418 – bzeaman

+1

Является ли IAR для поддержки переполнения стека? Инструменты довольно дороги, поэтому я ожидаю, что есть какая-то поддержка и документация. Что говорит документация?Что вы не поняли? – Olaf

+0

Как насчет #define функции? Например, для модуля foo будет 'test_foo.h' и #define INIT init; #define DO_STUFF do_specific_foo_stuff –

ответ

1

После внимательно посмотреть на xlink options я нашел тот, который вроде костюмов мои потребности:

-e -enew = old [, old] ...

Используйте -e для настройки программы во время соединения путем перенаправления вызова функции с одной функции на другую.

Это также можно использовать для создания функций заглушки; то есть, когда система еще не завершена, неопределенные вызовы функций могут быть направлены на фиктивную процедуру до тех пор, пока не будет записана реальная функция.

Я закончил с этим кодом:

void alias(void) { 
// copy the body of function() 
} 

// Linker parameters 
-ealias=function 

Это перенаправляет все вызовы function() к alias(), независимо от фактического имени function имеет. Конечно, это уродливый хак, потому что мне нужно скопировать код, но я получаю то, что хочу: я могу установить точку останова на alias() по имени.

+1

Хорошее альтернативное решение! Думаю, вы можете принять свой собственный ответ. – bzeaman

2

Из IAR C/C++ Development Guide (р 258.):

Чтобы сделать определение fooслабым определение, написать:
#pragma weak foo
Чтобы сделать NMI_Handler слабый псевдоним для Default_Handler, написать:
#pragma weak NMI_Handler=Default_Handler
Если NMI_Handler не определен нигде в программе, все ссылки на NMI_Handler будут ссылаться на Default_Handler.

Так, попробовать что-то вроде этого:

void f1(void); 
void f2(void); 

#pragma weak f1=f2 

void f2(void) {} 
+0

Спасибо, я отвечаю за ваш ответ, потому что он умный и может помочь другим, но это мне не помогло. Когда я делаю '#pragma слабый f1 = f2',' f1' просто не появляется в файле ELF. Если я попытаюсь заставить его с параметром '-gf1' компоновщика, я получаю' Error [e46]: неопределенный внешний «f1», указанный в? ABS_ENTRY_MOD() ' –

+1

@DmitryGrigoryev Просто догадаться: возможно, вам нужно сделать' #pragma required = f1' после «слабой» прагмы. – user694733