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

 
 
 
Reply to this topicStart new topic
> вопросы программного характера, AT91SAM7A3, Keil RV MDK 3.03
Aaron
сообщение Mar 27 2009, 09:49
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



Доброго времени суток. Думаю, вопросы буду генерировать периодически, поэтому завожу такого рода тему.

Итак, имею проект на AT91SAM7A3 (портировал :
-использование Periodic Interval Timer (прерывание 10 Гц)
-использование USART1 (самодельный софтварный кольцевой буфер)
-использование External IRQ2 (внешний генератор, по этому прерыванию посылаем в USART1 пачку данных)
-частичное использование PORTA/PORTB для эмуляции работы с внешней памятью (ALE, RD, WR, ADR, DATA).

В целом, вроде как всё работает. Но наблюдаются странности:
- после запуска генеработа (200 Гц) довольно быстро (1-2 секунды) проц перестаёт работать с основной программой (main, вне прерываний), - реагирует только на сами прерывания. Но! может и стабильно поработать несколько минут.
- при небольших и непринципиальных изменениях кода прога может вываливаться в Abort'ы. Судя по состоянию регистров, происходит нечто странное. Опять же всё совсем неоднозначно. Например, в регистре должно быть 0xFFFFFC40, а при аборте там оказывается 0xDFFFFC40 или 0x1FFFFC40 или ещё что-то похожее (то есть идёт порча 1-2 старших бит). А может вообще затираться на что-то вроде 0x00000005. Если компиляция приводит к регулярным абортам, и я пытаюсь через JTAG пошагово отследить программу, то никаких абортов не происходит. В симуляторе кейловском прога работает как швейцарские часы.

Компилирую код с оптимизаций -O0.
Стек делаю большой, в map-файле всё выглядит цивильно.
Все переменные, встречающиеся как вне прерываний, так и внутри них, объявлены как volatile.
IRQ-пре-обработчик заимствовал из кейловских примеров:
на все прерывания сначала вызывается ASM-обработчик, который уже потом прыгает в сишный обработчик, определённый в AIC.

Я уже голову сломал, кучу вариантов перепробовал, начал шаманить в общем. Прошу оценить код со стороны, может кто-то что-то заметит.
SAM7.s - стартап
AIC_interrupts.s - начальный обработчик прерываний.
interrupts.c - сишные обработчики прерываний
usart_with_sw_buf.c/h - функции работы с USART.
init.c - инициализация прерываний
Прикрепленные файлы
Прикрепленный файл  project.zip ( 15.42 килобайт ) Кол-во скачиваний: 26
 
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 27 2009, 10:19
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Добавьте обработчик Spurious Interrupt.
Go to the top of the page
 
+Quote Post
Aaron
сообщение Mar 27 2009, 11:13
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



Цитата(aaarrr)
Добавьте обработчик Spurious Interrupt.

По идее, если его не задавать, то там хранятся нули (т.е. вектор на Ресет фактически). Дак у меня вроде ине наблюдается ресетов ложных. Но даже если и так, то тогда такой вопрос: что мне делать в SPU? Просто EOICR писать и возвращаться обратно в программу?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 27 2009, 11:21
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Aaron @ Mar 27 2009, 14:13) *
что мне делать в SPU? Просто EOICR писать и возвращаться обратно в программу?

Да. Ну, можно еще сам факт возникновения отметить, хотя пользы от этого никакой нет.
Go to the top of the page
 
+Quote Post
Aaron
сообщение Mar 27 2009, 12:31
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



Да, правду говорят, что когда проблему решить не можешь, надо ей с кем-то поделиться. В общем, попробовал чуток поиграться с CKGR_MOR.OSCCOUNT, который до этого на 40 стоял (внешний кварц 16МГц, внутри делаю 80МГц). В итоге сейчас он = 30, и всё стабильно работает. Видимо, в проге косяков нету smile.gif Только я вот не понимаю, когда я смотрел, как это значение влияет на работу МК, то у меня кварц нормально заводился при значениях от 28 до 50-55, вот я и выбрал среднее значение, как типа то, при котором кварц наверняка заведётся. Видимо, ещё чего-то не понимаю. Буду разбираться.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:19
Рейтинг@Mail.ru


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