Цитата(wangan @ May 13 2006, 13:18)

Созрело несколько вопросов по компилятору си IAR и MSP:
Неплохо бы еще указывать и версию компилятора по которой вопросы есть

Цитата(wangan @ May 13 2006, 13:18)

1.Интересует необходимость volatile для переменной используемой в прерывании и что будет иначе,
из ссылки пред поста
Если переменная глобальная, то обязательно.
Цитата(wangan @ May 13 2006, 13:18)

2.Насколько корректно делать так: обрабатывать процедуру достаточно длительную в прерывании таймера, как то криво смотрится? Конечно если других времянок на таймере нет.
Вполне корректно если прерывание не имеет вложенности. В случае вложенных прерываний придерживайтесь принципа: суммарное время выполнения всех вложенных прерываний не должно превышать интервала вызова самого "быстрого" прерывания.
Цитата(wangan @ May 13 2006, 13:18)

3.Нельзя какнибудь подругому сделать эмуляцию открытого стока в MSP430 чтобы не залезать на неиспользуемые ножки порта более компактно чтоли?:
MaskPortInv2 = ~MASK_PORT_P2;
S_tempInv2 = ~S_temp2;
P2DIR &= S_tempInv2 | MaskPortInv2;
P2OUT &= S_temp2 | MaskPortInv2;
P2DIR |= S_tempInv2 & MASK_PORT_P2;
P2OUT |= S_temp2 & MASK_PORT_P2;
Дык оперируйте только регистором направления, предварительно сбросив биты в регистре вывода.
Пример.
Код
#define BIT_MASK BIT0+BIT1+BIT5 //маска для битов 0, 1, 5
P2OUT&=~BIT_MASK; // предварительный сброс пинов, работающих как открытый сток
P2DIR&=~BIT0; // P2.0 лог.1, т.е. открытый сток
P2DIR|=BIT5; // P2.5 лог.0, т.е. нуль на выходе
Цитата(wangan @ May 13 2006, 13:18)

А еще в догонку, где то читал что можно сделать чтобы на функцию main не тратялся стек или я гоню?
Используйте опцию
__task.
Код
#pragma type_attribute=__task
void main(void)
{
...
}
или
Код
__task void main(void)
{
...
}
Только по-моему этот атрибут не для всех встроенных библиотек допустим. Подробнее в HELPе IAR смотрите.