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

 
 
> Мгновенно реагировать на нажатие кнопки. Attiny 2313, прерывания
aivs
сообщение Mar 8 2013, 20:12
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 114
Регистрация: 3-10-09
Пользователь №: 52 731



Учусь программировать под Attiny 2313, написал такую программку:
Если нажать на кнопку, то запускается цикл мигания 6 светодиодов, если в конце мигания шестого светодиода нажать кнопку, то мигание выключится.
Вот код для gcc:
Код
unsigned char LIGHT = 0;
while (1) {
  // Если свет не горит и нажата кнопку
  if (LIGHT == 0 && bit_is_clear(PIND,0)) {
    // Включить свет
    while (LIGHT == 0) {
        PORTB = 0b11111110;
        _delay_ms(200);
        PORTB = 0b11111101;
        _delay_ms(200);
        PORTB = 0b11111011;
        _delay_ms(200);
        PORTB = 0b11110111;
        _delay_ms(200);
        PORTB = 0b11101111;
        _delay_ms(200);
        PORTB = 0b11011111;
        _delay_ms(200);
        // Если нажата кнопка, то выключаем свет
        if (bit_is_clear(PIND,0)) {
            PORTB = 0b11111111;
            _delay_ms(200);
            LIGHT = 1;
        }
    }
  }
  // Если свет выключен и нажата кнопка, то включаем свет
  if (LIGHT == 1 && bit_is_clear(PIND,0)) {
    LIGHT = 0;
  }
}

Работает как я и планировал, но есть одна недоработка.

Как сделать так, чтобы нажав на кнопку в ЛЮБОЙ момент времени светодиоды остановились мигать (а не только в конце цикла мигания)? подскажите куда копать? если есть простой пример на Си буду рад его изучить.

Сообщение отредактировал aivs - Mar 8 2013, 20:14
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 28)
mempfis_
сообщение Mar 8 2013, 20:27
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(aivs @ Mar 8 2013, 23:12) *
Как сделать так, чтобы нажав на кнопку в ЛЮБОЙ момент времени светодиоды остановились мигать (а не только в конце цикла мигания)? подскажите куда копать? если есть простой пример на Си буду рад его изучить.


Вам надо фиксацию нажатия кнопки выполнять в прерывании или периодически по таймеру обязательно с алгоритмом антидребезга. И управлять длительностью моргания формируя задержки с помощью таймера.

Для простоты замените delay_ms(200) на некую процедуру которая будет опрашивать флаг таймаута и состояние нажатия кнопки. Если обнаружено нажатие кнопки, то гасите светодиоды и переходите в исходное состояние. Если обнаружен флаг таймаута, то выполняете цикл моргания дальше. Флаг таймаута устанавливайте в прерывании от таймера счётчика.
Go to the top of the page
 
+Quote Post
kovigor
сообщение Mar 9 2013, 04:24
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(aivs @ Mar 8 2013, 23:12) *
Как сделать так, чтобы нажав на кнопку в ЛЮБОЙ момент времени светодиоды остановились мигать (а не только в конце цикла мигания)? подскажите куда копать? если есть простой пример на Си буду рад его изучить.

По-научному это называется "машина состояний" ("state machine")", или "цифровой автомат". Например:
http://mcu.ucoz.ru/publ/programmirovanie/r...llerov/11-1-0-4
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Mar 9 2013, 08:19
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(kovigor @ Mar 9 2013, 07:24) *
По-научному это называется "машина состояний" ("state machine")", или "цифровой автомат".


+1
Сам поначалу описал вариант с применением автомата состояний, но потом для простоты предложил заменить процедуру.
Опишу ещё раз.
Вводите переменную состояние устройства state которая будет принимать значения 0 - ожидание нажатия, 1 - исполнение цикла.
button - флаг нажатия кнопки.
timer - таймер для формирования требуемой задержки
led_cnt - счётчик морганий

Код
switch(state)
{
case 0:
if(button)
{
//переход на моргание по нажатию кнопки
button = 0;
state = 1;
ledOn();
timer = _200mS;
led_cnt = 12;
}
break;

case 1:
if(button)
{
//переход в исходное состояние по нажатию кнопки
button = 0;
state = 0;
ledOff();
timer = 0;
}

if(timer == 0)
{

if(led_cnt>0)
{
//инвертируем состояние светодиодов
led_cnt--;
ledInvert();
timer = _200mS;
}
else
{
//переход в исходное состояние т.к. отработали цикл
button = 0;
state = 0;
ledOff();
timer = 0;
}

}
break;


default:
//переход в исходное из неизвестного состояния автомата (это на всякий случай)
button = 0;
state = 0;
ledOff();
timer = 0;
break;
}


Запускаете такой автомат в вечном цикле. А в прерывании от таймера сканируете кнопку и выполняете обратный отсчёт переменной timer с самоостановом
Код
if(timer) timer--;


Если ввести много состояний и определить условия перехода из одного в другой, то можете реализовывать различные световые эффекты или обеспечить некоторую световую индикацию. Я подобный образом формирую индикацию режимов работы своих устройств где в зависимости от состояния устройства(устройство спит, подключено к серверу, ищет сеть GSM и т.д.) светодиод зажигается/гасится на абсолютно разные интервалы времени.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Mar 9 2013, 11:13
Сообщение #5


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Могу предложить рабочий кусок кода с простеньким планировщиком задач и службой времени. Правда немного поправить наверно придется...это всё для меги8 писалось.
Антидребезг также присутсвтует.

Основной цикл будет выглядеть как-то так:
Код
void some_task()
{
//делаем что-то каждые 200ms
}

void some_task2()
{
//делаем что-то каждые 50ms
}

int main(void)
{
    uint8_t last_keys, keys;
    timer0_init();
    kbd_init();
    //клавиатура опрашивается каждые 20 миллисекунд
    shed_add_task(kbd_upd_rawstate, 20);
        //делаем что-то каждые 200ms
    shed_add_task(some_task, 200);
        //делаем что-то каждые 50ms
    shed_add_task(some_task2, 50);
    last_keys = 0;
    while(1)
    {      
        shed_upd_state();
        shed_run_tasks();            
        
        keys = kbd_get_keys();
        if ( (last_keys != keys) )
        {
            if ( (keys & 0x2) )
            {        
            //делаем что-то по кнопке 2
            }
            
            if ( (keys & 0x1) )
            {
            //делаем что-то по кнопке 1
            }    
            last_keys = keys;
        }
    }            
}

Выкладывать? Или сами птренеруетесь?


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
aivs
сообщение Mar 9 2013, 17:19
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 114
Регистрация: 3-10-09
Пользователь №: 52 731



Выкладывайте, изучу, спасибо за помощь
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 9 2013, 17:44
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



примитивные решения. надо многозадачную ОС для решения этой задачи. а чтобы было проще - бросить ущербную 8-битную архитектуру, взять ARM.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Mar 9 2013, 18:01
Сообщение #8


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
римитивные решения. надо многозадачную ОС для решения этой задачи. а чтобы было проще - бросить ущербную 8-битную архитектуру, взять ARM.
Согласен, но для начала и AVR покатит))
Прикрепленные файлы
Прикрепленный файл  Electronix_help.zip ( 10.26 килобайт ) Кол-во скачиваний: 12
 


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
kovigor
сообщение Mar 9 2013, 18:04
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(ARV @ Mar 9 2013, 20:44) *
примитивные решения. надо многозадачную ОС для решения этой задачи. а чтобы было проще - бросить ущербную 8-битную архитектуру, взять ARM.

Да. Каждой детской песочнице - по мощному экскаватору. Самое то ...
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Mar 9 2013, 22:37
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(ARV @ Mar 9 2013, 21:44) *
примитивные решения. надо многозадачную ОС для решения этой задачи. а чтобы было проще - бросить ущербную 8-битную архитектуру, взять ARM.

ARM для такой задачи ТС слабоват. Вот со скрипом , может быть потянет. Но лучше поставить 2 и сразу.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Mar 9 2013, 22:56
Сообщение #11


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Вообще нет, надо отечественный четырехядерник ставить, в интеле закладки же могут быть!
Можно кстати одним ядром клаву опрашивать, а вторым лампочки зажигать ) профит))


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
toweroff
сообщение Mar 10 2013, 06:33
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(sigmaN @ Mar 10 2013, 02:56) *
Вообще нет, надо отечественный четырехядерник ставить, в интеле закладки же могут быть!

Советские микросхемы - самые большие микросхемы в мире! (с) biggrin.gif
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Mar 11 2013, 10:37
Сообщение #13


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(toweroff @ Mar 10 2013, 10:33) *
...Советские микросхемы - самые большие микросхемы в мире!...


это потому, что наши закладки студенты пишут на си бимоле sm.gif))
Go to the top of the page
 
+Quote Post
PheeL
сообщение Mar 11 2013, 13:43
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 24-11-07
Пользователь №: 32 633



Цитата(sigmaN @ Mar 10 2013, 02:56) *
Вообще нет, надо отечественный четырехядерник ставить, в интеле закладки же могут быть!
Можно кстати одним ядром клаву опрашивать, а вторым лампочки зажигать ) профит))

Вы забыли упомянуть, что это всё надо делать только под Линуксом, потому что микро-РТОС для таких задач совершенно не подходят, т.к. для них нет готовых коммуникационных стеков и драйверов! )


--------------------
Если друг оказался вдруг и не друг и не враг, а - JTAG.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Mar 11 2013, 18:47
Сообщение #15


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Ну это само собой! RT патч только не забыть))))

P.S. ой чую влетит нам щас за оффтоп )))


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Herz
сообщение Mar 11 2013, 19:50
Сообщение #16


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(sigmaN @ Mar 11 2013, 20:47) *
P.S. ой чую влетит нам щас за оффтоп )))


Подтверждаю! Заканчиваем стёб.
Go to the top of the page
 
+Quote Post
aivs
сообщение Mar 13 2013, 12:19
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 114
Регистрация: 3-10-09
Пользователь №: 52 731



Решил пока освоить прерывания INT0 и INT1 для решения своей задачи.
Возник параллельный вопрос по функции _delay_ms()

Она должна создавать задержку на указанное время в миллисекундах
Но у меня какая то фигня выходит
Если установить частоту МК 8Мгц
Код
#define F_CPU 8000000UL

и вызвать задержку на 200 мс
Код
_delay_ms(200);

то, задержка реально будет не 200 мс, а 1.6 сек. Т.е. МК выполняет функцию _delay_ms() в 8 раз дольше, чем я планировал

Если установить частоту МК 20Мгц
Код
#define F_CPU 20000000UL

и вызвать задержку на 200 мс
Код
_delay_ms(200);

то, задержка реально будет не 200 мс, а 4 сек. Т.е. МК выполняет функцию _delay_ms() в 20 раз дольше, чем я планировал

Что не так?

Сообщение отредактировал aivs - Mar 13 2013, 12:22
Go to the top of the page
 
+Quote Post
kovigor
сообщение Mar 13 2013, 14:14
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(aivs @ Mar 13 2013, 15:19) *
Что не так?

С Fuse - битами разберитесь, по даташиту на МК. Подсказывать не буду, ибо вы обязаны разобраться с источниками тактирования МК и с фьюзами самостоятельно. Да, выставляются фьюзы программатором, а никак не из вашей программы ...
Go to the top of the page
 
+Quote Post
aivs
сообщение Mar 13 2013, 15:18
Сообщение #19


Частый гость
**

Группа: Участник
Сообщений: 114
Регистрация: 3-10-09
Пользователь №: 52 731



Разобрался с fuse битами
По умолчанию настройка fuse-битов такова
CKDIV8 - 0 (установлен) - деление тактового сигнала на 8

CKSEL3 - 0 (установлен) - выбор источника тактового сигнала
CKSEL2 - 1 (не установлен) - выбор источника тактового сигнала
CKSEL2 - 0 (установлен) - выбор источника тактового сигнала
CKSEL0 - 0 (установлен) - выбор источника тактового сигнала

Полубайт CKSEL3...0 = 0100, это означает что МК настроен на встроенный RC-генератор 8МГц
fuse-бит CKDIV8 делит эти 8 Мгц на 8, получается что МК по умолчанию работает на частоте 1МГц

Снял fuse-бит CKDIV8 и у меня все заработало как нужно

Теперь мне нужно некоторое разъяснение
1) Директива #define F_CPU 8000000UL просто сообщает программе что МК работает на частоте 8 МГц, а не задает ?
2) Внутренний RC генератор может быть настроен на выработку сигналов 8 и 4 Мгц, использую делитель на 8 (CKDIV8 fuse-бит) можно добиться частоты 1 МГц и 500КГц,
А какие частоты можно получить от внешнего кварца?
Так понимаю задать частоту нужно будет fuse-битами CKSEL3...0

Сообщение отредактировал aivs - Mar 13 2013, 19:20
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Mar 14 2013, 02:26
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



1) Да. Некоторые функции, в том числе и _delay_ms и _delay_us используют, этот макрос для расчета своих внутренних параметров. Я использую этот макрос , например, для расчета скорости USART и/или различных таймеров, что бы в случае изменения тактирования не пересчитывать все временные характеристики.

2) От внешнего кварца можно получить любые частоты. Берете справочник/каталог к-либо производителя кварца и подбираете то, что вам нужно. Для AVR-ок обычно используют из диапазона до 20 МГц. Вот некоторые стандартные частоты внешних кварцов (Мгц): 1; 1,8432; 2; 2,4576; 3,2768; и т.д.


Частота кварца (и источник тактирования в целом) выбирается исходя из назначения устройства и выполняемых задач (пониженное энергопотребление, связь на стандартной скорости по USART, максимальная производительность, наличие номиналов кварца и т.д.). С помощью FUSE-бит Вы сообщаете железу в каком диапазоне находится ваша частота и какой источник используется. Например, от внешнего генератора кварц тактируется по одной схеме,а от резонатора - по другой. Собственно говоря с помощь FUSE-бит выбирается та или иная схема подключения/выработки тактовой частоты для ядра и периферии AVR. А с помощью F_CPU Вы сообщаете софту о точном значении частоты для расчета к-либо параметров различным функциям, в том числе и своим. Например, вот мой расчет UBRR в зависимости от частоты USART:
Код
// Установка скорости в асинхронном режиме работы
static inline void usart_set_baudratea(double __pr) __attribute__((always_inline));
void usart_set_baudratea(double __pr)
{
    unsigned int bauddiv = ( (F_CPU+((__pr)*8L))/((__pr)*16L)-1 );
    UBRRH = bauddiv>>8;
    UBRRL = bauddiv;
}
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Mar 14 2013, 06:57
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



((SYSCLK/(2*USARTSPEED))-1)= ( (F_CPU+((__pr)*8L))/((__pr)*16L)-1 );



--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 14 2013, 08:51
Сообщение #22


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



вообще говоря, есть в комплекте WinAVR готовый хидер util\setbaud.h - что с ним не так, что все тут свои функции и вычисления норовят делать?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Mar 14 2013, 09:18
Сообщение #23


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



А на хер он сдался , если так проще sm.gif)


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Mar 14 2013, 10:00
Сообщение #24


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Цитата
вообще говоря, есть в комплекте WinAVR готовый хидер util\setbaud.h - что с ним не так, что все тут свои функции и вычисления норовят делать?

Когда я начинал работать с WinAVR, этого хидера еще не было. А после со своим как-то роднее......
Go to the top of the page
 
+Quote Post
ARV
сообщение Mar 14 2013, 17:38
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(ILYAUL @ Mar 14 2013, 13:18) *
А на хер он сдался , если так проще sm.gif )
самому писать - надо думать, а чужое юзать - не надо sm.gif куда ж проще... на то и библиотеки, чтобы думать о важном, а не второстепенных деталях


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Mar 14 2013, 18:54
Сообщение #26


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата
...чтобы думать о важном, а не второстепенных деталях...
Красиво... a14.gif


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
aivs
сообщение Mar 16 2013, 10:43
Сообщение #27


Частый гость
**

Группа: Участник
Сообщений: 114
Регистрация: 3-10-09
Пользователь №: 52 731



Вопрос про прерывания. Решил для отслеживания нажатия кнопки использовать прерывание по таймеру, соответственно переопределил вектора прерываний:

;--------- Переопределение векторов прерываний
start rjmp init ; 0x0000 Переход на начало программы
reti ; 0x0001 Внешнее прерывание 0. reti - завершение подпрограммы обработки прерывания
reti ; 0x0002 Внешнее прерывание 1
reti ; 0x0003 Таймер/счетчик 1, захват
rjmp prtim1 ; 0x0004 Таймер/счетчик 1, совпадение канал А
reti ; 0x0005 Таймер/счетчик 1, прерывание по переполнению
reti ; 0x0006 Таймер/счетчик 0, прерывание по переполнению
reti ; 0x0007 Прерывание UART прием завершение
reti ; 0x0008 Прерывание UART регистр данных пуст
reti ; 0x0009 Прерывание UART передача завершена
reti ; 0x0010 Прерывание по компаратору
reti ; 0x0011 Прерывание по изменению на любом контакте
reti ; 0x0012 Таймер/счетчик 1, совпадение канал B
reti ; 0x0013 Таймер/счетчик 0, совпадение канал B
reti ; 0x0014 Таймер/счетчик 0, совпадение канал А
reti ; 0x0015 USI готовность к старту
reti ; 0x0016 USI переполнение
reti ; 0x0017 EEPROM готовность
reti ; 0x0018 Переполнение охранного таймера

Вектор прерывания по совпадению таймера 1 ведёт на подпрограмму prtim1.
Два вопроса:
1) У меня в программе используется только прерывания по таймеру, значит по адресу 0x0004 должна быть инструкция перехода на подпрограмму обработки прерывания, если я вообще не опишу таблицу векторов прерываний, то при сработке прерывания выполнится инструкция по адресу 0x0004?
2) Как еще описывают таблицу векторов прерываний, без использования reti? Я так понимаю до адреса вызова "rjmp prtim1" обязательно должны быть какие нибудь nop ?

Сообщение отредактировал aivs - Mar 16 2013, 10:43
Go to the top of the page
 
+Quote Post
Xenia
сообщение Mar 16 2013, 18:01
Сообщение #28


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(aivs @ Mar 16 2013, 14:43) *
Два вопроса:
1) У меня в программе используется только прерывания по таймеру, значит по адресу 0x0004 должна быть инструкция перехода на подпрограмму обработки прерывания, если я вообще не опишу таблицу векторов прерываний, то при сработке прерывания выполнится инструкция по адресу 0x0004?
2) Как еще описывают таблицу векторов прерываний, без использования reti? Я так понимаю до адреса вызова "rjmp prtim1" обязательно должны быть какие нибудь nop ?


Обычно таблицу векторов прерываний не описывают, а компилятор формирует ее сам. Для того, что бы "встроиться" в эту таблицу (т.е. чтобы в нужное место был вставлен переход на требуемую процедуру), то ее либо называют специальным образом (т.е. когда за всеми процедурами обработки прерываний застолблены постоянные имена) и/или такие процедуры предваряются каким-то указанием компилятору (#pragma).
Например, в компиляторе IAR EWAVR это выглядит так:
Код
#pragma vector=INT0_vect
__interrupt void INT0_interrupt()
{
...
}

- тут и #pragma стоит и функцию обычно так называют. Но, наверное, все-таки #pragma здесь важнее.

Увидев функцию, оформленную таким образом, компилятор сделает следующие вещи:
1) САМ вставит в таблицу векторов прерываний переход на нее. Причем, не абы куда, а как раз в ячейку для прерывания INT0.
2) САМ оформит возврат из этой процедуры, как iret.
3) САМ сохранит в стеке флаг текущих арифметических операций и старые значения всех (мусорных) регистров, которые он внутри этой процедуры будет использовать, а в конце процедуры ВОССТАНОВИТ эти значения из стека.

Всё это касается компилятора C/C++, тогда как на ассемблере всеми этими вещами должен озаботиться программист. Хотя именно поэтому в программировании на ассемблере есть своя неповторимая прелесть. sm.gif
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Mar 16 2013, 18:38
Сообщение #29


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата
Хотя именно поэтому в программировании на ассемблере есть своя неповторимая прелесть
a14.gif


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 17:55
Рейтинг@Mail.ru


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