|
Сегменты из разных файлов с одинаковым именем сшиваются в один (это я так, напоминаю) непрерывный кусок. Порядком сегментов можно управлять.
Если теперь сделать сегменты initstart init initend, в initstart-е сложить стандартную начальную инициализацию, init разрешить задавать всем файлам, initend опять в файле-"запускалке" - окончание инициализации и переход на главный код.
Если теперь
; запускалка
.section initstart
что-то поделали.section initend
sei ; открыли все прерывания
jmp main; файл работы с uart
.section init
инициализируем SFR уарта, взводим бит разрешения его
прерываний (но общим битом они ещё запрещены).section .text
а тут функции работы с уартом; файл с системными часами и т.п.
.section init
аналогично, как выше
.section .text
После линковки код будет объединён так:
.initstart из запускали
.init из uart.asm
.init из systmr.asm
.initend из запускалки ; только тут разрешены прерывания
.text из uart.asm
.text из systmr.asm
.text из main.asm
call inituart
call initsystmr
...
// setup_io must be "called" _after_ .init2
// because of __zero_reg__ cleared in .init2
void setup_io(void) __attribute__ ((section(".init3"))) __attribute__ ((naked));
void setup_io(void)
{
OSCCAL = __LPM(&osccal_value);
DDRB = 0x0E; // IR_PULSE, OC1B, SCK, DO - outputs
PORTB = 0xF6; // SCK, DO high, DI w/o pull-up
DDRA = 0x61; // LEDS, PULSE, DF_SELECT - outputs,
// XJ4,XJ5 - input w/o pull-up
PORTA = 0x09;
ACSR = (1 << ACD); // disable analog comparator
TIMSK = 0;
TCCR0 = 1 << CS00; // CK, 32us overflow
}
Подобным образом HiTech для PIC (если мне не изменяет память) пришивает небольшие секции со входом и выходом из прерывания к секции кода функции-обработчика прерывания.
E-mail: info@telesys.ru