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

 
 
> AVR Studio эмуляция прерываний, После отработки подпрограммы перескакивает в конец цикла
RAmsi
сообщение Apr 25 2009, 15:35
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 5-04-09
Пользователь №: 47 200



В теле блока main алгоритм внутри цикла while (1) {...};
За время счета алгоритма несколько раз срабатывает прерывание по таймеру.
При эмуляции после первого прерывания курсор не возвращается на прежнее место в алгоритме, а перескакивает на последнюю строчку в цикле while (1). Повторного прогона цикла не происходит, а далее работают только прерывания.
Как заставить программу продолжаться с того места, где произошло прерывание и заставить её крутиться в цикле while (1) ?
Перешел на AVR Studio и WinAVR и подобного рода проблемы на уже отлаженных алгоритмах вылезают на ровном месте одна за другой crying.gif

Сообщение отредактировал RAmsi - Apr 25 2009, 15:37
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
RAmsi
сообщение Apr 30 2009, 11:37
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 5-04-09
Пользователь №: 47 200



Листинги программ естественно разные с учетом стандартов каждого компилятора. Проекты одинаковые в смысле алгоритма. Второй строился на базе первого.

Отключил все прерывания. В CVAVR в начале и в конце каждого блока добавил по инвертированию одной ноги свободного порта чтобы в VMLAB измерить интервал на осциллографе. Для чистоты эксперимента такое же инвертирование добавил и в WinAVR.

Куски кода:

CVAVR, VMLAB:
PORTC.3^=1;
xlp1[0]=xlp1[1]; xlp1[1]=xlp1[2]; xlp1[2]=xlp1[3]; xlp1[3]=xlp1[4];
xlp1[4]=input_data/21.46710182;
ylp1[0]=ylp1[1]; ylp1[1]=ylp1[2]; ylp1[2]=ylp1[3]; ylp1[3]=ylp1[4];
ylp1[4]=(xlp1[0]+xlp1[4]+4*(xlp1[1]+xlp1[3])+6*xlp1[2])-
(0.0301188750*ylp1[0])+(0.1826756978*ylp1[1])-
(0.6799785269*ylp1[2])+(0.7820951980*ylp1[3]);
PORTC.3^=1;

WinAVR, AVR Studio:
PORTC |= 1<<3;
xlp1[0]=xlp1[1]; xlp1[1]=xlp1[2]; xlp1[2]=xlp1[3]; xlp1[3]=xlp1[4];
xlp1[4]=input_data/21.46710182;
ylp1[0]=ylp1[1]; ylp1[1]=ylp1[2]; ylp1[2]=ylp1[3]; ylp1[3]=ylp1[4];
ylp1[4]=(xlp1[0]+xlp1[4]+4*(xlp1[1]+xlp1[3])+6*xlp1[2])-
(0.0301188750*ylp1[0])+(0.1826756978*ylp1[1])-
(0.6799785269*ylp1[2])+(0.7820951980*ylp1[3]);
PORTC |= 0<<3;

На выполнение первого по эмулятору ушло 145 мкс.
На выполнение второго в зависимости от оптимизации 946-949 мкс.
Львиная доля времени ушла на вычисление последней строчки фильтра.
В одном и другом проекте массив определен как double.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Apr 30 2009, 13:48
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(RAmsi @ Apr 30 2009, 14:37) *
Куски кода:
WinAVR, AVR Studio:
PORTC |= 1<<3;
*************
PORTC |= 0<<3;
На выполнение второго в зависимости от оптимизации 946-949 мкс.


Я вот из Ваших сообщений немного бреда выжал. Почитайте и посмейтесь над собой.
По делу: выложите листинг WinAVRовского кода. Без него ничего не понять. Оптимизацию оставьте -Os, с ней уж точно играться смысла нету.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- RAmsi   AVR Studio эмуляция прерываний   Apr 25 2009, 15:35
- - smac   Цитата(RAmsi @ Apr 25 2009, 19:35) В теле...   Apr 25 2009, 17:27
- - RAmsi   Прогнал эмуляцию до упора. Проблема оказалась не в...   Apr 26 2009, 16:47
- - SasaVitebsk   Видите ли. Отмечу несколько моментов. 1) Как ни с...   Apr 28 2009, 08:01
- - RAmsi   Уровень оптимизации выставлял разный. Разницы почт...   Apr 28 2009, 12:12
- - SasaVitebsk   Я работаю вообще в IARе. Речь не идёт об ошибках....   Apr 28 2009, 12:48
- - GDI   Выполните код пошагово и посмотрите где у вас набе...   Apr 28 2009, 12:51
- - Верталь   RAmsi Как понять Ваше высказывание: Ошибки в коде...   Apr 28 2009, 15:20
- - SasaVitebsk   А массивы xlp,ylp объявлены как int или как float?...   Apr 28 2009, 17:16
- - aesok   Цитата(RAmsi @ Apr 25 2009, 19:35) В теле...   Apr 29 2009, 07:32
|- - Dog Pawlowa   Цитата(RAmsi @ Apr 30 2009, 14:37) xlp1[0...   Apr 30 2009, 13:56
- - RAmsi   Прошу прощения. Массивы не double, а float.   Apr 30 2009, 13:36
- - RAmsi   Смеяться пока могу над тем, что я еще не такой опы...   Apr 30 2009, 14:59
|- - aesok   Комндную строку линкера покажите, или Makefile. А...   Apr 30 2009, 15:15
- - RAmsi   Спасибо   Apr 30 2009, 15:31
- - SysRq   Ммм.. Эта строчка ничего не делает: Цитата(RAmsi ...   Apr 30 2009, 18:32
- - RAmsi   Строчки PORTC можно совсем выкинуть. Не в них дело...   Apr 30 2009, 19:26
- - SysRq   Из интереса поковырял. Проверьте, что подключена l...   May 1 2009, 14:20
|- - aesok   Цитата(SysRq @ May 1 2009, 18:20) Правиль...   May 1 2009, 15:38
- - RAmsi   Спасибо всем, кто откликнулся! Библиотеку подк...   May 2 2009, 12:51


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

 


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


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