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

 
 
> DAbt_Handler?A или проблема с прерыванием?, Можно ли как то отложить прерывания?
GenEv
сообщение Jul 23 2007, 12:42
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 29-11-06
Пользователь №: 22 884



Проект для LPC2294.
Вообщем проблема не понятная.
Смысл такой. Есть основной цикл. по прерыванию набирается пакет байтов.
Так вот если убрать
AppBrake = GetAppBrake();
//____________________________________________ Опрос углов _____________________________
Azimut.Angle = GetAngle() + Azimut.Corr;
Elev.Angle = 14.5 + Elev.Corr;

... // Рсчеты, расчеты

т.е. различные расчеты, то все работает отлично, стоит только добавить фунцию GetAngle(); так возникает проблема DAbt_Handler?A, причем все время по разному. Обмен может происходить 30 секунд, минуту, но все равно срабатывает прерывание по DAbt_Handler?A.
Код
while(1)
    {
AppBrake = GetAppBrake();
//____________________________________________ Опрос углов _____________________________
    Azimut.Angle = GetAngle() + Azimut.Corr;
    Elev.Angle = 14.5 + Elev.Corr;

... // Рсчеты, расчеты
        
//___________________________________________ Обработка команд по RS _________________
        switch (Action) // !!!!!!
        {
        case PACK:
            IDCommand(PackNumber);
            Action = FALSE;
            for (cl = 0; cl < 20; cl ++) PackRead[cl] = 0;
            break;                                      
        case ERR_CHECK:
            WriteData(PackRead[1], "d", 1);
            Action = FALSE;
            for (cl = 0; cl < 20; cl ++) PackRead[cl] = 0;
            break;
        case ERR_PACK:
            WriteData(PackRead[1], "e", 1);
            Action = FALSE;
            for (cl = 0; cl < 20; cl ++) PackRead[cl] = 0;
            break;
        }
    }


Функция GetAngle()
Код
float GetAngle()
{
    USHORT *Adress;
    USHORT go, to;
    int s, c, turn;
    float res;
    c = 0;
    go = 0;
    to = 0;
    //======================  Азимут  =====================================================
    
    Adress = 0x82020000;        //грубый отсчет
    IOCLR1 = SP(21);
    go = *Adress;
    IOSET1 = SP(21);    

    Adress = 0x82040000;        //точный отсчет
    IOCLR1 = 0x200000;
    to = *Adress;
    IOSET1 = 0x200000;
    
    s = (go & 0x7FF) - (to >> 5);
    if (s > 1500) c = 2047;
    if (s < -1500) c = - 2047;
    
    go = go & 0xF800;
    res = go + (to >> 5) + c;
    turn = IOPIN0;
    turn = (turn >> 19) & 1;
    if ( (turn == 1) && (res < 50000) ) res += 65536;
    res = res * 360 / 65536;
    return res - 5;
}

Вообщем что делать ума не приложу.
Что то в уме смутно бродит про защиту выполнения кода от прерывания. Есть ли такое? и поможет ли?

Сообщение отредактировал GenEv - Jul 23 2007, 12:43
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
amw
сообщение Jul 24 2007, 12:52
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Если действительно проблема со стеком - его размером - то вылетание программы раз в несколько минут (часов/дней) то тогда стека "в основном хватает", но при определенной комбинации вызовов его не хватает.
Я в таких случаях подставляю в ABT_handler вывод в RS232 всего содержимого стеков и регистров для каждого режима.
По полученному дампу стека и регистров можно вычислить, хватает ли его.

Вероятно тут может помочь JTAG отладка.

Еще DABT может происходить из попыток доступа к данным по невыровненным адресам, или по несуществующим.
У Вас нигде адреса не вычисляются?

А еще модификация глобальных переменных в функции, в то время как IRQ тоже ее модифицирует.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
abcdefg
сообщение Jul 24 2007, 17:18
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 201
Регистрация: 23-01-06
Из: Msk
Пользователь №: 13 490



Цитата(amw @ Jul 24 2007, 16:52) *
Еще DABT может происходить из попыток доступа к данным по невыровненным адресам


Уверены? smile.gif
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 16th August 2025 - 04:48
Рейтинг@Mail.ru


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