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

ADSP-BF561 и обмен данными между ядрами при включенном кеше данных

Добрый день всем! Имеем систему на ADSP-BF561. Для обмена данными используется кусочек L2.

Ядро А вызывает прерывание ядра В, делает рефреш видео, и устанавливает бит в памяти L2.

Ядро В ждет установки бита в памяти L2, сбрасывает его и после этого выходит из прерывания.

Без включенного кеша данных все, понятное дело, работает.

С включенным кешом (write-back) ядро В выходит из прерывания гораздо раньше.

Для синхронизации L2 и кеша использую функции flush_data_buffer

Но как я понимаю, мне нужно просто инвалидировать кеш, без перезаписи в L2.

Кто и как это делает? Я так понял ,что есть 2 способа, но один неприемлем в принципе, а метод очистки бита dirty в tag выбрасывает всю строку, а мне нужно только один байт

Как-то не совсем понятен механизм обмена между двумя ядрами с включенным кешом.

Можно сделать L2 не кешируемой, но не хотелось бы. Задать часть L2 кешируемой, а часть нет, так таблицы не хватит, а динамически корректировать таблицу распределения и защиты памяти

это уже монстрообразно. Использовать не кешируемый SDRAM исключено. DMA L1A-> L1B и наоборот тоже как-то через одно место

Подскажите как кто делал синхронизацию ядер и обмен между ними, а то как-то совсем грустно.

На всякий случай код

 

ядро А

 

*pSICB_SYSCR = (1<<7) | 0x20; // вызываем прерывание

ssync();

 

...........

...........

 

 

..........

shared_memory.sync_cores.video_busy=1; //устанавливаем бит

flush_data_buffer((void*)&shared_memory.sync_cores.video_busy, (void*)&shared_memory.sync_cores.video_busy, 0); //сливаем кеш в L2

 

 

ядро В

 

_Pragma("interrupt_reentrant") section("L1_code") void core_a_int(int _r0x, int _r1x, int _r2x)

{

*pFIO0_FLAG_C = (1<<6);

 

*pSICB_SYSCR = (15<<10) | 0x20; //сбрасываем прерывание, на всякий случай все :)

ssync();

 

 

while(shared_memory.sync_cores.video_busy==0) //ждем установки бита

{

flush_data_buffer((void*)&shared_memory.sync_cores.video_busy, (void*)&shared_memory.sync_cores.video_busy, 1);

//а вот тут скорее всего и бага, тут нужно просто инвалидацию сделать

}

 

shared_memory.sync_cores.video_busy=0;

flush_data_buffer((void*)&shared_memory.sync_cores.video_busy, (void*)&shared_memory.sync_cores.video_busy, 1);

 

*pFIO0_FLAG_S = (1<<6);

 

}

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


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

Есть у 561 такая штука как IMDMA 2 канала, которые настраивают для синхронизации и передычи данных между памятью L1 ядер. 1 канал настраивается на передачу данных из ядра А в Б, а второй канал соответственно наоборот. Так можно организовать передачу различного рода сообщений. Так же для синхронизации между ядрами есть такая функция как TESTSET, которая работает с L2 и за один такт читает и выставляет бит в заданной ячейке, что может служить семафором например, который будет перекрывать доступ к области памяти одному ядеру в тот момент когда с ней работает второе. А передачу данных я бы делал через IMDMA если объёмы маленькие. А если это массивы в SDRАM, то посредством тех же сообщений организованных через тот же IMDMA передавал бы указатель памяти с которым надо что то проделать.

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


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

Есть у 561 такая штука как IMDMA 2 канала, которые настраивают для синхронизации и передычи данных между памятью L1 ядер. 1 канал настраивается на передачу данных из ядра А в Б, а второй канал соответственно наоборот. Так можно организовать передачу различного рода сообщений. Так же для синхронизации между ядрами есть такая функция как TESTSET, которая работает с L2 и за один такт читает и выставляет бит в заданной ячейке, что может служить семафором например, который будет перекрывать доступ к области памяти одному ядеру в тот момент когда с ней работает второе. А передачу данных я бы делал через IMDMA если объёмы маленькие. А если это массивы в SDRАM, то посредством тех же сообщений организованных через тот же IMDMA передавал бы указатель памяти с которым надо что то проделать.

 

Спасибо за ответ!

А TESTSET с памятью напрямую работает или с кешем? Я думаю с кешем.

 

Да проблема у меня чуток в другом:

Ядро А пишет в кеш сообщение, потом перезаписывает кеш в L2 и вызывает прерывание в ядре В

