Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2019-май-19 15:46

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: D-Cache с внешней шиной
СообщениеДобавлено: 2019-фев-26 07:46 
Не в сети

Зарегистрирован: 2018-авг-16 17:14
Сообщения: 9
После включения кэша данных для внешней RAM (1645РУ5У) работоспособность памяти данных полностью теряется.
Код инициализации кэша:
Код:
    DCACHE->KEY = 0x8555AAA1;
    DCACHE->CNTL = 0x0032;
    DCACHE->CNTL = 0x0009;
    DCACHE->KEY = 0;

Такой же код инициализации кэша команд (ICACHE) запускает кэш команд нормально.

Отладочная плата ревизии 1.51.
Дата производства МК: 19 неделя 2018 года.

В чем ошибка?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: D-Cache с внешней шиной
СообщениеДобавлено: 2019-фев-28 14:12 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1270
Откуда: Тула
PNPPK писал(а):
Код инициализации кэша:
Код:
    DCACHE->KEY = 0x8555AAA1;
    DCACHE->CNTL = 0x0032;
    DCACHE->CNTL = 0x0009;
    DCACHE->KEY = 0;

Не стоит ли добавить _ISB(); _DSB(); сразу после включения кэша?

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: D-Cache с внешней шиной
СообщениеДобавлено: 2019-фев-28 15:05 
Не в сети

Зарегистрирован: 2018-авг-16 17:14
Сообщения: 9
prostoRoman писал(а):
Не стоит ли добавить _ISB(); _DSB(); сразу после включения кэша?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: D-Cache с внешней шиной
СообщениеДобавлено: 2019-мар-01 13:07 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1292
Откуда: АО "ПКК Миландр"
А в чем именно заключается "работоспособность памяти данных полностью теряется" и "не будет работать нормально" ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: D-Cache с внешней шиной
СообщениеДобавлено: 2019-мар-04 08:24 
Не в сети

Зарегистрирован: 2018-авг-16 17:14
Сообщения: 9
-=Sergei=- писал(а):
А в чем именно заключается "работоспособность памяти данных полностью теряется" и "не будет работать нормально" ?

В демо-проекте 1986VE8T_quick_start код и данные перемещены во внешнюю память:
ROM1: 0x10000000 0x2000
RAM1: 0x10002000 0x6000
Изменен также файл Start.ini для загрузки и отладки через JTAG:
Открыть Start.ini
Код:
// Start of Start.ini
FUNC void RAM () {
        _WDWORD(0x40005000, 0x8555AAA1); // EXT_BUS_CNTR->KEY
        _WDWORD(0x40005004, 0x00000021 | (2 << 8) | (1 << 27)); //EXT_BUS_CNTR->RGN0_CNTRL
        _WDWORD(0x40005000, 0); // EXT_BUS_CNTR->KEY
        _WDWORD(0x40082000, 0x8555AAA1); // PORTC->KEY
        _WDWORD(0x40082024, 0x22000000); // PORTC->SFUNC[3]
        _WDWORD(0x40082038, 0xC0000000); // PORTC->SANALOG
            _WDWORD(0x4008205C, 0xF0000000); // PORTC->SPWR[1]
        _WDWORD(0x40082000, 0); // PORTC->KEY
        _WDWORD(0x40083000, 0x8555AAA1); // PORTD->KEY
        _WDWORD(0x40083018, 0x22222222); // PORTD->SFUNC[0]
        _WDWORD(0x4008301C, 0x22222222); // PORTD->SFUNC[1]
        _WDWORD(0x40083020, 0x22222222); // PORTD->SFUNC[2]
        _WDWORD(0x40083024, 0x22222222); // PORTD->SFUNC[3]
        _WDWORD(0x40083038, 0xFFFFFFFF); // PORTD->SANALOG
            _WDWORD(0x40083058, 0xFFFFFFFF); // PORTD->SPWR[0]
            _WDWORD(0x4008305C, 0xFFFFFFFF); // PORTD->SPWR[1]
        _WDWORD(0x40083000, 0); // PORTD->KEY
        _WDWORD(0x40084000, 0x8555AAA1); // PORTE->KEY
        _WDWORD(0x40084018, 0x22222222); // PORTE->SFUNC[0]
        _WDWORD(0x4008401C, 0x02222222); // PORTE->SFUNC[1]
        _WDWORD(0x40084038, 0x00007FFF); // PORTE->SANALOG
            _WDWORD(0x40084058, 0x3FFFFFFF); // PORTE->SPWR[0]
        _WDWORD(0x40084000, 0); // PORTE->KEY
}

