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

 
 
> AT91RM9200 - разбиение кода на быструю и медленную части, SDRAM и внутренняя SRAM
Antokha
сообщение Oct 27 2008, 19:43
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



Имею в качестве среды среды разработки IAR 5.11 и отладочную плату AS-9200 (Argussoft) + JTAG SAM-ICE. вопрос в следующем:
1. Как содать проект в IAR-e таким образом, что несколько коротких функций (написаны ASM командами и добавлены в проект отдельными файлами) при загрузке были размещены во внутренней SRAM контроллера, а остальные функции (такие как main, функции работы с флешкой AT45DB642D, функции вывода информации на экран, и другие) были размещены в внешней SDRAM.
Функции, которые необходимо размещать в SRAM, критичны к времени выполнения, поэтому и ставиться такая задача. Все функции проекта не умещаются в SRAM. При явном указании размещения функций в файле *.icf файл прошивки контроллера весит свыше 500 мегабайт, что естественно неприемлемо wacko.gif .
Всех участников форума прошу предложить хоть какие-то варианты - мой мозг уже разрывается на куски, мысли закончились.
P.S. Вся прошивка весит где-то 30-50 кБ, поэтому варианты с установкой ОСи (любой) не предлагать - слишком высокая цена получается на реализацию платы (достаточно большое количество SDRAM).
Go to the top of the page
 
+Quote Post
4 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 51)
aaarrr
сообщение Oct 27 2008, 20:24
Сообщение #2


Гуру
******

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



Цитата(Antokha @ Oct 27 2008, 22:43) *
P.S. Вся прошивка весит где-то 30-50 кБ, поэтому варианты с установкой ОСи (любой) не предлагать - слишком высокая цена получается на реализацию платы (достаточно большое количество SDRAM).

Тогда смысла нет задействовать SRAM. Если кэш включен, разницы в скорости Вы, скорее всего, не почувствуете.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Oct 28 2008, 17:17
Сообщение #3


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



И более того, если кеш включен, перепрыгивание между SRAM и SDRAM могут запросто понизить общее быстродействие.
Go to the top of the page
 
+Quote Post
dch
сообщение Oct 28 2008, 17:40
Сообщение #4


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

Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661



Цитата(sergeeff @ Oct 28 2008, 20:17) *
И более того, если кеш включен

он же не делится если влючен нет внутренней SRAM
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 28 2008, 17:56
Сообщение #5


Гуру
******

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



Цитата(dch @ Oct 28 2008, 20:40) *
он же не делится если влючен нет внутренней SRAM

Вы путаете, SRAM при включенном кэше никуда не денется.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Oct 28 2008, 18:58
Сообщение #6


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(dch @ Oct 28 2008, 21:40) *
он же не делится если влючен нет внутренней SRAM


кеш покрывает все доступное адресное пространство процессора, а какие области делать кешируемые, какие нет - в Translation Table прописывается.
Go to the top of the page
 
+Quote Post
Antokha
сообщение Oct 28 2008, 20:14
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



Время перепрыгивания из функций SDRAM в функции SRAM мне не важно. Необходимо, чтобы функции расположенные в SRAM выполнялись со стабильной скоростью, которая должна быть не менее предварительной определённой. При отладке этих фунций без остального содержимого программы их выполнение по времени было на грани необходимого для нормальной работы. Надеюсь я понятно выразился. А насчёт кэша идея хорошая - попробую на днях (про Translation Table почитаю в pdf-нике на AT91RM9200).
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Oct 28 2008, 20:22
Сообщение #8


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



про Translation Table в pdf-нике на AT91RM9200 ничего нет. Это написано в Technical Reference Manual на ARM920T, например, который можно на сайте ARM найти. Идея добиться стабильной скорости работы процедуры - идея фикс. У вас что, прерываний в системе вообще нет? Даже если вы на время вызова функции сделаете это в критической секции (с запрещенными прерываниями), то даже время запрета прерывания нестабильно по времени.
Go to the top of the page
 
+Quote Post
Antokha
сообщение Oct 28 2008, 21:29
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



Цитата(sergeeff @ Oct 29 2008, 00:22) *
про Translation Table в pdf-нике на AT91RM9200 ничего нет. Это написано в Technical Reference Manual на ARM920T, например, который можно на сайте ARM найти. Идея добиться стабильной скорости работы процедуры - идея фикс. У вас что, прерываний в системе вообще нет? Даже если вы на время вызова функции сделаете это в критической секции (с запрещенными прерываниями), то даже время запрета прерывания нестабильно по времени.


