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

 
 
> IAR-CVAVR и глюки с прерываниями, настройки IAR?
Dmitriy_V
сообщение Nov 13 2007, 20:03
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 57
Регистрация: 31-07-06
Пользователь №: 19 217



В CVAVR был с помощью CodeWizardAVR проект, в котором по таймеру менялось значение одного из портов. Практически без изменений этот же проект был перенесен в IAR. При тестировании в AVRStudio4 обе программы вели себя полностью одинаково и корректно. Однако в микроконтроллере корректно работала только программа, написанная в CVAVR. В IAR программа выполнялась, но без вызова прерывания. Контроллер прошивался в обоих случаях через CVAVR STK200. Поскольку в симуляторе обе программы работали корректно, то ошибка скорее всего возникает при создании hex файла. Формат вывода выставлен как Intel standart.
В чем может быть проблема и какие настройки надо изменить, чтобы все работало нормально?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Nov 13 2007, 23:40
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Dmitriy_V @ Nov 13 2007, 22:03) *
В чем может быть проблема
В программе и настройках. Посмотрите размер стеков, хотя он не должен влиять на вызов прерываний, скорее на работоспособность всей программы. Показывайте код, будем смотреть. Можете выкинуть все, кроме инициализации, прерывания и пустого цикла в main(). Только сначала сами убедитесь, что в таком виде программа не работает. Если вдруг заработает - постепенно добваляйте код, пока не перестанет работать.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Dmitriy_V
сообщение Nov 15 2007, 19:34
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 57
Регистрация: 31-07-06
Пользователь №: 19 217



Цитата(Сергей Борщ @ Nov 14 2007, 03:40) *
Показывайте код, будем смотреть.

Спасибо за участие и советы. Привожу код для CVAVR и IAR. Код, по-моему, проще не куда. Я его сделал после того, как два дня убил на отладку своей программы.
В общем, то что мне надо, я уже переделал под CVAVR, но в симуляторе IAR заметно лидировал по тактам выполнения работы программы. Жалко терять скорость выполнения, она и так близка к критичной.

IAR:
Код
...


CVAVR:

Код
...


Исправил, больше так не делайте.
IgorKossak


Сообщение отредактировал IgorKossak - Nov 16 2007, 07:20
Прикрепленные файлы
Прикрепленный файл  src.rar ( 1.83 килобайт ) Кол-во скачиваний: 41
 
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 15 2007, 20:26
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



А вы листинг смотрели? 99%, что цикл while (flag); ассемблировался в RJMP $-2. А ошибка ваша вот: volatile unsigned char flag;
P.S. А такие большие куски кода надо прикладывать в виде файлов. Исправьте, пока не поздно, а то модераторы по шапке надают


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Dmitriy_V
сообщение Nov 16 2007, 11:34
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 57
Регистрация: 31-07-06
Пользователь №: 19 217



Цитата(Сергей Борщ @ Nov 16 2007, 00:26) *
А вы листинг смотрели? 99%, что цикл while (flag); ассемблировался в RJMP $-2. А ошибка ваша вот: volatile unsigned char flag;
P.S. А такие большие куски кода надо прикладывать в виде файлов. Исправьте, пока не поздно, а то модераторы по шапке надают


Огромное спасибо, буду пробовать.
Листинг, конечно, смотрел, я его сам и писал biggrin.gif. По поводу
Код
while(flag);
: если он неправильно ассемблируется, то что можно использовать вместо него для задержки до срабатывания прерывания?
По поводу ошибки: никогда не думал, что оптимизация может зайти так далеко. crying.gif

Можно еще вопросик не по теме? help.gif
У меня в целевой программе есть переменная типа Int. При передачи нужно как можно быстрее передавать побайтно значение этой переменной. В настоящий момент данные передаются следующим образом:
Код
PORTA=A_int; ... PORTA=(A_int>>8) ...
. Как мне кажется, такая передача не оптимальна. По-идее, можно зарезервировать определенные регистры под переменную и выводить уже регистры:
Код
PORTA=r15; ... PORTA=r15
. Подскажите пожалуйста, будет ли такой алгоритм более быстрым по сравнению с первым и каким образом можно зарезервировать регистры под переменную? Когда я пытался осуществить резервирование, IAR говорил что-то о необходимости в изменении каких-то настроек. Заранее благодарен.

P.S. За большие вставки извиняюсь, не знал, больше не повторится.
Go to the top of the page
 
+Quote Post
ALexx
сообщение Nov 22 2007, 11:22
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 22-09-04
Из: Burbach, Germany
Пользователь №: 704



Цитата(Dmitriy_V @ Nov 16 2007, 15:34) *
У меня в целевой программе есть переменная типа Int. При передачи нужно как можно быстрее передавать побайтно значение этой переменной.

Как вариант - использование объединения:
Код
union{
  uchar Bytes[2];
  uint Word;
}Val16;
...
//где-то в программе...
Val16.Word=0x1234;
PORTA=Val16.Bytes[0];  // PORTA=0x34
PORTB=Val16.Bytes[1];  // PORTB=0x12
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 22 2007, 11:54
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(ALexx @ Nov 22 2007, 13:22) *
Как вариант - использование объединения:
И как это может ускорить выдачу в порт?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


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


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