но в ядре В в кеше уже есть предыдущее сообщение, оно то не знает что память переписалась ядром А

и если я сделаю PREFETCH, то ничего не произойдет. Чтобы эта команда выполнилась нужно чтобы кеш в ядре В был инвалидирован до того, как ядро А туда что-то записало

или IMDMA. Там бага есть, он не работает при частоте ядра больше 500 МГц, а у меня 525

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


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

А TESTSET с памятью напрямую работает или с кешем? Я думаю с кешем.

А в мануал заглянуть?

The memory architecture always treats atomic operations as cache inhibited

accesses even if the CPLB descriptor for the address indicates cache

enabled access. However, executing TESTSET operations on cacheable

regions of memory is not recommended since the architecture cannot

guarantee a cacheable location of memory is coherent when the TESTSET

instruction is executed.

Только я все равно не могу понять, зачем вам кэшировать L2 память? Неужели вы оттуда данные выгребаете каждый такт?

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


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

The memory architecture always treats atomic operations as cache inhibited accesses even if the CPLB descriptor for the address indicates cache enabled access. However, executing TESTSET operations on cacheable regions of memory is not recommended since the architecture cannot guarantee a cacheable location of memory is coherent when the TESTSET instruction is executed.

 

вот что пишут AD по поводу TESTSET. Нужно проверять как будет работать, т.е. они говорят что должно работать, но не рекомендуют при включеном кэше.

 

Либо делать область памяти в L2 не кешируемую и там размещать совместно используемые переменные.

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


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

А в мануал заглянуть?

 

Да заглянул уже :) И другого ответа не ожидал

 

Только я все равно не могу понять, зачем вам кэшировать L2 память? Неужели вы оттуда данные выгребаете каждый такт?

 

В L2 расположен стек, и его желательно кешировать, ибо

 

L1 cache line fills from the L2 SRAM in 9+2+2+2=15 cycles. In other

words, after nine core cycles, the first 64-bit (8-byte) fill is available for

the processor

 

а при выключеном кеше

non-cacheable, instruction

fetches and data fetches occur in 64-bit fills. In this case, each fill takes

seven core cycles to complete.

 

итого при последовательном чтении 32 байт имеем 15 тактов против 28, уже не говоря про произвольный байтовый доступ

 

L2 не такая уж быстрая память как кажется, особенно при произвольном доступе.

 

Я бы сделал кусочек некешируемый для синхронизации двух ядер, но

размер CPLB области 1К,4К,1М, 4М и я не совсем представляю как мне выделить 96К кешируемой, а 32 некешируемой

 

The memory architecture always treats atomic operations as cache inhibited accesses even if the CPLB descriptor for the address indicates cache enabled access. However, executing TESTSET operations on cacheable regions of memory is not recommended since the architecture cannot guarantee a cacheable location of memory is coherent when the TESTSET instruction is executed.

 

вот что пишут AD по поводу TESTSET. Нужно проверять как будет работать, т.е. они говорят что должно работать, но не рекомендуют при включеном кэше.

 

Либо делать область памяти в L2 не кешируемую и там размещать совместно используемые переменные.

 

Ясно, спасибо.

А Вы случаем не делали динамически изменяемую таблицу CPLB ?

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


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

Кстати кэш данных и инструкций никак не связан друг с другом. Т.е. вы можете включить кэш для инструкций, но отключить для данных - вот и всё.

 

CPLB динамически никогда не менял, поэтому ничего сказать не могу. А CPLD настроить так как делает например VDSP при генерации cplbtab561.с

/* MANAGED-BY-SYSTEM-BUILDER                                    */

/*
** CPLB table definitions for coreA generated on May 15, 2009 at 09:15:14.
**
** Copyright (C) 2000-2006 Analog Devices Inc., All Rights Reserved.
**
** This file is generated automatically based upon the options selected
** in the LDF Wizard. Changes to the LDF configuration should be made by
** changing the appropriate options rather than editing this file.
**
** Configuration:-
**     crt_doj:                                .\Debug\COREA_basiccrt.doj
**     processor:                              ADSP-BF561
**     si_revision:                            automatic
**     cplb_init_cplb_ctrl:                    63
**     cplb_init_dcache_ctrl:                  dcache_wt
**     cplb_init_cplb_src_file:                D:\RIFTEK\Project\RFXXX\RF620\BF561Src\OSVersion\VDK\Ethernet\CanadaNEW\COREA\COREA_cplbtab.c
**     cplb_init_cplb_obj_file:                .\Debug\COREA_cplbtab.doj
**     using_cplusplus:                        true
**     mem_init:                               false
**     use_vdk:                                true
**     use_eh:                                 true
**     use_argv:                               false
**     running_from_internal_memory:           true
**     user_heap_src_file:                     D:\RIFTEK\Project\RFXXX\RF620\BF561Src\OSVersion\VDK\Ethernet\CanadaNEW\COREA\COREA_heaptab.c
**     libraries_use_stdlib:                   true
**     libraries_use_fileio_libs:              true
**     libraries_use_ieeefp_emulation_libs:    false
**     libraries_use_eh_enabled_libs:          false
**     system_heap:                            L3
**     system_heap_min_size:                   2M
**     system_stack:                           SCRATCHPAD
**     system_stack_min_size:                  2K
**     use_sdram:                              true
**     use_sdram_size:                         32M
**     use_sdram_partitioned:                  default
**     use_multicores:                         2
**     use_multicores_use_core:                coreA
**
*/


#define CACHE_MEM_MODE CPLB_DDOCACHE_WT



#include <sys/platform.h>
#include <cplbtab.h>

#pragma section("cplb_data")
#pragma file_attr("DualCoreMem=CoreA")

cplb_entry dcplbs_table[] = {



/*$VDSG<customisable-data-cplb-table>                           */
/* This code is preserved if the CPLB tables are re-generated.  */


   // L1 Data A & B, (set write-through bit to avoid 1st write exceptions)
   {0xFF800000, (PAGE_SIZE_4MB | CPLB_DNOCACHE | CPLB_LOCK | CPLB_WT)}, 

   // L2 SRAM
   {0xFEB00000, (PAGE_SIZE_4KB | CPLB_D_PAGE_MGMT | CPLB_WT)}, 
   {0xFEB01000, (PAGE_SIZE_4KB | CACHE_MEM_MODE)}, 
   {0xFEB02000, (PAGE_SIZE_4KB | CACHE_MEM_MODE)}, 
   {0xFEB03000, (PAGE_SIZE_4KB | CACHE_MEM_MODE)}, 
   {0xFEB04000, (PAGE_SIZE_4KB | CACHE_MEM_MODE)}, 
   {0xFEB05000, (PAGE_SIZE_4KB | CACHE_MEM_MODE)}, 
   {0xFEB06000, (PAGE_SIZE_4KB | CACHE_MEM_MODE)}, 
   {0xFEB07000, (PAGE_SIZE_4KB | CACHE_MEM_MODE)}, 
   {0xFEB08000, (PAGE_SIZE_4KB | CACHE_MEM_MODE)}, 
   {0xFEB09000, (PAGE_SIZE_4KB | CACHE_MEM_MODE)}, 
   {0xFEB0a000, (PAGE_SIZE_4KB | CACHE_MEM_MODE)}, 
   {0xFEB0b000, (PAGE_SIZE_4KB | CACHE_MEM_MODE)}, 
   {0xFEB0c000, (PAGE_SIZE_4KB | CACHE_MEM_MODE)}, 
   {0xFEB0d000, (PAGE_SIZE_4KB | CACHE_MEM_MODE)}, 
   {0xFEB0e000, (PAGE_SIZE_4KB | CACHE_MEM_MODE)}, 
   {0xFEB0f000, (PAGE_SIZE_4KB | CACHE_MEM_MODE)}, 
   {0xFEB10000, (PAGE_SIZE_4KB | CPLB_DNOCACHE)}, 
   {0xFEB11000, (PAGE_SIZE_4KB | CPLB_DNOCACHE)}, 
   {0xFEB12000, (PAGE_SIZE_4KB | CPLB_DNOCACHE)}, 
   {0xFEB13000, (PAGE_SIZE_4KB | CPLB_DNOCACHE)}, 
   {0xFEB14000, (PAGE_SIZE_4KB | CPLB_DNOCACHE)}, 
   {0xFEB15000, (PAGE_SIZE_4KB | CPLB_DNOCACHE)}, 
   {0xFEB16000, (PAGE_SIZE_4KB | CPLB_DNOCACHE)}, 
   {0xFEB17000, (PAGE_SIZE_4KB | CPLB_DNOCACHE)}, 
   {0xFEB18000, (PAGE_SIZE_4KB | CPLB_DNOCACHE)}, 
   {0xFEB19000, (PAGE_SIZE_4KB | CPLB_DNOCACHE)}, 
   {0xFEB1a000, (PAGE_SIZE_4KB | CPLB_DNOCACHE)}, 
   {0xFEB1b000, (PAGE_SIZE_4KB | CPLB_DNOCACHE)}, 
   {0xFEB1c000, (PAGE_SIZE_4KB | CPLB_DNOCACHE)}, 
   {0xFEB1d000, (PAGE_SIZE_4KB | CPLB_DNOCACHE)}, 
   {0xFEB1e000, (PAGE_SIZE_4KB | CPLB_DNOCACHE)}, 
   {0xFEB1f000, (PAGE_SIZE_4KB | CPLB_DNOCACHE)}, 

   // 512 MB (Maximum) SDRAM memory space (64 MB populated on Ez-kit)
   {0x00000000, (PAGE_SIZE_4MB | CACHE_MEM_MODE | CPLB_LOCK)}, 
   {0x00400000, (PAGE_SIZE_4MB | CACHE_MEM_MODE | CPLB_LOCK)}, 
   
   // CPLBs covering 24MB
   {0x00800000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x00900000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x00a00000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x00b00000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x00c00000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x00d00000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x00e00000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x00f00000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x01000000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x01100000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x01200000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x01300000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x01400000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x01500000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x01600000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x01700000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x01800000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x01900000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x01a00000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x01b00000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x01c00000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x01d00000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x01e00000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},
   {0x01f00000, (PAGE_SIZE_1MB | CACHE_MEM_MODE)},

   // Async Memory Bank 3 (64MB)
   
   // CPLBs covering 64MB
   {0x2c000000, (PAGE_SIZE_4MB | CPLB_DNOCACHE)},
   {0x2c400000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2c800000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2cc00000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2d000000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2d400000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2d800000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2dc00000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2e000000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2e400000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2e800000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2ec00000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2f000000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2f400000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2f800000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2fc00000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},

   // Async Memory Bank 2 (64MB)
   
   // CPLBs covering 64MB
   {0x28000000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x28400000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x28800000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x28c00000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x29000000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x29400000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x29800000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x29c00000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2a000000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2a400000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2a800000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2ac00000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2b000000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2b400000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2b800000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x2bc00000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},

   // Async Memory Bank 1 (64MB)
   
   // CPLBs covering 64MB
   {0x24000000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x24400000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x24800000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x24c00000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x25000000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x25400000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x25800000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x25c00000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x26000000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x26400000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x26800000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x26c00000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x27000000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x27400000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x27800000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},
   {0x27c00000, (PAGE_SIZE_4MB | CACHE_MEM_MODE)},

   // Async Memory Bank 0 (64MB)
   {0x20000000, (PAGE_SIZE_4MB | CPLB_DNOCACHE)}, 
   {0x20400000, (PAGE_SIZE_4MB | CPLB_DNOCACHE)},
   {0x20800000, (PAGE_SIZE_4MB | CPLB_DNOCACHE)},
   {0x20c00000, (PAGE_SIZE_4MB | CPLB_DNOCACHE)},
   {0x21000000, (PAGE_SIZE_4MB | CPLB_DNOCACHE)},
   {0x21400000, (PAGE_SIZE_4MB | CPLB_DNOCACHE)},
   {0x21800000, (PAGE_SIZE_4MB | CPLB_DNOCACHE)},
   {0x21c00000, (PAGE_SIZE_4MB | CPLB_DNOCACHE)},
   {0x22000000, (PAGE_SIZE_4MB | CPLB_DNOCACHE)},
   {0x22400000, (PAGE_SIZE_4MB | CPLB_DNOCACHE)},
   {0x22800000, (PAGE_SIZE_4MB | CPLB_DNOCACHE)},
   {0x22c00000, (PAGE_SIZE_4MB | CPLB_DNOCACHE)},
   {0x23000000, (PAGE_SIZE_4MB | CPLB_DNOCACHE)},
   {0x23400000, (PAGE_SIZE_4MB | CPLB_DNOCACHE)},
   {0x23800000, (PAGE_SIZE_4MB | CPLB_DNOCACHE)},
   {0x23c00000, (PAGE_SIZE_4MB | CPLB_DNOCACHE)},

   // end of section - termination
   {0xffffffff, 0}, 
/*$VDSG<customisable-data-cplb-table>                           */


}; /* dcplbs_table */