Насчет pdf спасибо. А скорость выполнения при отладке (загрузка программы через JTAG) стабильная. Если честно я даже забыл прерывания включить. Прерывание наверное будет одно - для USART-a.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Oct 28 2008, 22:57
Сообщение #10


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(sergeeff @ Oct 28 2008, 21:58) *
кеш покрывает все доступное адресное пространство процессора, а какие области делать кешируемые, какие нет - в Translation Table прописывается.

А какой смысл в кеше на внутреннюю SRAM которая и так full speed ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 29 2008, 08:29
Сообщение #11


Гуру
******

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



Цитата(singlskv @ Oct 29 2008, 01:57) *
А какой смысл в кеше на внутреннюю SRAM которая и так full speed ?

Без кэша будут потеряны преимущества псевдогарвадовости ARM920. Т.е. из внутренней SRAM без кэширования программа будет выполняться медленнее.

Цитата(Antokha @ Oct 28 2008, 23:14) *
Необходимо, чтобы функции расположенные в SRAM выполнялись со стабильной скоростью, которая должна быть не менее предварительной определённой. При отладке этих фунций без остального содержимого программы их выполнение по времени было на грани необходимого для нормальной работы.

Можете залочить их в кэше, тогда гарантированно не будут возникать cache-miss'ы.
Go to the top of the page
 
+Quote Post
dch
сообщение Oct 29 2008, 10:57
Сообщение #12


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

Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661



Цитата(aaarrr @ Oct 28 2008, 20:56) *
Вы путаете, SRAM при включенном кэше никуда не денется.

точно? а то я начал уже забывать, недавно у меня клиент не смог из u-boot-а стартонуть програмку из внутренней SRAM. Типа написал програмульку, загрузил ее по xмодему - работает, запустил u-boot загрузил по кермиту или както еще в SRAM, дал командочку go - работает, записал во flash, установил командочку загрузить образ из flashа (тоже в SRAM) - не работает, единственное отличие по моей памяти что перед bootm включался кэш (что ядро стартонуло на максимальной скорости) а перед командой go нет. Симптоматика была такая, впрочем надо посмотреть.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Oct 29 2008, 11:10
Сообщение #13


Гуру
******

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



Кэш на ARM920 это принадлежность ядра, использовать его в качестве обычной памяти невозможно. SRAM висит отдельно. Так что у Вашего клиента проблема в чем-то еще.
Go to the top of the page
 
+Quote Post
zhz
сообщение Oct 29 2008, 11:48
Сообщение #14


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

Группа: Свой
Сообщений: 80
Регистрация: 21-03-05
Пользователь №: 3 559



Цитата(dch @ Oct 29 2008, 12:57) *
точно? а то я начал уже забывать, недавно у меня клиент не смог из u-boot-а стартонуть програмку из внутренней SRAM. Типа написал програмульку, загрузил ее по xмодему - работает, запустил u-boot загрузил по кермиту или както еще в SRAM, дал командочку go - работает, записал во flash, установил командочку загрузить образ из flashа (тоже в SRAM) - не работает, единственное отличие по моей памяти что перед bootm включался кэш (что ядро стартонуло на максимальной скорости) а перед командой go нет. Симптоматика была такая, впрочем надо посмотреть.


Вот и я наступал на эти грабли.
Инвалидить кэш надо при включении в своей программе, чтобы не зависеть от того был включен кеш в bootloader-е или нет.
Go to the top of the page
 
+Quote Post
dch
сообщение Oct 29 2008, 18:08
Сообщение #15


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

Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661



Цитата(zhz @ Oct 29 2008, 14:48) *
Инвалидить кэш

обычно так и делают когда есть к нему прямой доступ, иногда требуемый кусочек кода переписывают туда при включении, но в u-boot не очень много кода связанного с кэшем, потом после ресета он то, наверное, инвалидный.
По идее так должно быть. У клиента симптоматика была следующая, он дает командочку go - работает, потом кнопочкой ресетит и снова дает go он работает - программка во внутренней ram, потом выключением питания ресетит - там уже срабатывает командочка bootm - не работает. Я тормознулся , напряг память как там сделано - вроде перед bootm он включается да и после включения питания он доложен быть сброшенным.

Сообщение отредактировал dch - Oct 29 2008, 18:21
Go to the top of the page
 
+Quote Post
Antokha
сообщение Nov 4 2008, 16:44
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



Всем откликнувшимся огромное спасибо!
ИТОГО: прошивку компилить полность в SDRAM, после её запуска (копирования) romboot-ом первыми командами прошивки скопировать вектора из начала прошивки (находящейся в SDRAM), активировать кеши и далее по программе.

Где почитать по Traslation Table? Полазил по форуму ничего что-то не увидел.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Nov 4 2008, 19:48
Сообщение #17


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Читать тут : http://infocenter.arm.com/help/topic/com.a...920T_TRM1_S.pdf. Раздел 3.3 Address translation.
Go to the top of the page
 
+Quote Post
Antokha
сообщение Nov 5 2008, 18:23
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



Спасибо за ссылку. Согласно ей в регистр TTB нужно записать указатель на блок в памяти размером в 16 кбайт. Этот блок должен содержать необходимые процедуры, которые я хочу кэшировать. Кроме этого необходимо записать 1 в бит I регистра 1 сопроцессора CP15.
Какие либо ещё действия производить нужно?
На работе есть этот pdf-ник, но этот раздел я пропустил, начал читать почему-то с раздела 4. Решил включить кеш инструкций записью 1 в первый регистр сопроцессора сразу в файле cstartup, но так и не понял какой командой это можно осуществить.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 5 2008, 18:39
Сообщение #19


Гуру
******

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



Цитата(Antokha @ Nov 5 2008, 21:23) *
Спасибо за ссылку. Согласно ей в регистр TTB нужно записать указатель на блок в памяти размером в 16 кбайт. Этот блок должен содержать необходимые процедуры, которые я хочу кэшировать.

Этот блок должен содержать таблицу, в которой описывается адресное пространство и типы кэширования.

Цитата(Antokha @ Nov 5 2008, 21:23) *
Кроме этого необходимо записать 1 в бит I регистра 1 сопроцессора CP15.
Какие либо ещё действия производить нужно?

Еще нужно поменять режим тактирования ядра (Synchronous или Asynchronous вместо FastBus), включить DCache и MMU, по желанию включить проверку выравнивания данных.

Цитата(Antokha @ Nov 5 2008, 21:23) *
На работе есть этот pdf-ник, но этот раздел я пропустил, начал читать почему-то с раздела 4. Решил включить кеш инструкций записью 1 в первый регистр сопроцессора сразу в файле cstartup, но так и не понял какой командой это можно осуществить.

Код
        mrc        p15, 0x00, r0, c1, c0, 0x00; read CP15 register 1 into r0
        orr        r0, r0, #(0x01 << 0x0c)    ; enable I Cache
        mcr        p15, 0x00, r0, c1, c0, 0x00; write cp15 register 1

Но одного ICache до обидного мало.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Nov 5 2008, 19:44
Сообщение #20


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



А самое главное, после всего этого at91rm9200, наконец-то заработает на полную мощь!
Go to the top of the page
 
+Quote Post
Antokha
сообщение Nov 5 2008, 19:49
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



Я так думаю, что мне нужен только ICache из-за того, что в моей программе есть две функции, которые я отладил по времени выполнения, при этом они располагаются во внутренней SRAM. Вся программа туда не убирается, приходиться кешировать функции (программа при этои запускается из SDRAM). Эти две функции "читают" с определенной периодичностью состояние вывода и сохраняют его в стек (он расположен также во внутр. SRAM).

Сообщение отредактировал Antokha - Nov 5 2008, 19:54
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Nov 5 2008, 20:11
Сообщение #22


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Я уже говорил, что "вылизывание" времени выполнения функций - это не вариант. Естъ же таймеры. Кто мешает их запрограммировать на нужную частоту и по прерыванию от таймера нужные функции вызывать? Это и будет правильное решение задачи.
Go to the top of the page
 
+Quote Post
Antokha
сообщение Nov 5 2008, 20:53
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



