rezident (09.09.2011 02:07 - 02:10, просмотров: 183) ответил Алексей_Ш на Я про модель как-то подзабыл. Но попробую. Только не сейчас. А ругается он не на adda, а на &TAIV, типа адрес плохой.
Дык опять же см. определения в хедере msp430f2418.h. Там есть макросы, зависящие от выбранной модели памяти
#ifdef __IAR_SYSTEMS_ICC__
#include "in430.h"
#pragma language=extended
#define DEFC(name, address) __no_init volatile unsigned char name @ address;
#define DEFW(name, address) __no_init volatile unsigned short name @ address;
#if __REGISTER_MODEL__ == __REGISTER_MODEL_REG20__
#define DEFA(name, address) __no_init void __data20 * volatile name @ address;
#else
#define DEFA(name, address) __no_init volatile unsigned short name @ address; /* only short access is allowed from C in small memory model */
#endif
#define DEFXC volatile unsigned char
#define DEFXW volatile unsigned short
#if __REGISTER_MODEL__ == __REGISTER_MODEL_REG20__
#define DEFXA void __data20 * volatile
#else
#define DEFXA volatile unsigned short /* only short access is allowed from C in small memory model */
#endif
Но поскольку TAIV расположен в нижней части Flash, то он определен как
#define TAIV_ (0x012Eu) /* Timer A Interrupt Vector Word */
READ_ONLY DEFW( TAIV , TAIV_)
То бишь после (макро)подстановки получается
__no_init volatile unsigned short TAIV @ (0x012Eu);
Поэтому компилятор Си должен обязан разместить тело обработчика прерывания, в котором идет обращение к TAIV, в "нижней" части Flash. Но поскольку вы пишете на ASM, то видимо это уже становится вашей собственной заботой. Либо переопределяйте тип самостоятельно, либо размещайте обработчик прерывания ниже границы 64к.