#pragma section("cplb_data")
#pragma file_attr("DualCoreMem=CoreA")

cplb_entry icplbs_table[] = {



/*$VDSG<customisable-instr-cplb-table>                          */
/* This code is preserved if the CPLB tables are re-generated.  */


   // L1 Code
   {0xFFA00000, (PAGE_SIZE_1MB | CPLB_I_PAGE_MGMT)}, 

   // L2 SRAM
   {0xFEB00000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)}, 

   // Boot ROM
   {0xEF000000, (PAGE_SIZE_1KB | CPLB_I_PAGE_MGMT)}, 

   // Async Memory Bank 0
   {0x20000000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)}, 

   // 512 MB (Maximum) SDRAM memory space (64 MB populated on Ez-kit)
   
   // CPLBs covering 32MB
   {0x00000000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x00100000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x00200000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x00300000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x00400000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x00500000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x00600000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x00700000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x00800000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x00900000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x00a00000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x00b00000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x00c00000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x00d00000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x00e00000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x00f00000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x01000000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x01100000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x01200000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x01300000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x01400000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x01500000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x01600000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x01700000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x01800000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x01900000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x01a00000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x01b00000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x01c00000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x01d00000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x01e00000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},
   {0x01f00000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)},

   // Async Memory Bank 3 (64MB)
   
   // CPLBs covering 64MB
   {0x2c000000, (PAGE_SIZE_4MB | CPLB_INOCACHE)},
   {0x2c400000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2c800000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2cc00000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2d000000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2d400000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2d800000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2dc00000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2e000000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2e400000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2e800000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2ec00000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2f000000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2f400000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2f800000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2fc00000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},

   // Async Memory Bank 2 (64MB)
   
   // CPLBs covering 64MB
   {0x28000000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x28400000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x28800000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x28c00000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x29000000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x29400000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x29800000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x29c00000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2a000000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2a400000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2a800000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2ac00000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2b000000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2b400000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2b800000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x2bc00000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},

   // Async Memory Bank 1 (64MB)
   
   // CPLBs covering 64MB
   {0x24000000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x24400000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x24800000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x24c00000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x25000000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x25400000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x25800000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x25c00000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x26000000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x26400000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x26800000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x26c00000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x27000000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x27400000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x27800000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x27c00000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},

   // Async Memory Bank 0 (64MB)
   {0x20100000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)}, 
   {0x20200000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)}, 
   {0x20300000, (PAGE_SIZE_1MB | CPLB_IDOCACHE)}, 
   
   // CPLBs covering 60MB
   {0x20400000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x20800000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x20c00000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x21000000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x21400000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x21800000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x21c00000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x22000000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x22400000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x22800000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x22c00000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x23000000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x23400000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x23800000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},
   {0x23c00000, (PAGE_SIZE_4MB | CPLB_IDOCACHE)},

   // end of section - termination
   {0xffffffff, 0}, 
/*$VDSG<customisable-instr-cplb-table>                          */


}; /* icplbs_table */

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

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


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

В L2 расположен стек, и его желательно кешировать, ибо

А у вас стек большой? Не хотите разместить его в scratchpad-е?

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


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

А у вас стек большой? Не хотите разместить его в scratchpad-е?

 

Хочу, но 4К мало

Нам хотя бы 16к

А так конечно же в scratchpad

 

А в другом ядре стек вообще в SDRAM, там GUI навороченный :)

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


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

Кстати кэш данных и инструкций никак не связан друг с другом. Т.е. вы можете включить кэш для инструкций, но отключить для данных - вот и всё.

 

CPLB динамически никогда не менял, поэтому ничего сказать не могу. А CPLD настроить так как делает например VDSP при генерации cplbtab561.с

/* MANAGED-BY-SYSTEM-BUILDER									*/

 

Да, это все хорошо, только как они все это в 16 пар регистров пихают? Буду разбираться.

Комбинировать работу кеша и имдма

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

 

Так L1 - довольно большой объём 64k, может оттуда взять один банк на стек.

 

можно один банк для кеша использовать, а второй для стека, но все-таки постараюсь раздуплить L2 :)

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


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

можно один банк для кеша использовать, а второй для стека, но все-таки постараюсь раздуплить L2 :)

Ну да. Тот банк, который не может выступать в режиме кэша, отдать под стек (и, возможно, другие критичные по времени доступа данные). А L2 использовать по назначению - для межядерного обмена и неторопливого кода.

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


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

Ну да. Тот банк, который не может выступать в режиме кэша, отдать под стек (и, возможно, другие критичные по времени доступа данные). А L2 использовать по назначению - для межядерного обмена и неторопливого кода.

 

Да как-то жаба давит L2 под неторопливый код, там для этого SDRAMа дофига :)

Не, не все я еще из этого камня выжал, буду насиловать его :) Все-таки там механизмы есть для изврата

Просто моя задача сделать так систему, чтобы остальные программеры имели достаточно удобный low level

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


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

Огромное человеческое спасибо boom за подсказку

Команда TESTSET сделала меня счастливым :)

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


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

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

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

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

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

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

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

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

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

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