Я их собственно не "вылизывал". Просто написал программу, скорректировал неточности, на которые мне указал компилятор и измерил осциллографом время выполнения. В итоге получил время выполнения, которое равняется предельному максимально допустимому. Поэтому в использовании таймеров я не вижу нечего хорошего. В принципе может быть это и правильный подход. Но из-за не всегда одинакового времени входа в прерывание, могут появиться неточности в моментах считывания состояния пина. Этих неточностей у меня и так достаточно по причинам от меня совершенно независящим, но которые мне в программе необходимо минимизировать. Возможно решить проблему компенсации неточностей возможно установкой частоты тактирования периферии 80 МГц, как многие советуют. Но я не нашел допустимых пределов установки этой частоты. Имеющийся .xsl файлик для вычисления значений коэффициентов PLL, а также других делителей при выставлении такого режима выделяет такую частоту красным цветом, что как я понимаю не есть хорошо. Особенно это может сказаться при дальнейшем серийном производстве и при работе в достаточно широком диапазоне температур.

К aaarrr: Надо вспоминать дескрипторы, так как насчет таблицы, описывающей адресное пространство я ничего не понял. sad.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 6 2008, 06:08
Сообщение #24


Гуру
******

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



Цитата(Antokha @ Nov 5 2008, 22:49) *
Я так думаю, что мне нужен только ICache из-за того, что в моей программе есть две функции, которые я отладил по времени выполнения, при этом они располагаются во внутренней SRAM.
...
Эти две функции "читают" с определенной периодичностью состояние вывода и сохраняют его в стек (он расположен также во внутр. SRAM).

Расскажите поподробнее об этих двух загадочных функциях, а то есть подозрение, что Вы выбрали не лучший способ решения проблемы.

Цитата(Antokha @ Nov 5 2008, 23:53) *
Я их собственно не "вылизывал". Просто написал программу, скорректировал неточности, на которые мне указал компилятор и измерил осциллографом время выполнения. В итоге получил время выполнения, которое равняется предельному максимально допустимому.

А Вы учитывали тот факт, что процессор в режиме FastBus работает на частоте шины?

Цитата(Antokha @ Nov 5 2008, 23:53) *
К aaarrr: Надо вспоминать дескрипторы, так как насчет таблицы, описывающей адресное пространство я ничего не понял. sad.gif

Почитайте документ внимательно. Могу выложить пример инициализации на асме, если это облегчит жизнь.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Nov 6 2008, 06:58
Сообщение #25


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Если сейчас функции работают на пределе необходимой скорости:
1. Выбран не тот процессор.
2. Плохо написаны функции.
3. При правильно инициированных I- и D-cache скорость работы повысится минимум в 3-5 раз.
4. В реально работающей системе скорость работы функции не может быть абсолютно стабильной.
5. Если скорость обработки "впритык", когда же процессор будет делать еще что-то полезное?
Go to the top of the page
 
+Quote Post
Antokha
сообщение Nov 6 2008, 18:52
Сообщение #26


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



\
Цитата(sergeeff @ Nov 6 2008, 09:58) *
Если сейчас функции работают на пределе необходимой скорости:
1. Выбран не тот процессор.
2. Плохо написаны функции.
4. В реально работающей системе скорость работы функции не может быть абсолютно стабильной.
5. Если скорость обработки "впритык", когда же процессор будет делать еще что-то полезное?

На момент отладки я кеши не включал, так как не видел необходимости в этом. Скорость обработки почти "впритык", небольшой запас есть (примерно 1-2 команды NOP. ею я релизую задержки,) хотелось бы иметь запас побольше. Во время выполнения этих двух функций контроллеру разрешается выполнение только их и ничего более.
Насчёт пункта 1 - до этого приложение было реализовано на микроконтроллере SX52 фирмы Scenix, без компенсации вышеописанных неточностей его производительности хватало (по сравнению с at91rm9200 он быстрее работает с выводами - быстрее осуществляется и чтение и установка выводов в нужное состояние). Для компенсации неточностей "оцифруемого' сигнала его производительности не хватало, я решил взять что-то побыстрее.
\
Цитата(sergeeff @ Nov 6 2008, 09:58) *
3. При правильно инициированных I- и D-cache скорость работы повысится минимум в 3-5 раз.

Это окрыляет, надеюсь когда я их таки включу так и будет.

Цитата(aaarrr @ Nov 6 2008, 09:08) *
А Вы учитывали тот факт, что процессор в режиме FastBus работает на частоте шины?

Нет не знал, какая имеется в виду частота шины? PCK идущая с выхода PLLA, у меня 179,... МГц, точно не помню.
Цитата(aaarrr @ Nov 6 2008, 09:08) *
Почитайте документ внимательно. Могу выложить пример инициализации на асме, если это облегчит жизнь.

Собственно я не разобрался в следующем:
- что представляют собой ячейки таблицы (я так понял что вроде бы это части абсолютных адресов),
- мне нужно выполнять эти две функции со скоростью не менее чем при отладке во внутренней SRAM с PCK = 179,... МГц.
А насчёт примера это бы очень помогло, если не сильно это вас затруднит.

Сообщение отредактировал Antokha - Nov 6 2008, 19:44
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 6 2008, 19:57
Сообщение #27


Гуру
******

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



Цитата(Antokha @ Nov 6 2008, 21:52) *
Насчёт пункта 1 - до этого приложение было реализовано на микроконтроллере SX52 фирмы Scenix, без компенсации вышеописанных неточностей его производительности хватало (по сравнению с at91rm9200 он быстрее работает с выводами - быстрее осуществляется и чтение и установка выводов в нужное состояние). Для компенсации неточностей "оцифруемого' сигнала его производительности не хватало, я решил взять что-то побыстрее.

AT91RM9200 и другие подобные контроллеры принципиально не подходят для решения таких задач. Используйте программируемую логику, если нужно получить жесткие времянки.

Цитата(Antokha @ Nov 6 2008, 21:52) *
Нет не знал, какая частота шины? PCK идущая с выхода PLLA (у меня 179,... МГц)

Это Master Clock (MCK), обычно PCK/2. PCK без дополнительных телодвижений процессором использоваться не будет.

Цитата(Antokha @ Nov 6 2008, 21:52) *
- что представляют собой ячейки таблицы (я так понял что вроде бы это части абсолютных адресов),

Объяснять "на пальцах" будет долго. Лучше найдите время изучить документацию.

Цитата(Antokha @ Nov 6 2008, 21:52) *
А насчёт примера это бы очень помогло, если не сильно это вас затруднит.

Пожалуйста:
CODE

; ***************************************************************************
; *

ttb_first_level EQU 0xc03fc000


; ***************************************************************************
; * Cache and MMU Configuration

