|
|
  |
AT91RM9200 - разбиение кода на быструю и медленную части, SDRAM и внутренняя SRAM |
|
|
|
Nov 4 2008, 16:44
|
Участник

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

|
Всем откликнувшимся огромное спасибо! ИТОГО: прошивку компилить полность в SDRAM, после её запуска (копирования) romboot-ом первыми командами прошивки скопировать вектора из начала прошивки (находящейся в SDRAM), активировать кеши и далее по программе.
Где почитать по Traslation Table? Полазил по форуму ничего что-то не увидел.
|
|
|
|
|
Nov 5 2008, 18:23
|
Участник

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

|
Спасибо за ссылку. Согласно ей в регистр TTB нужно записать указатель на блок в памяти размером в 16 кбайт. Этот блок должен содержать необходимые процедуры, которые я хочу кэшировать. Кроме этого необходимо записать 1 в бит I регистра 1 сопроцессора CP15. Какие либо ещё действия производить нужно? На работе есть этот pdf-ник, но этот раздел я пропустил, начал читать почему-то с раздела 4. Решил включить кеш инструкций записью 1 в первый регистр сопроцессора сразу в файле cstartup, но так и не понял какой командой это можно осуществить.
|
|
|
|
|
Nov 5 2008, 18:39
|
Гуру
     
Группа: Свой
Сообщений: 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 до обидного мало.
|
|
|
|
|
Nov 5 2008, 19:49
|
Участник

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

|
Я так думаю, что мне нужен только ICache из-за того, что в моей программе есть две функции, которые я отладил по времени выполнения, при этом они располагаются во внутренней SRAM. Вся программа туда не убирается, приходиться кешировать функции (программа при этои запускается из SDRAM). Эти две функции "читают" с определенной периодичностью состояние вывода и сохраняют его в стек (он расположен также во внутр. SRAM).
Сообщение отредактировал Antokha - Nov 5 2008, 19:54
|
|
|
|
|
Nov 5 2008, 20:53
|
Участник

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

|
Я их собственно не "вылизывал". Просто написал программу, скорректировал неточности, на которые мне указал компилятор и измерил осциллографом время выполнения. В итоге получил время выполнения, которое равняется предельному максимально допустимому. Поэтому в использовании таймеров я не вижу нечего хорошего. В принципе может быть это и правильный подход. Но из-за не всегда одинакового времени входа в прерывание, могут появиться неточности в моментах считывания состояния пина. Этих неточностей у меня и так достаточно по причинам от меня совершенно независящим, но которые мне в программе необходимо минимизировать. Возможно решить проблему компенсации неточностей возможно установкой частоты тактирования периферии 80 МГц, как многие советуют. Но я не нашел допустимых пределов установки этой частоты. Имеющийся .xsl файлик для вычисления значений коэффициентов PLL, а также других делителей при выставлении такого режима выделяет такую частоту красным цветом, что как я понимаю не есть хорошо. Особенно это может сказаться при дальнейшем серийном производстве и при работе в достаточно широком диапазоне температур. К aaarrr: Надо вспоминать дескрипторы, так как насчет таблицы, описывающей адресное пространство я ничего не понял.
|
|
|
|
|
Nov 6 2008, 06:08
|
Гуру
     
Группа: Свой
Сообщений: 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: Надо вспоминать дескрипторы, так как насчет таблицы, описывающей адресное пространство я ничего не понял.  Почитайте документ внимательно. Могу выложить пример инициализации на асме, если это облегчит жизнь.
|
|
|
|
|
Nov 6 2008, 18:52
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Nov 6 2008, 19:57
|
Гуру
     
Группа: Свой
Сообщений: 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
Адреса только переделайте под свою систему.
|
|
|
|
|
Nov 7 2008, 14:21
|
Участник

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

|
Огромное спасибо за пример.
|
|
|
|
|
Nov 7 2008, 16:35
|
Участник

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

|
Цитата(dch @ Nov 7 2008, 18:56)  Вы случайно не внешнее ацп подвесили на этот чудный девайс Нет, Я просто так выразился 'оцифровка", на самом деле читается только состояние пина и не более того.
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|