FUNC void Setup (unsigned int region) {
  region &= 0xFFFFFC00;
  SP = _RDWORD(region);                          // Setup Stack Pointer
  PC = _RDWORD(region + 4);                      // Setup Program Counter
  _WDWORD(0xE000ED08, region);                   // Setup Vector Table Offset Register
}

RAM();
LOAD %L INCREMENTAL
Setup(0x10000000); // Get ready to execute image in external SRAM or whatever region it is in
G, main
// End of Start.ini
Закрыть

В исходный код программы добавлена инициализация кэша данных:
Код:
#include "cm4ikmcu.h"

#define CLKCTRL_PER0_CLK_MDR_PORTC_EN      ((uint32_t)0x00008000)

const uint8_t current[8] = {16, 17, 18, 19, 20, 21, 22, 23};

int main(void)
{
   uint32_t i, j;

   DCACHE->KEY = 0x8555AAA1;
   DCACHE->CNTL = 0x0032;
   DCACHE->CNTL = 0x0009;
   DCACHE->KEY = 0;

   CLK_CNTR->KEY     = 0x8555AAA1; // Key to access clock control
   
   /* Enable HSE */
   CLK_CNTR->HSE0_CLK = (1 << 27);   //enable HSE
   while((CLK_CNTR->HSE0_STAT & (1 << 20)) == 0){}   //wait HSE
   CLK_CNTR->MAX_CLK = 2;               //frequency source - HSE   
   CLK_CNTR->CPU_CLK = 0;               //HSE --> Fclk
   /* Core frequency configuration complete */
   
   /* init clock of PortC */
   CLK_CNTR->PER0_CLK |= CLKCTRL_PER0_CLK_MDR_PORTC_EN;

   /* init LEDs VD7 - VD14 */   
   PORTC->KEY = 0x8555AAA1;
   PORTC->SANALOG |= (0xFF << 16);
   PORTC->SOE |= (0xFF << 16);
   PORTC->RXTX = 0;
   PORTC->SPWR[1] |= 0xFFFF;   
      
   while (1){
      /* Blink of leds in loop */
      for(j = 0; j < 8; j++){
         PORTC->SRXTX = (1 << current[j]);
         for(i = 0; i < 50000; i++){}
         PORTC->CRXTX = (1 << current[j]);
      }
   }
}

В данной программе кэшируется массив байтов current, содержащий номера пинов, к которым подключены светодиоды.
Если запустить программу без пошаговой отладки, то работать будут только 3 светодиода из восьми.
При пошаговой отладке работают все светодиоды, а также если посмотреть массив в окне Memory,
то заметно, что после чтения одного байта остальные 3 байта 32-битного слова остаются равными 00 на некоторое время.
Если массив current составить из 32-битных слов, то все работает нормально и с отладкой, и без нее.
Поскольку все данные не могут быть 32-битными словами, кеш данных использовать невозможно.
Видимо, есть проблема с логикой работы кэша данных на 8-битной внешней шине.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: D-Cache с внешней шиной
СообщениеДобавлено: 2019-мар-06 16:31 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1292
Откуда: АО "ПКК Миландр"
PNPPK писал(а):
В данной программе кэшируется массив байтов current, содержащий номера пинов, к которым подключены светодиоды.
Если запустить программу без пошаговой отладки, то работать будут только 3 светодиода из восьми.
При пошаговой отладке работают все светодиоды, а также если посмотреть массив в окне Memory,
то заметно, что после чтения одного байта остальные 3 байта 32-битного слова остаются равными 00 на некоторое время.
Если массив current составить из 32-битных слов, то все работает нормально и с отладкой, и без нее.
Поскольку все данные не могут быть 32-битными словами, кеш данных использовать невозможно.
Видимо, есть проблема с логикой работы кэша данных на 8-битной внешней шине.


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: D-Cache с внешней шиной
СообщениеДобавлено: 2019-мар-06 19:08 
Не в сети

Зарегистрирован: 2018-авг-16 17:14
Сообщения: 9
-=Sergei=- писал(а):
Смущает что в пошаговой отладке все работает, а без отладки нет.
Можно осциллографом посмотреть пины, может просто слишком быстро получается ?

Задержка между переключениями светодиодов стабильная и определяется циклом, длительность которого никак не зависит от кеша данных:
Код:
for(i = 0; i < 50000; i++){}

Просто 5 светодиодов из восьми не загораются, поскольку для них включается пин номер 0. Осциллограф показывает это на площадке PC0 после изменения кода инициализации порта C:
Код:
   /* init LEDs VD7 - VD14 */   
   PORTC->KEY = 0x8555AAA1;
   PORTC->SANALOG |= 0xFF0001;
   PORTC->SOE |= 0xFF0001;
   PORTC->RXTX = 0;
   PORTC->SPWR[0] |= 0x0003;   
   PORTC->SPWR[1] |= 0xFFFF;   

Я привел один пример программы. Вообще, практически ни одна программа с 8-битными данными во внешней памяти не работает при включенном кэше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: D-Cache с внешней шиной
СообщениеДобавлено: 2019-мар-11 18:16 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1292
Откуда: АО "ПКК Миландр"
А можно вывести статитику кеша число попаданий и промахов перед началом и после цикла морганий выводами ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: D-Cache с внешней шиной
СообщениеДобавлено: 2019-мар-12 08:35 
Не в сети

Зарегистрирован: 2018-авг-16 17:14
Сообщения: 9
-=Sergei=- писал(а):
А можно вывести статитику кеша число попаданий и промахов перед началом и после цикла морганий выводами ?

Код:
   volatile uint32_t hits, misses;
   uint32_t hits0, misses0;
   uint32_t hits1 = 0, misses1 = 0;
   ...
   while (1){
      /* Blink of leds in loop */
      for(j = 0; j < 8; j++){
*         PORTC->SRXTX = (1 << current[j]);
         for(i = 0; i < 50000; i++){}
*         PORTC->CRXTX = (1 << current[j]);
      }
      hits0 = DCACHE->HIT_CNT;
      misses0 = DCACHE->MISS_CNT;
      hits = hits0 - hits1;
      misses = misses0 - misses1;
*      hits1 = hits0;
      misses1 = misses0;
   }

Добавлен код вычисления приращения счетчиков (hits, misses) за время цикла моргания.
В установившемся состоянии кэша получаются результаты:

hits = 52, misses = 2 при одной точке останова после цикла.
hits = 29, misses = 4427 при трех точках останова (строки отмечены *).

Результат не зависит от размера элемента массива current (8 или 32 бита).
Нормально работает только режим с тремя точками останова или с 32-битным массивом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: D-Cache с внешней шиной
СообщениеДобавлено: 2019-мар-12 13:29 
Не в сети

Зарегистрирован: 2017-май-31 15:10
Сообщения: 37
Откуда: АО "ПКК Миландр"
Попробуйте в файле Start.ini, в функции void RAM () {...}, в строке инициализации внешней шины выставить бит READ32.
Код:
_WDWORD(0x40005004, 0x00000021 | (2 << 8) | (1 << 27) | (1<<26));

Согласно описанию данного бита из спецификации, в режиме READ32=0 кэширование не допустимо.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: D-Cache с внешней шиной
СообщениеДобавлено: 2019-мар-12 14:10 
Не в сети

Зарегистрирован: 2018-авг-16 17:14
Сообщения: 9
Artem1 писал(а):
Попробуйте в файле Start.ini, в функции void RAM () {...}, в строке инициализации внешней шины выставить бит READ32.
Код:
_WDWORD(0x40005004, 0x00000021 | (2 << 8) | (1 << 27) | (1<<26));

Согласно описанию данного бита из спецификации, в режиме READ32=0 кэширование не допустимо.

Помогло. Все заработало.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


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

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB