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

 
 
> Вложенные прерывания в IAR, Как разрешить?
Dikoy
сообщение Nov 23 2012, 04:14
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676



Чтоб разрешить вложенные прерывания в AVR (IAR 6), надо просто сделать __enable_interrupt(); в начале тела обработчика?

Имеется ввиду вложенность, когда процу разрешается выходить из тела текущего обработчика прерывания, если возникло другое прерывание (любое).
Знаю, что это можно, но как-то до сих пор на АВР не пригождалось...
Стек левел нуждается в настройке? По умолчанию там 16.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Dikoy
сообщение Nov 23 2012, 13:26
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676



На другом форуме вот что сказали:
"Блокирует, при входе в прерывание аппаратно сбрасывается бит I глобального разрешения. Можно программой его установить, и тогда будет возможно ещё одно. Только вначале нужно сбросить флаг предыдущего прерывания, т.к. аппаратно он сбрасывается только командой RETI - иначе если приоритет этого выше, контроллер зациклится и переполнение стека"
В хелпе ИАРа никаких допдиректив для объявления прерывания не нашёл.

Цитата(demiurg_spb @ Nov 23 2012, 08:19) *
Что касается глубины стека - это вам виднее, мы не знаем сложность вашей программы и её требования к стеку.

Я про это:

Go to the top of the page
 
+Quote Post
_Артём_
сообщение Nov 23 2012, 13:50
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Dikoy @ Nov 23 2012, 15:26) *
На другом форуме вот что сказали:
"Только вначале нужно сбросить флаг предыдущего прерывания, т.к. аппаратно он сбрасывается только командой RETI - иначе если приоритет этого выше, контроллер зациклится и переполнение стека"


Чушь какая-то: приоритеты, флаги...
Обычно так делаю:
Код
#pragma vector=TIMER0_OVF_vect
__interrupt void timer_1khz_isr(void)
{
    unsigned char tmp_byte, new_byte;
    TCCR0 = 0x00;
    TIMSK &= ~(1 << TOIE0);
    __enable_interrupt();
    
    // обработка прерывания
    
    // выход из прерывания
    __disable_interrupt();
    TIMSK |= (1 << TOIE0);
}


Цитата(Dikoy @ Nov 23 2012, 15:26) *
В хелпе ИАРа никаких допдиректив для объявления прерывания не нашёл.

Есть кстати директива __nested (если не попутал чего):

Код
#pragma vector=TIMER0_OVF_vect
__interrupt __nested void timer_1khz_isr(void)
{

}


Цитата(Dikoy @ Nov 23 2012, 15:26) *
Я про это:


Про это:

Код
#include <string.h>


#pragma segment="CSTACK"
#pragma segment="RSTACK"
unsigned char *dbg_ptr, *dbg_begin;
#pragma inline=forced
inline void FillStacks()
{
    unsigned short stack_size;
    // заполнение стека данных
    stack_size=(unsigned char *)__segment_end("CSTACK")-(unsigned char *)__segment_begin("CSTACK");
    memset(__segment_begin("CSTACK"), 'D', stack_size-10);
    //// очистка стека возвратов
    dbg_ptr=(unsigned char *)SP;
    dbg_ptr-=6;    
    dbg_begin=(unsigned char *)__segment_begin("RSTACK");
    // заполнение стека возвратов символом 'R'
    memset(dbg_begin, 'R', dbg_ptr-dbg_begin);
}
__noreturn int main(void)
{


    FillStacks();
    while (1) {
    
    }
}
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st August 2025 - 23:37
Рейтинг@Mail.ru


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