Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
viael
Народ ну кто знает как запретить компилятору сохранять контекст(регисры) при входе в прерывание.
Я уже задавал такой вопрос в основном форуме по AVR на что получил единсвенный ответ:
Код
__raw __interrupt void my_interrupt_function(void)
{
     ...
}


Оказалось что IAR(4.20) ни слухом ни духом не знает о идентификаторе __raw.Перешерстил мануал по компилятору тоже ни одного упоминания.

Самое близкое что нашел по смыслу(это я если я правильно перевел) это идентификатор __task,
но при совмесном использовании с __interrupt компилятор выдает ошибку.Короче мне нужен аналог #pragma savereg- в CodeVision.

И еще по поводу стеков, хотя вопрос неоднократно поднимался: можно ли к.л. образом заставить компилятор использовать под стек (RSTACK) всю доступную(неиспользованную) память, или в любом случае это ручками делается
singlskv
Цитата(viael @ Sep 22 2006, 20:43) *
Народ ну кто знает как запретить компилятору сохранять контекст(регисры) при входе в прерывание.
Я уже задавал такой вопрос в основном форуме по AVR на что получил единсвенный ответ:
Код
__raw __interrupt void my_interrupt_function(void)
{
     ...
}


Напишите поподробнее что Вы конкретно хотите получить.
Как Вы планируете сохранять контекст самостоятельно?
Чем не устраивает стандартный вариант ?

Хотелось бы увидеть конкретную задачу.
viael
Цитата(singlskv @ Sep 22 2006, 23:42) *
Цитата(viael @ Sep 22 2006, 20:43) *

Народ ну кто знает как запретить компилятору сохранять контекст(регисры) при входе в прерывание.
Я уже задавал такой вопрос в основном форуме по AVR на что получил единсвенный ответ:
Код
__raw __interrupt void my_interrupt_function(void)
{
     ...
}


Напишите поподробнее что Вы конкретно хотите получить.
Как Вы планируете сохранять контекст самостоятельно?
Чем не устраивает стандартный вариант ?

Хотелось бы увидеть конкретную задачу.


Конкретная задача это портировать небольшую ОС которую я написал "под себя" на CodeVision.
У меня в прерывании от к.л. таймера сидит шендулер, при входе в прерывание сохраняется контекст задачи в отведенные для нее стеки, при выходе загружается контекст наиболее приорететной задчи.
Для реализации всего этого необходимо запретить компилятору при входе в прерывания сгружать регистры в стек.

Вот так реализовано в CodeVision

Код
#pragma savereg-
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
#asm
Kernel_start:
               ;сохраняем контекст задачи
        PUSH    R0   ;рабочие регистры используемые компилятором(см.CodeVision HELP:SRAM Memory Organization)
        PUSH    R1
        PUSH    R15    
        PUSH    R22
        PUSH    R23
        PUSH    R24                                              
        PUSH    R25
        PUSH    R26
        PUSH    R27
        PUSH    R30
        PUSH    R31
        IN        R0,SREG
        PUSH    R0

        mov r10,r28  ;сохраняем указатель на програмный стек
        mov r11,r29
        in r12,SPL   ;сохраняем указатель на аппаратный стек
        in r13,SPH
                    
                mov r28,r2   ;загружаем указатели на стеки используемые ядром ОС
                mov r29,r3
        out SPL,r4
        out SPH,r5                        
#endasm
               OS_Central_table.CurrentTask->SwPtr=OS_SwPtr;
               OS_Central_table.CurrentTask->HwPtr=OS_HwPtr;
              
               Kernel_tcb_counter=OS_Central_table.RunningTask;
               Kernel_Max_prio_task=NULL;
               Kernel_next_task=OS_Central_table.CurrentTask->Next_task;
               Kernel_Max_prio=255;
               do
               {
                        if(OS_Sets_Delay)//если произошло прерывание обслуживаем задачи в состоянии ожидания
                        {
                                if(Kernel_next_task->status==delay)
                                {
                                if((Kernel_next_task->Task_delay)>1) Kernel_next_task->Task_delay--;
                                else Kernel_next_task->status=run;
                                }
                        }
                        if(Kernel_next_task->status==run)//запускаем самую приоритетную задачу
                        {                                //для задач с равными приоритетами FIFO(round-robin)
                                if(Kernel_Max_prio>=Kernel_next_task->prio)
                                {
                                Kernel_Max_prio_task=Kernel_next_task;
                                Kernel_Max_prio=Kernel_next_task->prio;
                                Kernel_Max_prio--;
                                }
                        }
                        
               Kernel_next_task=Kernel_next_task->Next_task;
              
               }while(--Kernel_tcb_counter);
              
                    
               OS_Sets_Delay=1;
               OS_SwPtr=Kernel_Max_prio_task->SwPtr;
               OS_HwPtr=Kernel_Max_prio_task->HwPtr;
               OS_Central_table.CurrentTask=Kernel_Max_prio_task;

