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

 
 
 
Reply to this topicStart new topic
> Разместить мнемонику по заданному адресу?
a9d
сообщение Nov 11 2012, 17:41
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



Мне нужно отключить гобальные прерывания сразу после срабатывания прерывания. MCU 8051

Если написать в самом начале обработчика EA=0, то после сборки я вижу, что сначала в программный стек сохраняются регистры а уже потом выполняется EA=0. Т.е. есть риск вытеснения.

На каждый вектор выделяется по 8байт. Я подумал, что можно сделать конструкцию вида
clr EA
jmp Interrupt

Но я могу двигать только "jmp Interrupt" и все. Компилятор не разрешает вносить изменения в секцию INTVEC.

Как выкрутиться??

Программа минимум. Это выключать прерывание первой инструкцией в обработчике.
Программа максимум. Сдвинуть jmp на обработчик и вставить сброс флага.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 11 2012, 19:03
Сообщение #2


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



А там атрибут функции monitor не складывается с interrupt ?
Он же и разрешит прерывания в самом конце.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
a9d
сообщение Nov 11 2012, 19:36
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



Я пробовал. Это приводит к генерированию шапки

Код
000A31  C0 E0           PUSH  A
000A33  74 F2           MOV   A,#0xF2
000A35  12 01 DD        LCALL ?INTERRUPT_ENTER_XSP
000A38  C0 A8           PUSH  IEN0                                                 <-- соxраняем EA
000A3A  C2 AF           CLR   IEN0.7                                               <-- сбрасываем
000A3C  74 FF           MOV   A,#0xFF
000A3E  12 00 E0        LCALL ?ALLOC_XSTACK8
  OS::scmRTOS_ISRW_TYPE ISR;


Вероятность вытеснения всеравно остается.

Нашел ответ!

Код
COMMON INTVEC
        ORG WDT_VECTOR
        CLR   IEN0.7


Для всех прерывайний. А дальше делаем редефайн всех векторов на новые адреса.

Сообщение отредактировал a9d - Nov 11 2012, 19:37
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Nov 11 2012, 19:48
Сообщение #4


Гуру
******

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



Думаю надо копать в сторону написания обработчика прерывания на ассемблере. Должна же быть такая возможность...
На IARAVR вроде что-то такое делал.
Код
Timer_ISR:
    cli
    call Timer_ISR_C; вызов Сишного обработчика
    sei
    reti

Но у АВР нет 8 байт флеша на каждый вектор и некоторые вектора при такой конструкции уже нельзя использовать.

Тем более для схемы на программном прерывании переключения контекста тоже нужно разобраться как писать свой ассемблерный обработчик и вызывать из него Сишную функцию.
Go to the top of the page
 
+Quote Post
a9d
сообщение Nov 11 2012, 19:50
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



Я уже исправил. Теперь первая команда не джам а сброс флага.
Go to the top of the page
 
+Quote Post
С_Ч
сообщение Nov 12 2012, 06:55
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 22-10-12
Из: г. Москва
Пользователь №: 74 038



На ассемблере это делается "на раз". Одна команда CLR EA и все прерывания запрещены. Если нужно максимально быстро запретить прерывния, то эта команда пишется в таблицу прерываний, а за ней jmp... Но тогда мы жертвуем следующим по списку прерыванием. И что бы не было непредсказуемых глюков пожертвованное прерывание надо запретить при настройке системы. А можно сначала выполнить jmp... а затем запрет прерываний. Тогда ничем жертвовать на надо, но запрет пойдет после джампа. После обработки нужно снять запрет прерывания командой SETB EA. Еще можно посмотреть и назначить приоритет прерываний. Насколько я помню, при обработке прерываний возможно прерывание только более высокого уровня. Мож и запрещать ничего не надо.
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 12 2012, 07:11
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(С_Ч @ Nov 12 2012, 10:55) *
Еще можно посмотреть и назначить приоритет прерываний. Насколько я помню, при обработке прерываний возможно прерывание только более высокого уровня. Мож и запрещать ничего не надо.

+1. С этого надо было начинать. ИМХО, запрещение прерываний в обработчике никогда не сможет гарантировать отсутствие вытеснения, так как второе прерывание может произойти между первым и началом работы обработчика.
Go to the top of the page
 
+Quote Post
a9d
сообщение Nov 21 2012, 23:29
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



Я эту проблему решил давно.

Код
+1. С этого надо было начинать. ИМХО, запрещение прерываний в обработчике никогда не сможет гарантировать отсутствие вытеснения, так как второе прерывание может произойти между первым и началом работы обработчика.


гмм. Это как выключенные прерывания могут, что-то вытеснить?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 8th June 2024 - 21:56
Рейтинг@Mail.ru


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