Цитата(aaarrr @ Nov 9 2007, 01:03)

По-моему, издержек в любом случае будет немного. Не такой уж частый случай.
Да. Но если без напряжения можно сделать лучше - почему бы и да? А не пытаюсь никого отговаривать. Просто мне так кажется логичнее - функция располагается в другом модуле, адрес ее фиксированный, на мой взгляд проставлять в код адрес такой функции скорее задача линкера. Да и прозрачнее как-то код смотрится - объявлена функция, явно указано, что она внешняя, и вызов. Аналогично можно объявлять и функции с параметрами, причем указывать фиктивные самодокументирующие имена параметров. Кстати, вызов IAP у LPC таким образом тоже красиво получается:
Код
// (Philips) Status Codes
enum iap_status_t
{
CMD_SUCCESS, INVALID_CMD,
SRC_ADDR_ERROR, DST_ADDR_ERROR, SRC_ADDR_NOT_MAPPED, DST_ADDR_NOT_MAPPED,
COUNT_ERROR, INVALID_SECTOR, SECTOR_NOT_BLANK, SECTOR_NOT_PREPARED,
COMPARE_ERROR, BUSY, PARAM_ERROR, ADDR_ERROR, ADDR_NOT_MAPPED,
CMD_LOCKED, INVALID_CODE, INVALID_BAUD_RATE, INVALID_STOP_BIT, CODE_READ_PROT_ENABLED, MAX_ERROR
};
enum iap_cmd_t
{
PREPARE = 50, COPY, ERASE, BLANK_CHECK, GET_PART_ID, GET_BOOT_VER, COMPARE, SIZE_ALIGN = 0xFFFFFFFF
};
#pragma pack (push,4)
struct iap_command_t
{
iap_cmd_t Command;
uint32_t Param[4];
};
struct iap_result_t
{
iap_status_t Status;
uint32_t Result[4];
};
#pragma pack (pop)
extern "C" __thumb void IAP(iap_command_t *params, iap_result_t *result);
/*
in .xcl:
// IAP routine, thumb code
-DIAP=7FFFFFF1
*/
.
Цитата(aaarrr @ Nov 9 2007, 01:03)

Ну, #define еще никто не отменял, а в данном случае это будет родной define, а не опция линкера.
Не спорю - можно и так. Ненаказуемо

Цитата(aaarrr @ Nov 9 2007, 01:03)

А если бы Вы переходили на ADS/RVDS, то проблемы бы возникли - не знаю, как протащить там подобную конструкцию, кроме как через symdefs-файл.
Возможность-то наверняка есть, просто мы о ней (пока) не знаем. Хотя бы и через файл.
P.S. Мнения четко разделились на два подхода. Вот пришел бы кто-нибудь умный, вроде
ReAl, и растолковал ограничения и правильность каждого решения.