#asm
                mov r28,r10 ;set sw stack
                mov r29,r11
        out SPL,r12
        out SPH,r13
            
; Pop all registers uses compiler except SW stack pointer
        POP        R0
        OUT        SREG,R0
        POP        R31
        POP        R30
        POP        R27
        POP        R26
        POP        R25
        POP        R24
        POP        R23
        POP        R22
        POP        R15
        POP        R1
        POP        R0
        
#endasm
}
#pragma savereg+
IgorKossak
Цитата(viael @ Sep 22 2006, 19:43) *
Оказалось что IAR(4.20) ни слухом ни духом не знает о идентификаторе __raw.Перешерстил мануал по компилятору тоже ни одного упоминания.

Мануал переписывается только при большом количестве отличий от предыдущей версии.
В данном случае были выпущены дополнения к мануалу, которые лежат в папке avr\doc установленного продукта.
О ключевом слове __raw упоминается в файлах iccavr.htm и manuals.htm.
singlskv
Цитата(IgorKossak @ Sep 23 2006, 13:29) *
Цитата(viael @ Sep 22 2006, 19:43) *

Оказалось что IAR(4.20) ни слухом ни духом не знает о идентификаторе __raw.Перешерстил мануал по компилятору тоже ни одного упоминания.

Мануал переписывается только при большом количестве отличий от предыдущей версии.
В данном случае были выпущены дополнения к мануалу, которые лежат в папке avr\doc установленного продукта.
О ключевом слове __raw упоминается в файлах iccavr.htm и manuals.htm.

Упоминается, но там ссылка на стр.203 в EWAVR_CompilerReference.pdf ,
а в этом файле ключевое слово __raw не упоминается smile.gif
Более того, в IDE __raw не выделяется цветом как другие ключевые слова.

НО, на самом деле __raw работает!
viael
попробуйте вот так:
Код
#pragma vector=TIMER0_OVF_vect
__raw __interrupt void TC0_OVF(void)
{
...............
}

и будет Вам счасьте smile.gif
IgorKossak
Цитата(singlskv @ Sep 23 2006, 14:16) *
Упоминается, но там ссылка на стр.203 в EWAVR_CompilerReference.pdf ,
а в этом файле ключевое слово __raw не упоминается smile.gif
Более того, в IDE __raw не выделяется цветом как другие ключевые слова.

И как это народ английский переводит?
Вот цитата:
Цитата
Part2, Extended keywords, page 203
Add the following extended keywords:

__raw
Interrupt functions preserve the content of all used processor registers at function entrance and restore them at exit. However, for some very special applications, it can be desirable to prevent the registers from being saved at function entrance. This can be accomplished by the use of the extended keyword __raw, for example:

__raw __interrupt void my_interrupt_function()

__nested
Use the __nested keyword to implement a nested interrupt, in other words, an interrupt that may be called multiple times.
A nested interrupt service routine acts like a normal interrupt service routine except that it sets the interrupt enable bit before any registers are saved. Example:

__nested __interrupt void my_interrupt_function()

где говорится о том, что на стр. 204 говорится об Extended keywords (там как раз приведён список). Добавьте туда следующие extended keywords. Это же дополнение к мануалу, написанному намного раньше, чем вышла версия 4.20 продукта.
singlskv
Цитата(IgorKossak @ Sep 23 2006, 16:54) *
И как это народ английский переводит?
Вот цитата:
Цитата
Part2, Extended keywords, page 203
Add the following extended keywords:

__raw
Interrupt functions preserve the content of all used processor registers at function entrance and restore
.....................

где говорится о том, что на стр. 204 говорится об Extended keywords (там как раз приведён список). Добавьте туда следующие extended keywords. Это же дополнение к мануалу, написанному намного раньше, чем вышла версия 4.20 продукта.


Ну дык я просто пропустил оглавление документа:
"User guide corrections and updates for IAR Embedded Workbench for Atmel AVR V4.20A" smile.gif
viael
Ну спасибо всем.
Old1
Цитата(singlskv @ Sep 23 2006, 14:16) *
Более того, в IDE __raw не выделяется цветом как другие ключевые слова.

Добавьте модификатор __raw в файл avr\config\syntax_icc.cfg , перегрузите IDE (если она при этом была загружена) и он (модификатор) будет выделяться…
viael
Цитата(Old1 @ Sep 24 2006, 16:52) *
Цитата(singlskv @ Sep 23 2006, 14:16) *

Более того, в IDE __raw не выделяется цветом как другие ключевые слова.

Добавьте модификатор __raw в файл avr\config\syntax_icc.cfg , перегрузите IDE (если она при этом была загружена) и он (модификатор) будет выделяться…

a14.gif
Век живи,век учись.... biggrin.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.