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

 
 
> IAR, сохранение контекста
viael
сообщение Sep 22 2006, 16:43
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 200
Регистрация: 10-04-06
Из: Украина,Запорожье
Пользователь №: 15 979



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


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

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

И еще по поводу стеков, хотя вопрос неоднократно поднимался: можно ли к.л. образом заставить компилятор использовать под стек (RSTACK) всю доступную(неиспользованную) память, или в любом случае это ручками делается
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
singlskv
сообщение Sep 22 2006, 19:42
Сообщение #2


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



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


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

Хотелось бы увидеть конкретную задачу.
Go to the top of the page
 
+Quote Post
viael
сообщение Sep 22 2006, 20:15
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 200
Регистрация: 10-04-06
Из: Украина,Запорожье
Пользователь №: 15 979



Цитата(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+
Go to the top of the page
 
+Quote Post



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

 


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


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