[ {TRUE}
ldr r0, =ttb_first_level ; set start of Translation Table base (16k Boundary)
mcr p15, 0x00, r0, c2, c0, 0x00 ; write to CP15 register 2
;
; Create translation table for flat mapping
; Top 12 bits of VA is pointer into table
; Create 4096 entries from 000xxxxx to fffxxxxx
;
mov r1, #0x00 ; loop counter
ldr r2, =2_110111110010 ; set access permissions (AP) for full access SVC/USR (11:10)
; set for domain 15 (8:5)
; must be 1 (4)
; set non cachable non bufferable (CB) (3:2)
; set for 1Mb section (1:0)
init_ttb0
orr r3, r2, r1, lsl #0x14
ldr r4, =sections
init_ttb1
ldr r5, [r4], #0x04
tst r5, #0x01
bne init_ttb2
cmp r1, r5, lsr #0x14
addlo r4, r4, #0x08
blo init_ttb1
ldr r5, [r4], #0x04
cmp r1, r5, lsr #0x14
addhs r4, r4, #0x04
bhs init_ttb1
ldr r5, [r4]
orr r3, r3, r5
init_ttb2
str r3, [r0, r1, lsl #0x02]
add r1, r1, #0x01
cmp r1, #0x1000
blo init_ttb0
;
; Init domains
;
mov r0, #(2_01 << 0x1e) ; must define behaviour for domain 15 (31:30), set client
mcr p15, 0x00, r0, c3, c0, 0x00 ; write to CP15 register 5
;
; Set global core configurations
;
mrc p15, 0x00, r0, c1, c0, 0x00 ; read CP15 register 1 into r0

orr r0, r0, #(0x01 << 0x0c) ; enable I Cache
orr r0, r0, #(0x01 << 0x02) ; enable D Cache
orr r0, r0, #(2_11 << 0x1e) ; enable asynchronous clocking mode
orr r0, r0, #0x01 ; enable MMU
;
; Additional configuration options
;
; orr r0, r0, #(0x01 << 0x0e) ; enable Round Robin cache replacement
; orr r0, r0, #(0x01 << 0x0d) ; enable Hi Vectors
orr r0, r0, #(0x01 << 0x01) ; enable data address alignment checking

mcr p15, 0x00, r0, c1, c0, 0x00 ; write cp15 register 1
]

; ***************************************************************************
; *

sections
DCD 0x00000000 ; Flash
DCD 0x00100000
DCD 2_1100 ; wb, buffered

DCD 0xc0000000 ; SDRAM Page 0
DCD 0xc0400000
DCD 2_1100 ; wb, buffered

DCD 0xc4000000 ; SDRAM Page 1
DCD 0xc4400000
DCD 2_0100 ; noncached, buffered

DCD 0xc8000000 ; SDRAM Page 2
DCD 0xc8400000
DCD 2_0100 ; noncached, buffered
; DCD 2_1100 ; wb, buffered

DCD 0xcc000000 ; SDRAM Page 3
DCD 0xcc400000
DCD 2_1100 ; wb, buffered

DCD 0x00000001 ; END

; ***************************************************************************
; *

END

Адреса только переделайте под свою систему.
Go to the top of the page
 
+Quote Post
Antokha
сообщение Nov 7 2008, 14:21
Сообщение #28


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



Огромное спасибо за пример.
Go to the top of the page
 
+Quote Post
dch
сообщение Nov 7 2008, 15:56
Сообщение #29


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

Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661



Вы случайно не внешнее ацп подвесили на этот чудный девайс

Сообщение отредактировал dch - Nov 7 2008, 15:58
Go to the top of the page
 
+Quote Post
Antokha
сообщение Nov 7 2008, 16:35
Сообщение #30


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



Цитата(dch @ Nov 7 2008, 18:56) *
Вы случайно не внешнее ацп подвесили на этот чудный девайс

Нет, Я просто так выразился 'оцифровка", на самом деле читается только состояние пина и не более того.
Go to the top of the page
 
+Quote Post
dch
сообщение Nov 7 2008, 16:44
Сообщение #31


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

Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661



а с каким темпом
Go to the top of the page
 
+Quote Post
Antokha
сообщение Nov 7 2008, 18:58
Сообщение #32


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



Цитата(dch @ Nov 7 2008, 19:44) *
а с каким темпом

Для компенсации вышеописанных неточностей с периодом 100 нс.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 7 2008, 19:19
Сообщение #33


Гуру
******

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



Разгон процессора может не привести к существенному ускорению опроса пина, т.к. GPIO висит на медленной APB (два такта MCK на доступ).

Еще раз замечу, что такой подход к решению задачи в корне неверен.
Go to the top of the page
 
+Quote Post
Antokha
сообщение Nov 7 2008, 19:47
Сообщение #34


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



Цитата(aaarrr @ Nov 7 2008, 22:19) *
Еще раз замечу, что такой подход к решению задачи в корне неверен.

Я алгоритм обработки (оцифровки) сигнала сейчас изменять не могу - попросту не успею (проект надо сдать 21 ноября). Плюс ко всему этот алгоритм обсчитывали статисты, так что сложностей навал cranky.gif . Реализую то, что начальство сказало. maniac.gif
Go to the top of the page
 
+Quote Post
dch
сообщение Nov 9 2008, 19:26
Сообщение #35


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

Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661



там вроде ножкой невозможно щелкать быстрее чем 5MHz , 100 наносекунд это близко к локаторной дискретизации
Go to the top of the page
 
+Quote Post
Antokha
сообщение Nov 9 2008, 21:29
Сообщение #36


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



Цитата(dch @ Nov 9 2008, 22:26) *
там вроде ножкой невозможно щелкать быстрее чем 5MHz , 100 наносекунд это близко к локаторной дискретизации

100 нс получалось ( точно не помню с какими настройками PLL, но с режимом тактирования ядра synchronous)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 10 2008, 06:17
Сообщение #37


Гуру
******

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



Цитата(dch @ Nov 9 2008, 22:26) *
там вроде ножкой невозможно щелкать быстрее чем 5MHz , 100 наносекунд это близко к локаторной дискретизации

Щелкать на 5MHz примерно то же самое, что считывать на 10MHz smile.gif

Только вот по моим прикидкам должно получаться быстрее. Впрочем, это уже от программы зависит.
Go to the top of the page
 
+Quote Post
dch
сообщение Nov 10 2008, 12:47
Сообщение #38


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

Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661



обычно ножки опрашиваются на какойто частоте независимой от pclk и состояние их заносится в соответсвующий регистр, поэтому практически всегда то что вы считали уже не соответсвует действительности
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 10 2008, 12:58
Сообщение #39


Гуру
******

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



Состояние выводов должно обновляется с частотой MCK (впрочем, может и с MCK/2).
Go to the top of the page
 
+Quote Post
Antokha
сообщение Nov 10 2008, 17:36
Сообщение #40


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



To aaarrr:
По поводу кеширования: 1) адреса в разделе sections - это и есть описание адресного пространства (необходимого программе, т.е. фактически ею занимаемого)?
2) MMU в данном случае будет кешировать на автомате всё, что будет запускаться из main() до того момента, когда не придет команда lock ICache?

