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

TMS320C6745 Reference board ? Существует?

16 минут назад, __inline__ сказал:

Пример взят у индусов и наверное из-за отсутствия слова volatile в регистрах - не работает. Надо посмотреть ассемблерный листинг.

Или проблема в другом?

...или AISgen-ом собрали неправильно. 

16 минут назад, __inline__ сказал:

 

Вначале из Blink.out делаю Blink.bin (AISGen-ом), затем bin гружу Uart boot host-ом

Вы что-ж - собрались что-то отлаживать без эмулятора??? :shok:  На таком МК это - мазохизм. имхо.

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


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

 

Quote

Вы что-ж - собрались что-то отлаживать без эмулятора??? :shok:  На таком МК это - мазохизм. имхо.

Ну BF532 осилил же :) C6745 аналогично хочу.

Quote

...или AISgen-ом собрали неправильно. 

Вот с такими настройками делал, посмотрите пожалуйста, что не так?

2.jpg.27aee8f9015639c179306c4109d2c1db.jpg

 

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


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

Всё, разобрался.

Дофига чего инитить нужно было. Ниже рабочий код мигания светодиода на GP0[0].

#define u32 unsigned int

#define SYSCFG_0_REGS 0x01C14000
#define GPIO_0_REGS   0x01E26000
#define PSC1_BASE  	  0x01E27000

#define PSC1_MDCTL    (PSC1_BASE+0xA00)
#define PSC1_MDSTAT   (PSC1_BASE+0x800)

#define KICK0R          (*(volatile u32*)(SYSCFG_0_REGS+0x038))
#define KICK1R          (*(volatile u32*)(SYSCFG_0_REGS+0x03c))

#define PINMUX13        (*(volatile u32*)(SYSCFG_0_REGS+0x154))

#define GPIO_DIR01      (*(volatile u32*)(GPIO_0_REGS+0x10))
#define GPIO_OUT_DATA01 (*(volatile u32*)(GPIO_0_REGS+0x14))
#define GPIO_SET_DATA01 (*(volatile u32*)(GPIO_0_REGS+0x18))
#define GPIO_CLR_DATA01 (*(volatile u32*)(GPIO_0_REGS+0x1C))

#define PSC1_PTCMD  	(*(volatile u32*)(PSC1_BASE+0x120))
#define PSC1_PTSTAT 	(*(volatile u32*)(PSC1_BASE+0x128))

void Unlock_Hardware(void)
{
 KICK0R=0x83E70B13;
 KICK1R=0x95A4F1E0;
}

void PSC1_lPSC_enable(u32 PD,u32 LPSC_num)
{
 *(volatile u32*)(PSC1_MDCTL+4*LPSC_num)=(*(volatile u32*)(PSC1_MDCTL+4*LPSC_num)&0xFFFFFFE0)|0x0003;
 PSC1_PTCMD=0x1<<PD;
 while((PSC1_PTSTAT&(0x1<<PD))!=0);                             //Wait for power state transition to finish
 while(((*(volatile u32*)(PSC1_MDSTAT+4*LPSC_num))&0x1F)!=0x3);
}

void Delay(volatile u32 ms) //for 24 MHz & disabled cache
{
 volatile u32 i;
 while(ms>0)
 {
  for(i=0;i<1725;i++);
  ms--;
 }
}

void main(void)
{
 Unlock_Hardware();          //unlock registers

 PINMUX13|=0x08000000;       //select function GP0[0]

 PSC1_lPSC_enable(0,3);	     //enable GPIO

 GPIO_DIR01&=0xFFFFFFFE;     //GP0[0] output

 while(1)
 {
  GPIO_SET_DATA01=0x00000001; //set GP0[0]
  Delay(1000);

  GPIO_CLR_DATA01=0x00000001; //clear GP0[0]
  Delay(1000);
 }

}

 

Прошивка, сгенерированная в AISgen для загрузки по UART с помощью UART Boot Host ниже.

Blink.bin

 

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


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

Разобрался с PLL (файлы проекта PLL.c/PLL.h), выставил такой режим:

частота ядра: 456 МГц
частота шины EMIFB: 152 МГц (SDRAM)
частота шины EMIFA: 91.2 МГц (пока свободна)

Проинитил SDRAM (файлы проекта EMIFB.c/EMIFB.h) MT48LC16M16 на частоту 152 МГц (6.5 нс).
Это максимальная частота шины по даташиту на C6745. Сама память ещё более быстрая 166 МГц (6 нс).

