Перейти к содержанию
    

ARM cortex A9 и L2

Здравствуйте! У меня приложение без ОС с линейной памятью. Для максимальной производительности нужен L2 кэш. Я столкнулся с проблемой, что не могу корректно включить L2. При запуске (enable_all_caches в приложенном файле) меня выкидывает, похоже, из привилегированного режима (PL1 как я понял). И я не могу выполнить MRC /MCR инструкции - выкидывает в прерывание Undefined handler. И код ошибки я не могу считать по той-же причине.

И еще - может у кого-нибудь есть пример простого загрузчика из nand ? 

Все что находится - сложновато а с u-boot вообще связываться не хочется.

arm_cache.S

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, viterra сказал:

что не могу корректно включить L2

Это тот, что PL310 от АРМ?

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

armv7_cache.c

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 minutes ago, mantech said:

Это тот, что PL310 от АРМ?

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

armv7_cache.c 52.35 kB · 1 download

 

Спасибо за ответ. Да, PL310. Этот код может и включает L2 но не правильно. Без MMU оно работать на полную не будет. Во всех доках так написано. Да и по факту так.

В приложенном коде создается виртуалка 1 в 1 с реальной. Как будто виртуальной вообще нет. Но как бы я не крутил настройки - я теряю возможность доступа к ядру но скорость реально вырастает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

24 минуты назад, viterra сказал:

Без MMU оно работать на полную не будет.

Ну дак это понятно, перед включением кэша 1 и 2 нужно обязательно включить ММУ и настроить регионы...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, mantech said:

Ну дак это понятно, перед включением кэша 1 и 2 нужно обязательно включить ММУ и настроить регионы...

Так главный вопрос - где я лажаю T_T... Побитово все настройки проверил.. Но может что-то не сделал/забыл/не так понимаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, viterra сказал:

Так главный вопрос - где я лажаю T_T...

ММУ можно проверить так, если после размещения регионов в таблицу и его включения не виснет, проверить, работает ли L1 кэш, если после его включения тоже все норм и скорость программы повысилась на порядок, значит и L2 будет работать нормально, ну а если в первых пунктах косяк - то с ними и надо разбираться в первую очередь...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Создаете таблицу трансляции - у регионов относящихчся к ОЗУ - ставьте биты "кешируем и wirte-allocation"

 

Посмотрите кусок из моего проекта - с функции SystemInit начиная (зачем для включение кеша потребовался ассемблер?)

https://github.com/ua1arn/hftrx/blob/ed59bc3d1485f1e0c5017a64a69b2ce710507044/src/hardware.c#L3687

ttb_1MB_accessbits - тут смотрим к чему относится адрес памяти и выбираем нужные атрибуты страницы.

Вопрос - что за процессор, сколько ядер задействовано

 

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/4/2023 at 10:30 AM, GenaSPB said:

Вопрос - что за процессор, сколько ядер задействовано

1892ВМ14Я. 2 АРМ + 2 ДСП. Пока использую только одно ядро. Второе хочу на обработку прерываний некоторых повесить.

On 3/3/2023 at 2:09 PM, mantech said:

ММУ можно проверить так, если после размещения регионов в таблицу и его включения не виснет, проверить, работает ли L1 кэш, если после его включения тоже все норм и скорость программы повысилась на порядок, значит и L2 будет работать нормально, ну а если в первых пунктах косяк - то с ними и надо разбираться в первую очередь...

В том то и дело, что все нормально ровно до момента включения L2

enable_caches:
    MRC     p15, 0, r0, c1, c0, 0      @ Read System Control Register
    ORR     r0, r0, #(0x1 << 12)       @ Set I bit 12 to enable I Cache
    ORR     r0, r0, #(0x1 << 2)        @ Set C bit  2 to enable D Cache
    ORR     r0, r0, #(0x1 << 11)       @ Set Z bit 11 to enable branch prediction
    MCR     p15, 0, r0, c1, c0, 0      @ Write System Control Register

@ enable L2 cache
    LDR     r0, =L2CC_PL310
    LDR     r1, =0x1
    STR     r1, [r0,#0x100]
Если закомментарить последние 3 строки - то все ok. mmu при этом должен быть включен:

    MRC     p15, 0, r0, c1, c0, 0      @ Read CP15 System Control register
    BIC     r0, r0, #(0x1 << 12)       @ Clear I bit 12 to disable I Cache
    BIC     r0, r0, #(0x1 <<  2)       @ Clear C bit  2 to disable D Cache
    BIC     r0, r0, #0x2               @ Clear A bit  1 to disable strict alignment fault checking
    ORR     r0, r0, #0x1               @ Set M bit 0 to enable MMU before scatter loading
    MCR     p15, 0, r0, c1, c0, 0      @ Write CP15 System Control register
 

Изменено пользователем viterra

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 часов назад, viterra сказал:

В том то и дело, что все нормально ровно до момента включения L2

А L1 точно включается? В смысле, быстродействие должно раз в 10 подскочить, если не меняется, то L1 не работает, поэтому и не виснет до L2. Сколь помню, при неправильной настройке MMU, L1 у меня работал неправильно...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 hours ago, GenaSPB said:

TTB на этот момент загружен?

Да. Таблица сгенирирована и находится во внутренней памяти устройства.

 

9 hours ago, mantech said:

А L1 точно включается?

Скорость я конечно не замерял, но программа работает заметно более шустро.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, viterra said:

Да. Таблица сгенирирована и находится во внутренней памяти устройства.

Я намекаю что интерпретировать те magic numbers в вашем исходнике с целью выяснить правильно ли они сделаны трудно. втоое - вы не делаете различия в том какая память - периферия или ОЗУ - и заполняене все одинаковыми значениями....
В личку писал - мы в одном городе - можно денёк посидеть совместно - я бы попробовал свой загрузчик нна Вашем железе поднять...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, GenaSPB said:

Я намекаю что интерпретировать те magic numbers в вашем исходнике с целью выяснить правильно ли они сделаны трудно. втоое - вы не делаете различия в том какая память - периферия или ОЗУ - и заполняене все одинаковыми значениями....
В личку писал - мы в одном городе - можно денёк посидеть совместно - я бы попробовал свой загрузчик нна Вашем железе поднять...

Различие при генерации таблиц есть:

Для внутренней памяти используется код 0x00002c02    @ non-shareable device memory

Для остальной (DDR3) 0x00007c0e    @ outer and inner write-back, no write-allocate

Граница проходит по 0x400 странице т.е. с адреса 0x40000000 начинается оперативка.

 31                         20 19 18  17  16 15   14   12 11 10 9   8     5       4    3  2   1 0 
|section base address| 0  0  |nG| S |AP2|  TEX  |  AP | P | Domain | XN | C B | 1 0|
                                                                                    
Bits[31:20]   - Top 12 bits of VA is pointer into table                             
nG[17]=0      - Non global, enables matching against ASID in the TLB when set.      
S[16]=0       - Indicates normal memory is shared when set.                         
AP2[15]=0                                                                           
AP[11:10]=11  - Configure for full read/write access in all modes                   
TEX[14:12]=                                                                         
CB[3:2]=                                                                            
                                                                                    
IMPP[9]=0     - Ignored                                                             
Domain[5:8]=0 - Set all pages to use domain 0                                       
XN[4]=0       - Execute never disabled                                              
Bits[1:0]=10  - Indicate entry is a 1MB section                                     
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/3/2023 at 9:47 AM, viterra said:

arm_cache.S 30.84 kB · 4 downloads

Посмотрел внимательнее... DACR у вас пишется 0xFFFFFFFF - все domains это Managers - но почему-то у меня выбрано в таблице 15 0 - у Вас код DOMAIN 0 - но возможно это не важно...

Кажется для системы где всё можно, выбор не особо важен.

Проверил - не влияет.

 

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 06.03.2023 в 07:37, viterra сказал:

1892ВМ14Я. 2 АРМ + 2 ДСП. Пока использую только одно ядро. Второе хочу на обработку прерываний некоторых повесить.

В том то и дело, что все нормально ровно до момента включения L2

Здравствуйте! Удалось ли победить кэш?
Столкнулся с аналогичной проблемой на таком же процессоре (процессор на отладочной плате производителя): настраиваю и включаю ММУ, включаю кэш L1, затем пытаюсь включить кэш L2 и все виснет! Кэш L1 точно включается - ускорение расчетов примерно в 13 раз, чем без него. ММУ настраивается, ну предполагаю, правильно - после его включения программа продолжает работать. Включtние кэша L2 все убивает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...