реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> вопросы по компилятору си IAR и MSP
wangan
сообщение May 13 2006, 07:18
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 265
Регистрация: 30-11-05
Из: Омск
Пользователь №: 11 590



Созрело несколько вопросов по компилятору си IAR и MSP:
1.Интересует необходимость volatile для переменной используемой в прерывании и что будет иначе,
из ссылки пред поста
2.Насколько корректно делать так: обрабатывать процедуру достаточно длительную в прерывании таймера, как то криво смотрится? Конечно если других времянок на таймере нет.
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;

Сообщение отредактировал wangan - May 13 2006, 07:21
Go to the top of the page
 
+Quote Post
wangan
сообщение May 13 2006, 10:57
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 265
Регистрация: 30-11-05
Из: Омск
Пользователь №: 11 590



А еще в догонку, где то читал что можно сделать чтобы на функцию main не тратялся стек или я гоню?
Go to the top of the page
 
+Quote Post
rezident
сообщение May 13 2006, 18:50
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(wangan @ May 13 2006, 13:18) *
Созрело несколько вопросов по компилятору си IAR и MSP:

Неплохо бы еще указывать и версию компилятора по которой вопросы есть smile.gif
Цитата(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 смотрите.
Go to the top of the page
 
+Quote Post
wangan
сообщение May 14 2006, 09:09
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 265
Регистрация: 30-11-05
Из: Омск
Пользователь №: 11 590



Спасибо резиденту за ответы!!!

1.Компилер версии 3.21 правда IDE тяжело работает.

2.Про volatile непонял, какое поведение будет если будет невыполнено это требование,
помойму начинаю догадываться: наверно это чтоб программа не прерывала выполнение если возникнет прерывание в момент модификации этой переменной. Идея такая или иная?

3.Наверно вы не поняли мой код, идея и задача такова: что на порту висят устройства 1-wire и часть порта используется для открытых стоков а часть как обычные цифровые вх/вых. и существует необходимость одновременного записи /чтения/
MASK_PORT_P2 это маска единиц которая определяет какие порты разрешены в установку типа открытый сток, а S_temp2 это данные собственно которые касаются открытого стока.

4. принято.
Go to the top of the page
 
+Quote Post
rezident
сообщение May 16 2006, 15:05
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(wangan @ May 14 2006, 15:09) *
2.Про volatile непонял, какое поведение будет если будет невыполнено это требование,
помойму начинаю догадываться: наверно это чтоб программа не прерывала выполнение если возникнет прерывание в момент модификации этой переменной. Идея такая или иная?

Нет, не совсем верно. Запретом прерывания компилятор заниматься не будет. Тип volatile для глобальной переменной указывает компилятору, что переменная может измениться в любой момент времени. Поэтому копилятор не будет оптимизировать команды с ее "участием".
Типичный пример.
Код
//переменная Clock инкрементируется в таймерном прерывании
unsigned Clock;

void main (void)
{
...
while(Clock<45); // здесь компилятор посчитает, что раз в цикле ожидания
                 //переменная Clock не изменяется, то данное условие
                 // не будет выполнено никогда и скомпилирует как JMP сам на себя
                 // программа здесь зациклится
...
}

Если же указать тип переменной как
Код
volatile unsigned Clock;

то компилятор все "поймет" адекватно и оптимизировать данную команду не будет
Цитата(wangan @ May 14 2006, 15:09) *
3.Наверно вы не поняли мой код, идея и задача такова: что на порту висят устройства 1-wire и часть порта используется для открытых стоков а часть как обычные цифровые вх/вых. и существует необходимость одновременного записи /чтения/
MASK_PORT_P2 это маска единиц которая определяет какие порты разрешены в установку типа открытый сток, а S_temp2 это данные собственно которые касаются открытого стока.

Думаю, что я понял. Я лишь указал вам что для организации выхода типа "открытый сток" достаточно PxOUT сбросить, а для управления выходом работать с регисторм PxDIR.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 00:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016