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

 
 
> Замена __ram в кейл&RVCC, Как бы переложить прерывания в раму из флешки yf SAM7S256
Leen
сообщение May 4 2007, 12:13
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 172
Регистрация: 5-08-06
Из: Владивосток
Пользователь №: 19 343



Навеяло тако алгоритм:
- при линковке выделяем пустой регион где-нибудь в конце рамы;
- при запуске в симуляторе разрешаем исполнять с региона (map addr_start, addr_end read write exec)
- после входа в майн (у меня там сразу вызывается void Init(void)) первым делом копируем тела нужных прерываний в заготовленную область, начало - имя функции (новый адрес пишем в массив для посл. использования при инициализщации прерываний), конец - конструкция SUBS PC,R14,0x00000004, или 0xE25EF004 после ассемблера,
- при настройке прерываний указываем не адрес функции, написанной во флеш, а адрес ее копии из массива.

По идее, должно работать как часы. А вот нифига. Проверял только в симуляторе - железа под рукой нет и будет еще не скоро. Мучал прерывание по сравнению таймера 0. При использовании родных функций (не копий) все работает как надо - вход в прерывание = (сохранение регистров), выход - восстановление PC как R13 - 4, дальше продолжаем с прерванного места.
При использовании копии происходит следующее:
- копирование: все в норме. Смотрю регионы памяти - байт в байт, хвост не пропустил, длины совпадают.
- инициализация: все в норме. Прерывание заносится в АИЦ без малейших вопросов.
- генерация прерываний: переход на 0x18 (IRQ), оттуда прыжок на копию функции.
- в функции: выполняются все запрограммированные действия (получение и маскирование флагов прерывания, проверка каждого флага, запись 0 в EOICR).
- дошли до возврата. Смотрю R13 = 0x20061C (основной цикл в майн - оттуда ушли в прерывание),
в PC заносится 0x200618 = R13 - 4. Все круто! Работает. Но вот только почему-то, блин, переход происходит не на 0x200618, а снова на 0x18! Почему? Есл кто знает, видел, читал, объясните, пожалуйста, а то два вечера уже ковыряю. Идей никаких.
PS Читаю про RELOC опцию региона... Может, оно самое?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 2)
VAI
сообщение May 4 2007, 12:51
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



...Keil\ARM\RV30\Examples\RAM_Function\
там есть примерчик, может как-то поможет?


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
Leen
сообщение May 4 2007, 13:14
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 172
Регистрация: 5-08-06
Из: Владивосток
Пользователь №: 19 343



Блин, я его уже читал, но только сорсы и по дурости своей считал, что кейл грузит во внешнюю память LOAD INCREMENTом. А проверить не догадался... Осталось повторить с помощью скаттер-файла.
...
Проверил. Блин, грузит примерно на 0х100. cranky.gif И ведь не я первый на этом попался. VAI, спасибо!

Сообщение отредактировал Leen - May 4 2007, 13:54
Go to the top of the page
 
+Quote Post

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

 


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


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