Цитата(Brain13 @ Feb 11 2014, 10:45)

1) Как мне разместить библиотеку в области бутлоадера?
Я сделал через структуру с указателями на функции, размещённую по фиксированному адресу. Привожу реальный код.
Загрузчик:
CODE
struct export_table
{
void (*adc_init)(void);
void (*adc_poll)(void);
uint16_t (*adc_read)(uint8_t ch);
void (*flash_init)(void);
void (*flash_eraseblock)(void* addr);
void (*flash_writeblock)(void* src, void* dst);
void* (*frame_init)(void);
uint8_t (*frame_rxpoll)(void);
void (*frame_append)(void *src, uint8_t len);
void (*frame_end)(void);
void (*mymalloc_init)(void* pool, unsigned int len);
void* (*mymalloc)(int len);
void (*power_init)(void);
void (*power_poll)(void);
void (*systime_init)(void);
unsigned int (*systime_ms)(void);
void (*start_boot_loader)(void);
};
#pragma location = "ftab"
__root const struct export_table ftab =
{
adc_init,
adc_poll,
adc_read,
flash_init,
flash_eraseblock,
flash_writeblock,
frame_init,
frame_rxpoll,
frame_append,
frame_end,
mymalloc_init,
mymalloc,
power_init,
power_poll,
systime_init,
systime_ms,
start_boot_loader
};
В скрипте линкера:
Код
...
place at start of NearFuncCode { block INTVEC };
place in NearFuncCode { ro section ftab };
place in NearFuncCode { ro section .far.data_init,
...
Приложение содержит объявление той же структуры. Переменная объявляется следующим образом:
Код
#pragma location = 0x8080
__no_init const struct export_table ftab;
Функции вызываются так:
Код
ftab.start_boot_loader();
Цитата(Brain13 @ Feb 11 2014, 10:45)

2) Как сделать так, чтобы и основная программа и бутлдоадер могли обращаться к функциям одной и той же библиотеки ?
3) Я правильно понимаю, что функции для работы с 32 битными числами уже будут в библиотеке?
4) Если я буду использовать операции с 32 битными числами в основной программе, то будут использоваться функции из библиотеки или подтянутся новые экземпляры тех же функций?
Естественно, при таком подходе вспомогательные функции (для работы с 32-битными числами, например) будут продублированы в загрузчике и в приложении. В этом есть плюсы: при обновлении версии компилятора эти функции могут поменяться, и если они не продублированы, то приложение, собранное новым компилятором, будет несовместимо с загрузчиком, собранным старым компилятором. Сейчас же требование для совместимости только одно: чтобы компилятор не поменял ABI (соглашение о вызовах функций). Такие изменения происходят крайне редко.
Попробуйте изучить map-файл на предмет того, какой выигрыш может дать устранение дублирования вспомогательных функций. Может быть, овчинка не стоит выделки, так как я не вижу простых способов устранить это дублирование.