---

Накатал тест памяти (файлы проекта MemTest.c/MemTest.h).

Несколько тестов: запись словами по 8,16,32,64 байт.

16 типов шаблонов:

const u64 Patterns[]=
{
 0x0000000000000000ULL,
 0xFFFFFFFFFFFFFFFFULL,
 0x5555555555555555ULL,
 0xAAAAAAAAAAAAAAAAULL,
 0x1111111111111111ULL,
 0x2222222222222222ULL,
 0x4444444444444444ULL,
 0x8888888888888888ULL,
 0x3333333333333333ULL,
 0x6666666666666666ULL,
 0x9999999999999999ULL,
 0xCCCCCCCCCCCCCCCCULL,
 0x7777777777777777ULL,
 0xBBBBBBBBBBBBBBBBULL,
 0xDDDDDDDDDDDDDDDDULL,
 0xEEEEEEEEEEEEEEEEULL,
};

Вначале идёт заполнение всеми шаблонами по-очереди, затем заполнение отдельным шаблоном.

А также дополнительный тест - запись псевдо-случайными числами.
Код функции Random() такой:

u32 Seed;
	u32 Random32(void)
{
 register u32 c=0x21;
 register u32 a=Seed;
 register u32 b;
 m0:
 b=a;
 a+=a;
 if(a>b) goto m1;
 a^=0xC5;
 m1:
 c--;
 if(c) goto m0;
 Seed=a;
 return Seed;
}

Seed перед использованием Random32() надо проинитить простым числом (используется 0x7FFFFFFF).

Тест всей памяти идёт около 4 минуты 20 секунд (последние тесты с Random вносят задержку).

Если что-то не так, то тестирование памяти прекратится и светодиод на порте GP0[0] будет быстро моргать (интервал 100 мс).
Если всё ОК и тест пройден, то светодиод будет медленно мигать (интервал 1 с).

Кеширование кода и данных естественно - не задействовано(выключено), чтобы работа с SDRAM была не в пакетном режиме.
Адресное пространство SDRAM (32 МБ) объявлено как volatile, что исключает оптимизацию компилятора - для гарантированного обращения к каждой ячейке памяти.

---

При написании программ усердно курю Reference Manual на C6745 и поглядываю на следующие сорцы:

c6000-evi-lib-master.zip и C6745-master.zip (оба качаются с GitHub).

В первом проекте регистры периферии почему-то объявлены без VOLATILE, что приводит к неправильной работе программы, когда она Release, а не Debug и со включенной оптимизацией.

В частности при настройке PLL без volatile повисало на втором цикле:

while(PLL0_PLLSTAT&0x1==1){}


В моих исходниках все хедеры с регистрами исправлены, всё работает на максимальном уровне оптимизации.

Во втором проекте автор не выложил хедеры.

---

Обнаружил, что размер данных unsigned long int не 4, а 8 байт. В ARM 4 байта, а тут 8!

Протестил остальные типы:

sizeof(unsigned char)=1
sizeof(unsigned short int)=2
sizeof(unsigned int)=4
sizeof(unsigned long int)=8 - НЕ СОВМЕСТИМО С ARM !!!
sizeof(unsigned long long)=8

При портировании это надо учитывать!

---

Токи потребления на частоте ядра 456 МГц, SDRAM 152 МГц при выполнении MemTest:

Ядро      1.3V: 210 мА - пиковое значение
Периферия 3.3V:  90 мА - пиковое значение

C6745 и SDRAM слегка тёплые.
LDO на 1.3V сильно тёплый - пиковая рассеиваемая мощность на нём 0.777 Вт = (5 V - 1.3 V)*0.21 A

Как я говорил уже, на отладочной плате предусмотрены перемычки для исключения штатных LDO и запитки от других источников питания - к примеру, от более экономичных DC/DC.

 

Короче, SDRAM работает нормально, что и радует! :)

 

Исходники, весь проект MemTest на CCS:   1_Blink.rar

 

top.png.45b2354d256cad8e11f422e35a111579.png

 

Если кому-то понадобятся платы под этот DSP пишите в личку - в наличии 11 штук пустых плат. Отдам недорого.

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

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


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

2 hours ago, __inline__ said:

Кеширование кода и данных естественно - не задействовано(выключено), чтобы работа с SDRAM была не в пакетном режиме.
Адресное пространство SDRAM (32 МБ) объявлено как volatile, что исключает оптимизацию компилятора - для гарантированного обращения к каждой ячейке памяти.

Что же тут "естественного"? Для полноценного теста нужно работать с памятью максимально быстро.

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


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

3 часа назад, __inline__ сказал:

Короче, SDRAM работает нормально, что и радует! :)

Тесты чтения/записи только. А теста рефреша нет.  :smile:

3 часа назад, __inline__ сказал:

Кеширование кода и данных естественно - не задействовано(выключено), чтобы работа с SDRAM была не в пакетном режиме.

Не понял - у Вас что код теста в SDRAM находится? Если да - то зачем??? Ведь в C6745 вроде внутренняя ОЗУ есть.

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


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

2 hours ago, aaarrr said:

Что же тут "естественного"? Для полноценного теста нужно работать с памятью максимально быстро.

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

57 minutes ago, jcxz said:

Тесты чтения/записи только. А теста рефреша нет.  :smile:

Не понял - у Вас что код теста в SDRAM находится? Если да - то зачем??? Ведь в C6745 вроде внутренняя ОЗУ есть.

Тест рефреша - это как? Каков его алгоритм? Хочу добавить!

Код находится там куда загрузчик ROM загрузил.  В SDRAM пока находтся абстрактные данные.  В будущем буду грузить туда мега-тонные программы

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


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

1 час назад, __inline__ сказал:

Тест рефреша - это как? Каков его алгоритм? Хочу добавить!

У меня в практике был случай когда в плате оказался дефектный чип DRAM. Все штатные тесты памяти ошибок в нём не обнаруживали. Но если в нём расположить код или данные - ПО глючило. После разбирательств я установил, что запись данных в него и последующее после записи первое чтение проходили нормально, но вот или второе или последующие чтения - возвращало мусор. Не всегда разрушение происходило при втором чтении, иногда оно давало ещё валидные данные. А штатные тесты делали просто запись и потом одно чтение/сравнение - поэтому не обнаруживали такого дефекта чипа.

Как я понимаю работу DRAM: при каждом чтении ячейки, содержимое её разрушается и DRAM должна его переписать обратно. Вот этот узел в том чипе и не работал.

С тех пор я во всех тестах DRAM делаю многократное чтение после записи.

Цитата

Код находится там куда загрузчик ROM загрузил.  В SDRAM пока находтся абстрактные данные.  В будущем буду грузить туда мега-тонные программы

Нет - код находится там, куда Вы указали при сборке .ais-образа. :smile:  Если Вы указали внутреннюю ОЗУ, то смысла включать кеширование кода особого нет. Ну будет незначительный эффект если закешировать 2-х или 3-х тактную внутреннюю ОЗУ, но практически незаметный (по моему опыту OMAP L137). Так что и обращать внимание "включен" или "выключен" кеш кода - тоже смысла нет.

А если Вы слинковали код в .ais - в SDRAM, то это как-то странно для кода теста SDRAM.

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


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

11 minutes ago, jcxz said:

Нет - код находится там, куда Вы указали при сборке .ais-образа. :smile:  Если Вы указали внутреннюю ОЗУ, то смысла включать кеширование кода особого нет. Ну будет незначительный эффект если закешировать 2-х или 3-х тактную внутреннюю ОЗУ, но практически незаметный (по моему опыту OMAP L137). Так что и обращать внимание "включен" или "выключен" кеш кода - тоже смысла нет.

А если Вы слинковали код в .ais - в SDRAM, то это как-то странно для кода теста SDRAM.

Разве в AISgen можно указать стартовый адрес для кода?  Картинка ниже.

Может имели в виду, что CMD-файл надо править, где расписаны регионы и их адреса?

Пользуясь случаем задам вопрос, как можно базовые адреса секций программы менять?  RO, RW, ZI, Stack, Heap ?

ais.jpg.f90b0142fc7b93e651cea35f66654689.jpg

 

А на счет идеи потестить с рефрешем я понял.  Просто добавить многократное чтение каждой ячейки с проверкой на обнаружения факта разрушения данных в каждой ячейки после первого чтения.

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


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

2 hours ago, __inline__ said:

Включенный кеш делает тест нечестным, так как он минимизирует обращение к памяти.

Ровно наоборот: он весьма "уплотняет" общение с памятью. Если что, видел изделия, где без кэша такие тесты проходили, а с ним - нет.

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


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

3 часа назад, __inline__ сказал:

Может имели в виду, что CMD-файл надо править, где расписаны регионы и их адреса?

Да. Только его надо не править, его надо делать.  Под задачу.  :smile:

Цитата

Пользуясь случаем задам вопрос, как можно базовые адреса секций программы менять?  RO, RW, ZI, Stack, Heap ?

Не понял вопроса.... :scratch_one-s_head:

У секций программы нет адресов, они линкуются компоновщиком в какие-то регионы и в результате получают адреса. А RO, RW - это вообще атрибуты регионов памяти.

Директива MEMORY (.cmd-файла) определяет регионы и их атрибуты, а директива SECTIONS - задаёт какую секцию .obj-файлов в какой регион линковать.

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


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

Рефреш-тест тоже проходит нормально. Делаю 4 чтения каждой ячейки после записи.

Не совсем понятно про кеширование данных.

Надо включить Data Cache.

Нашёл только вот это:

void Enable_DCache(void) //Enable D-Cache
{
 L1DWB=0x01;  //Flush L1D
 L1DCFG=0x07; //Reconfigure L1D to default state (full cache)
}

Подозреваю, этого мало.

А как политику кеша настраивать : Write Back, Write Throw ?

И как закешировать к примеру, только регион SDRAM - все 32 мегабайта начиная с адреса 0xC0000000 ?

Референс мануал ничего по этому поводу не пишет.

Где можно подсмотреть?

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


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

53 минуты назад, __inline__ сказал:

Надо включить Data Cache.

В своих старых исходниках нашёл только это (в самом начале main()):

  CACHE.L1DCFG = 7;
  { u32 i = CACHE.L1DCFG; }
  CACHE.L1DCC = 0;

Видимо конфигурю только кеш данных. Помню что у меня были какие-то проблемы с конфигурением кеша в DSP-ядре. Но потом я все быстрые данные и код DSP-ядра разместил во внутренней памяти и DSP-ядро мало обращалось к SDRAM (с ней работало в основном ARM-ядро). Только при (пере-)инициализации, когда скорость не важна. Поэтому у меня кеш не сильно влиял на работу DSP. И поэтому я глубоко не разбирался с кешем DSP. Только разбирался с кешем ARM.

Цитата

Референс мануал ничего по этому поводу не пишет.

Где можно подсмотреть?

Ну так наверное тут: SPRUG82— TMS320C674x DSP Cache User's Guide.

http://www.ti.com/lit/pdf/sprug82

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


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

Спасибо за помощь.

Вышеприведенного кода оказалось недостаточно для того чтобы закешировать SDRAM.

На гитхабе в ccslearning-master  было упоминание о MAR-регистрах. Поиск вывел меня на даташит: TMS320C674x DSP Megamodule
Оказалось, что эти самые MAR-регистры задают регионы кеширования.

И по дефолту регистры MAR192 и MAR193  (они отвечают за адреса 0xC0000000...0xC1FFFFFF,  которые используются SDRAM ) с выключенным кешированием.

Младший бит этих регистров был  равен 0 (проверял), удалось их установить в 1 (операция привелегированная : требуется SuperVisor Mode, который как оказывается у меня был).

После этого время теста на 32-битных записях уменьшилось в 3 раза!

Попробовал убрать инит MAR-регистров, всё вернулось как без кеширования.

Полная функция включения кеша L1D для SDRAM 32 МБ на EMIFB - выглядит так:

void Enable_DCache(void) //Enable D-Cache
{
 L1DWB=0x01;  //Flush L1D
 L1DCFG=0x07; //Reconfigure L1D to default state (full cache)

 MAR192=0x00000001; //0xC0000000..0xC0FFFFFF cacheble
 MAR193=0x00000001; //0xC1000000..0xC1FFFFFF cacheble
}

Про кеширование доки слишком сложные, для моего понимания, а вот хочется максимально выжать  с внешней памяти производительность на чтение-запись данных и выполнение кода.

Так как  внутренней памяти мне не хватит - она пойдет под стек, кучу и DMA.

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

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


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

Ещё задействовал L2 в качестве кеша (максимально получилось оттяпать 128кБ, при  256 кБ программа не запускается, потому что она перетирается кешем L2):

 L2CFG=0x3;   //128 kB L2

Итого время тестов сократилось ещё на 24%.

 

Вот бы ещё L1P для кода задействовать.   И что важно перед тем как туда (на внешнюю память) прыгнуть, надо сбросить L1D (flush) чтобы конец образа программы гарантированно лег в SDRAM. Я на Блекфинах на этом моменте собаку съел )) использовал flush_data_buffer()

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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