Миландр

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

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 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
Сообщения: 1486
Откуда: Тула
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
Сообщения: 1300
Откуда: АО "ПКК Миландр"
А в чем именно заключается "работоспособность памяти данных полностью теряется" и "не будет работать нормально" ?


Вернуться к началу
 Заголовок сообщения: 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
Сообщения: 1300
Откуда: АО "ПКК Миландр"
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
Сообщения: 1300
Откуда: АО "ПКК Миландр"
А можно вывести статитику кеша число попаданий и промахов перед началом и после цикла морганий выводами ?


Вернуться к началу
 Заголовок сообщения: 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
Сообщения: 59
Организация: АО "ПКК Миландр"
Откуда: АО "ПКК Миландр"
Попробуйте в файле 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+03:00


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

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


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

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB