viterra 0 3 марта, 2023 Опубликовано 3 марта, 2023 · Жалоба Здравствуйте! У меня приложение без ОС с линейной памятью. Для максимальной производительности нужен L2 кэш. Я столкнулся с проблемой, что не могу корректно включить L2. При запуске (enable_all_caches в приложенном файле) меня выкидывает, похоже, из привилегированного режима (PL1 как я понял). И я не могу выполнить MRC /MCR инструкции - выкидывает в прерывание Undefined handler. И код ошибки я не могу считать по той-же причине. И еще - может у кого-нибудь есть пример простого загрузчика из nand ? Все что находится - сложновато а с u-boot вообще связываться не хочется. arm_cache.S Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 3 марта, 2023 Опубликовано 3 марта, 2023 (изменено) · Жалоба 15 минут назад, viterra сказал: что не могу корректно включить L2 Это тот, что PL310 от АРМ? Это рабочий исходник из старого проекта, но не ждите от этого кэша большого увеличения производительности, там уже шина и частота раза в 4 ниже проца... armv7_cache.c Изменено 3 марта, 2023 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viterra 0 3 марта, 2023 Опубликовано 3 марта, 2023 · Жалоба 30 minutes ago, mantech said: Это тот, что PL310 от АРМ? Это рабочий исходник из старого проекта, но не ждите от этого кэша большого увеличения производительности, там уже шина и частота раза в 4 ниже проца... armv7_cache.c 52.35 kB · 1 download Спасибо за ответ. Да, PL310. Этот код может и включает L2 но не правильно. Без MMU оно работать на полную не будет. Во всех доках так написано. Да и по факту так. В приложенном коде создается виртуалка 1 в 1 с реальной. Как будто виртуальной вообще нет. Но как бы я не крутил настройки - я теряю возможность доступа к ядру но скорость реально вырастает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 3 марта, 2023 Опубликовано 3 марта, 2023 · Жалоба 24 минуты назад, viterra сказал: Без MMU оно работать на полную не будет. Ну дак это понятно, перед включением кэша 1 и 2 нужно обязательно включить ММУ и настроить регионы... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viterra 0 3 марта, 2023 Опубликовано 3 марта, 2023 · Жалоба 7 minutes ago, mantech said: Ну дак это понятно, перед включением кэша 1 и 2 нужно обязательно включить ММУ и настроить регионы... Так главный вопрос - где я лажаю T_T... Побитово все настройки проверил.. Но может что-то не сделал/забыл/не так понимаю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 3 марта, 2023 Опубликовано 3 марта, 2023 · Жалоба 2 часа назад, viterra сказал: Так главный вопрос - где я лажаю T_T... ММУ можно проверить так, если после размещения регионов в таблицу и его включения не виснет, проверить, работает ли L1 кэш, если после его включения тоже все норм и скорость программы повысилась на порядок, значит и L2 будет работать нормально, ну а если в первых пунктах косяк - то с ними и надо разбираться в первую очередь... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 4 марта, 2023 Опубликовано 4 марта, 2023 (изменено) · Жалоба Создаете таблицу трансляции - у регионов относящихчся к ОЗУ - ставьте биты "кешируем и wirte-allocation" Посмотрите кусок из моего проекта - с функции SystemInit начиная (зачем для включение кеша потребовался ассемблер?) https://github.com/ua1arn/hftrx/blob/ed59bc3d1485f1e0c5017a64a69b2ce710507044/src/hardware.c#L3687 ttb_1MB_accessbits - тут смотрим к чему относится адрес памяти и выбираем нужные атрибуты страницы. Вопрос - что за процессор, сколько ядер задействовано Изменено 4 марта, 2023 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viterra 0 6 марта, 2023 Опубликовано 6 марта, 2023 (изменено) · Жалоба 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 Изменено 6 марта, 2023 пользователем viterra Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 6 марта, 2023 Опубликовано 6 марта, 2023 · Жалоба TTB на этот момент загружен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 6 марта, 2023 Опубликовано 6 марта, 2023 · Жалоба 15 часов назад, viterra сказал: В том то и дело, что все нормально ровно до момента включения L2 А L1 точно включается? В смысле, быстродействие должно раз в 10 подскочить, если не меняется, то L1 не работает, поэтому и не виснет до L2. Сколь помню, при неправильной настройке MMU, L1 у меня работал неправильно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viterra 0 7 марта, 2023 Опубликовано 7 марта, 2023 · Жалоба 21 hours ago, GenaSPB said: TTB на этот момент загружен? Да. Таблица сгенирирована и находится во внутренней памяти устройства. 9 hours ago, mantech said: А L1 точно включается? Скорость я конечно не замерял, но программа работает заметно более шустро. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 7 марта, 2023 Опубликовано 7 марта, 2023 · Жалоба 1 hour ago, viterra said: Да. Таблица сгенирирована и находится во внутренней памяти устройства. Я намекаю что интерпретировать те magic numbers в вашем исходнике с целью выяснить правильно ли они сделаны трудно. втоое - вы не делаете различия в том какая память - периферия или ОЗУ - и заполняене все одинаковыми значениями.... В личку писал - мы в одном городе - можно денёк посидеть совместно - я бы попробовал свой загрузчик нна Вашем железе поднять... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viterra 0 7 марта, 2023 Опубликовано 7 марта, 2023 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 7 марта, 2023 Опубликовано 7 марта, 2023 (изменено) · Жалоба 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 - но возможно это не важно... Кажется для системы где всё можно, выбор не особо важен. Проверил - не влияет. Изменено 7 марта, 2023 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKi 0 13 марта Опубликовано 13 марта · Жалоба В 06.03.2023 в 07:37, viterra сказал: 1892ВМ14Я. 2 АРМ + 2 ДСП. Пока использую только одно ядро. Второе хочу на обработку прерываний некоторых повесить. В том то и дело, что все нормально ровно до момента включения L2 Здравствуйте! Удалось ли победить кэш? Столкнулся с аналогичной проблемой на таком же процессоре (процессор на отладочной плате производителя): настраиваю и включаю ММУ, включаю кэш L1, затем пытаюсь включить кэш L2 и все виснет! Кэш L1 точно включается - ускорение расчетов примерно в 13 раз, чем без него. ММУ настраивается, ну предполагаю, правильно - после его включения программа продолжает работать. Включtние кэша L2 все убивает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться