1. Конфигурацию в АСМ проекте лучше делать отдельным С-файлом. Во первых, читабельнее. Во вторых, исчезнут варнинги. В третьих, генерация этого файла легко делается в окне Configuration bits - там есть кнопка.
2. Применение AIVT делает использование Loadables-проекта для загрузчика кривым. Поэтому лучше загрузчик и основной код размещать в едином проекте, выделяя их в отдельные секции.
3. Для генерации AIVT в общем случае нужно правильно рассчитать лимитер адреса бут-сегмента кода в конфиге. Ну и включить бут сегмент и альтернативную таблицу:
Код: Выделить всё
// FSEC
........
#pragma config BSEN = ON
........
#pragma config AIVTDIS = ON
// FBSLIM
#pragma config BSLIM = 0x1FFA
........
В этой ситуации, как вы понимаете, IVT работает в загрузчике, а AIVT обслуживает основной код.
Лимитер расчитывается как 0x1FFF минус количество страниц бут-сегмента (0x1FFF-0x5=0x1FFA)
Компоновка кода выглядит при этом так:
Код: Выделить всё
.include "p33CH512MP208.inc"
........
.section bufNear, near
........
.section bufX, address (0x2000)
........
.section bufY, address (0x7000)
........
.section bufY_EDS, address (0x8000)
........
.section *, code, boot
.global __reset
.global __OscillatorFail
.global __AddressError
.global __HardTrapError
.global __StackError
.global __MathError
.global __OscillatorFail
.global __SoftTrapError
.global __T1Interrupt
........
__reset:
mov #__SP_init, W15
mov #__SPLIM_init, W0
mov W0, SPLIM
nop
bra MainBoot
........
........
........
.section *, code
.global __reset
.global __AltAddressError
.global __AltHardTrapError
.global __AltStackError
.global __AltMathError
.global __AltDMACError
.global __AltSoftTrapError
.global __AltT1Interrupt
........
Application:
bra Main
........
........
.end
Код старта, стопа и загрузки Slave-ядра размещайте сразу после
Application:
bra Main
то есть до остального кода основной программы. Иначе возникают странности с длиной имиджа слейв-кода и слейв ядро потом не стартует.
У меня в проекте используется три перезагружаемых имиджа слейва и после сборки кода карта памяти выглядит так:
Код: Выделить всё
section address length (PC units) length (bytes) (dec)
------- ------- ----------------- --------------------
AM-EAS-CH-v0-1.s.scn1 0x800 0x108a 0x18cf (6351)
.aivt._AltAddressError 0x2006 0x2 0x3 (3)
.aivt._AltHardTrapError 0x2008 0x2 0x3 (3)
.aivt._AltStackError 0x200a 0x2 0x3 (3)
.aivt._AltMathError 0x200c 0x2 0x3 (3)
.aivt._AltSoftTrapError 0x2010 0x2 0x3 (3)
.aivt._AltT1Interrupt 0x2016 0x2 0x3 (3)
.aivt._AltDMA1Interrupt 0x2024 0x2 0x3 (3)
.aivt._AltU1RXInterrupt 0x202a 0x2 0x3 (3)
.aivt._AltINT1Interrupt 0x2032 0x2 0x3 (3)
.aivt._AltDMA2Interrupt 0x2038 0x2 0x3 (3)
.aivt._AltINT2Interrupt 0x203c 0x2 0x3 (3)
.aivt._AltDMA3Interrupt 0x203e 0x2 0x3 (3)
.aivt._AltCCP2Interrupt 0x2042 0x2 0x3 (3)
.aivt._AltU2RXInterrupt 0x204a 0x2 0x3 (3)
.aivt._AltU2TXInterrupt 0x204c 0x2 0x3 (3)
.aivt._AltCCP3Interrupt 0x205a 0x2 0x3 (3)
.aivt._AltPTG0Interrupt 0x20b8 0x2 0x3 (3)
.aivt._AltPTG1Interrupt 0x20ba 0x2 0x3 (3)
.aivt._AltPTG2Interrupt 0x20bc 0x2 0x3 (3)
.aivt._AltPTG3Interrupt 0x20be 0x2 0x3 (3)
.aivt._AltMSIS1Interrupt 0x2116 0x2 0x3 (3)
.aivt._AltMSIAInterrupt 0x2118 0x2 0x3 (3)
.aivt._AltMSIBInterrupt 0x211a 0x2 0x3 (3)
.aivt._AltMSICInterrupt 0x211c 0x2 0x3 (3)
.aivt._AltMSIDInterrupt 0x211e 0x2 0x3 (3)
.aivt._AltCCP8Interrupt 0x2144 0x2 0x3 (3)
.text 0x2800 0x2 0x3 (3)
AM-EAS-CH-v0-1.s.scn2 0x2802 0x283e 0x3c5d (15453)
SLAV_image 0x5040 0x104a 0x186f (6255)
SLAV_TUNE_image 0x608a 0x772 0xb2b (2859)
SLAV_SYNC_image 0x67fc 0x6b2 0xa0b (2571)