Сообщение отредактировал Antokha - Nov 10 2008, 18:01
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 10 2008, 19:50
Сообщение #41


Гуру
******

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



Цитата(Antokha @ Nov 10 2008, 20:36) *
To aaarrr:
По поводу кеширования: 1) адреса в разделе sections - это и есть описание адресного пространства (необходимого программе, т.е. фактически ею занимаемого)?
2) MMU в данном случае будет кешировать на автомате всё, что будет запускаться из main() до того момента, когда не придет команда lock ICache?

1. Да. В первом слове хранится адрес начала раздела, во втором - адрес окончания + 1, в третьем - тип кэширования. Всей остальной памяти присваиваются атрибуты noncachable nonbufferable.
2. Да, всё.
Go to the top of the page
 
+Quote Post
Antokha
сообщение Nov 11 2008, 19:45
Сообщение #42


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



To aaarrr: Спасибо огромное.
В самом начале кода есть строки:
ldr r2, =2_110111110010 ; set access permissions (AP) for full access SVC/USR (11:10)
Это загрузка константы записанной по адресу 110111110010 (0xDF2) или здесь должна быть сама константа. Вопрос возник потому, что в первом случае странно хранить константу в памяти, если она используется один раз, кроме, конечно, варианта с наиболее быстрым исполнением этого кода.
Go to the top of the page
 
+Quote Post
dch
сообщение Nov 12 2008, 02:00
Сообщение #43


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

Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661



Цитата(Antokha @ Nov 10 2008, 20:36) *
2) MMU в данном случае будет кешировать на автомате всё, что будет запускаться из main() до

если только выталкивания не призойдет
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 12 2008, 06:51
Сообщение #44


Гуру
******

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



Цитата(Antokha @ Nov 11 2008, 22:45) *
В самом начале кода есть строки:
ldr r2, =2_110111110010 ; set access permissions (AP) for full access SVC/USR (11:10)
Это загрузка константы записанной по адресу 110111110010 (0xDF2) или здесь должна быть сама константа.

Это псевдооператор для загрузки длинной константы. Ассемблером трансформируется в инструкцию ldr r2, [PC, #N], по адресу PC+N+8 записана сама константа 0xDF2.
Go to the top of the page
 
+Quote Post
Antokha
сообщение Nov 12 2008, 13:00
Сообщение #45


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



To aaarrr: Подправил адреса секций и оформил этот код функцией:
; Set global core configurations
mrc p15, 0x00, r0, c1, c0, 0x00 ; read CP15 register 1 into r0
orr r0, r0, #(0x01 << 0x0c) ; enable I Cache
orr r0, r0, #(0x01 << 0x02) ; enable D Cache
orr r0, r0, #(0x3 << 0x1e) ; enable asynchronous clocking mode
orr r0, r0, #0x01 ; enable MMU
; Additional configuration options
;
; orr r0, r0, #(0x01 << 0x0e) ; enable Round Robin cache replacement
; orr r0, r0, #(0x01 << 0x0d) ; enable Hi Vectors
orr r0, r0, #(0x01 << 0x01) ; enable data address alignment checking
mcr p15, 0x00, r0, c1, c0, 0x00 ; write cp15 register 1 <-------------------------------------
POP {LR}
POP {R7}
POP {R6}
POP {R5}
POP {R4}
POP {R3}
POP {R2}
POP {R1}
POP {R0}

BX LR ;; return
sections // 1
DCD 0x21F00800 ; _SDRAM_READ_ Section 00000000; Flash
DCD 0x21F03FFF ; 00100000
DCD 0xC ; 2_1100 ; wb, buffered
// c03fc000
DCD 0x21F04000 ; c0000000 ; SDRAM Page 0 - _SDRAM_WRITE_ Section
DCD 0x21F04FFF ; c0400000
DCD 0xC ; 2_1100 ; wb, buffered
END

На команде обозначенной стрелкой виснет наглухо. В секции _SDRAM_READ_ размещен участок кода, помеченный в файле *.icf {readonly}, в секции _SDRAM_WRITE_ - соответственно {readwrite}. Почему так? Что я делаю неправильно?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 12 2008, 14:07
Сообщение #46


Гуру
******

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



Цитата(Antokha @ Nov 12 2008, 16:00) *
Что я делаю неправильно?


Цитата(Antokha @ Nov 12 2008, 16:00) *
sections // 1
DCD 0x21F00800 ; _SDRAM_READ_ Section 00000000; Flash
DCD 0x21F03FFF ; 00100000
DCD 0xC ; 2_1100 ; wb, buffered
// c03fc000
DCD 0x21F04000 ; c0000000 ; SDRAM Page 0 - _SDRAM_WRITE_ Section
DCD 0x21F04FFF ; c0400000
DCD 0xC ; 2_1100 ; wb, buffered

Здесь выброшен маркер конца таблицы (DCD 0x01), что у Вас в TT оказалось - неизвестно.

Цитата(Antokha @ Nov 12 2008, 16:00) *
POP {LR}
POP {R7}
POP {R6}
POP {R5}
POP {R4}
POP {R3}
POP {R2}
POP {R1}
POP {R0}

Лучше грузить на стек и выгружать регистры скопом, а не по одному.
Go to the top of the page
 
+Quote Post
DamienRice
сообщение Nov 12 2008, 14:50
Сообщение #47





Группа: Новичок
Сообщений: 1
Регистрация: 13-05-08
Пользователь №: 37 480



Привет. На сколько я помню я делал отдельный сегмент кода в внутреней памяти, потом писал к функции приставку - разместить код туда.
Go to the top of the page
 
+Quote Post
Antokha
сообщение Nov 12 2008, 20:15
Сообщение #48


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



Цитата(DamienRice @ Nov 12 2008, 17:50) *
Привет. На сколько я помню я делал отдельный сегмент кода в внутреней памяти, потом писал к функции приставку - разместить код туда.

Я уже тоже думаю сделать примерно также. Но вариант с кэшем надо проработать до логического завершенния.
Go to the top of the page
 
+Quote Post
Antokha
сообщение Nov 12 2008, 21:46
Сообщение #49


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



Цитата(aaarrr @ Nov 12 2008, 17:07) *
Здесь выброшен маркер конца таблицы (DCD 0x01), что у Вас в TT оказалось - неизвестно.

Другими словами, описания начала и конца сегментов, содержащих весь код программы и лежащих до маркера, недостаточно?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 13 2008, 07:03
Сообщение #50


Гуру
******

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



Должно быть:
Цитата
sections // 1
DCD 0x21F00000
DCD 0x21F10000
DCD 0xC ; 2_1100 ; wb, buffered
DCD 0x01

Размер секции должен быть кратен 1Мбайт. Имеет смысл кэшировать всю SDRAM, внутреннюю SRAM и флеш.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Nov 13 2008, 16:13
Сообщение #51


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(aaarrr @ Nov 13 2008, 11:03) *
Должно быть:

Размер секции должен быть кратен 1Мбайт. Имеет смысл кэшировать всю SDRAM, внутреннюю SRAM и флеш.


Есть несколько но:

1. Если кешировать флэш, то из программы ничего в нее не запишешь без ухищрений.
2. Если используется DMA, то ее буфера проще организовать в некешируемой области.

Таким образом, надо подумать над тем, везде ли включать кеш.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 13 2008, 17:33
Сообщение #52


Гуру
******

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



Цитата(sergeeff @ Nov 13 2008, 19:13) *
1. Если кешировать флэш, то из программы ничего в нее не запишешь без ухищрений.

Ну, это особый случай, а все "ухищрения" сводятся к отключению кэша на время записи.

Цитата(sergeeff @ Nov 13 2008, 19:13) *
2. Если используется DMA, то ее буфера проще организовать в некешируемой области.

...а если DMA работает только на вывод, то имеет смысл использовать write-through.

Цитата(sergeeff @ Nov 13 2008, 19:13) *
Таким образом, надо подумать над тем, везде ли включать кеш.

Да, думать нужно всегда smile.gif
Go to the top of the page
 
+Quote Post

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

 


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


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