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

C6745 и PRUSS

Запустил PRU0 в TMS320C6745, по крайней мере останавливается и считывает счётчик инструкции.

 

Компилятор ti-cgt-pru_2.3.1 - виснет, падла в этом месте - когда программный счётчик =5:

 

#pragma DATA_ALIGN(PRU_CODE,4)
const u8 PRU_CODE[0x1000]=
{
    0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00,
    0xc0, 0x00, 0x00, 0x24, 
    0x80, 0x48, 0x00, 0x24,
    0xe2, 0xe0, 0x04, 0x05,
    0x8e, 0x81, 0xff, 0x2e, //5 => зависон
    0xc3, 0x0d, 0x00, 0x23,
    0xee, 0x01, 0x00, 0x24,
    0xc3, 0x09, 0x00, 0x23, 
    0xc3, 0x0b, 0x00, 0x23,
    0x00, 0x0a, 0x00, 0x21,
    0x00, 0x00, 0x00, 0x10, 
    0x00, 0x00, 0xc3, 0x20,
    0x00, 0x00, 0x00, 0x2a, //HALT
    0x00, 0x0e, 0x00, 0x21, //Loop: goto Loop;

Залез в MAP-файл,  это подгаживает функция - _c_int00_noinit_noargs  - до main() так и не доходит!

Вот здесь виснет и не останавливается:

    0x8e, 0x81, 0xff, 0x2e, //5 => зависон

Сишный код самый простой что есть:

void main(void)
{
 __halt();
 Loop:
 goto Loop;
}

Не выходит по останову - до Halt так и не добирается!

Зато если сделать в самом начале оп-код halt:

#pragma DATA_ALIGN(PRU_CODE,4)
const u8 PRU_CODE[0x1000]=
{
    0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x2a, //HALT

То успешно останавливается и цикл в главной программе заканчивается:

 while(PRU0_CONTROL&(1<<15)) //if RUNSTATE=1 wait...

Выходит компилятор C делает что-то недопустимое и он для ситар с бигл-бонами,  но никак не для C6745 ???

PASM наше всё?

 

Программный счетчик (там где в настоящий момент фетчится код) - смотрю в младших 16 битах регистра: PRU0_STATUS

 

Вот тут ТП-Мелисса (других слов не нахожу) из TI так и не сумела объяснить причину зависона у аналогичного товарища:

https://e2e.ti.com/support/processors/f/791/p/752634/2786060

 

Ну и до кучи привожу скрипт линковщика для PRU0:

-cr                                             /* LINK USING C CONVENTIONS      */
/* -stack  0x8000 */                            /* SOFTWARE STACK SIZE           */
/* -heap   0x8000 */                            /* HEAP AREA SIZE                */
/* --args 0x100   */

/* SPECIFY THE SYSTEM MEMORY MAP */

MEMORY
{
 PAGE 0:
 TEXT: org=0x00000008 len=0x00000FF8

 PAGE 1:
 DATA: org=0x00000008 len=0x000001F8
}

/* SPECIFY THE SECTIONS ALLOCATION INTO MEMORY */

SECTIONS
{
	/* Forces _c_int00 to the start of PRU IRAM. Not necessary when loading
	   an ELF file, but useful when loading a binary */

	.text:_c_int00* : {}	>  0x8 , PAGE 0

	.text	      : {}	>  TEXT, PAGE 0

	.stack	      : {}	>  DATA, PAGE 1
	.bss	      : {}	>  DATA, PAGE 1
	.cio	      : {}	>  DATA, PAGE 1
	.data	      : {}	>  DATA, PAGE 1 palign=2
	.switch	      : {}	>  DATA, PAGE 1
	.sysmem	      : {}	>  DATA, PAGE 1
	.cinit	      : {}	>  DATA, PAGE 1
	.rodata	      : {}	>  DATA, PAGE 1
	.rofardata    : {}	>  DATA, PAGE 1
	.farbss	      : {}	>  DATA, PAGE 1
	.fardata      : {}	>  DATA, PAGE 1

	.resource_table : {} >  DATA, PAGE 1

        .init_array : {} > DATA, PAGE 1
        .args       : {} > DATA, PAGE 1     
}

Стек и куча задается в опциях линковщика - по 64 байта на каждый.

А вот как бью эльфа(ELF) на 2 региона - код и данные:

-b
-image

ROMS
{
 PAGE 0:
 text: o=0x0, l=0x1000, files={text.bin}

 PAGE 1:
 data: o=0x0, l=0x0200, files={data.bin}
}

 

Но чего-то не фурычит как надо.

Спецы, поможите!!!

 

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

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


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

Ну что, други! :)))  

Проблема успешно решена уже  в третьей теме самостоятельно!

Форум умер или вопрос теребует сверх-компетенции?

 

Проблема была в силиконовой версии Run-time библиотеки.  Надо ставить самую первую: rtspruv1_le.lib - с ней всё заработало.

v2,v3 не идут с C6745. (rtspruv2_le.lib  и rtspruv3_le.lib)

Сравнил бинарные образы - да, различаются несколько байт.

Вполне возможно что допустимо в поздних силиконовых ревизиях - недопустимо в первой.

 

Для проверки работы PRU вот такой код использую:

void delay(volatile unsigned int d)
{
 while(d--);
}

void main(void)
{
 delay(10000000);
 __halt();
}

Что даёт задержку на доли секунды.

Двоичный образ кода:

#pragma DATA_ALIGN(PRU_CODE,4)
const u8 PRU_CODE[0x1000]=
{
    0xc0, 0x00, 0x00, 0x24, 0x80, 0x80, 0x00, 0x24, 0xe2, 0xe0, 0x04, 0x05, 
    0xee, 0x00, 0x00, 0x24, 0xc3, 0x16, 0x00, 0x23, 0xee, 0x01, 0x00, 0x24, 
    0xc3, 0x1c, 0x00, 0x23, 0xe2, 0xe2, 0x04, 0x05, 0x8e, 0x22, 0x00, 0xe1, 
    0x80, 0x22, 0x00, 0xf1, 0xe0, 0xe0, 0x01, 0x05, 0x80, 0x22, 0x00, 0xe1, 
    0x00, 0x10, 0x00, 0x21, 0x80, 0x22, 0x00, 0xf1, 0xe0, 0xe0, 0x01, 0x05, 
    0x80, 0x22, 0x00, 0xe1, 0xc0, 0xff, 0xff, 0x24, 0x80, 0xff, 0xff, 0x24, 
    0x81, 0x22, 0x00, 0xf1, 0xfa, 0xe0, 0xe1, 0x6e, 0xe2, 0xe2, 0x04, 0x01, 
    0x00, 0x00, 0xc3, 0x20, 0x83, 0xc3, 0xc3, 0x10, 0xce, 0x98, 0x00, 0x24, 
    0x8e, 0x80, 0x96, 0x24, 0xc3, 0x07, 0x00, 0x23, 0x00, 0x00, 0x00, 0x2a, 
    0x00, 0x00, 0x83, 0x20, 0xc3, 0x1e, 0x00, 0x23, 0x00, 0x1d, 0x00, 0x21, 
    0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xc3, 0x20, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 

//....дальше нули
};

 

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


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

Заказал PocketBeagle c Ситарой и этим самым PRUSS. Скоро присоединюсь к страдающим фигней )) Проектик просто понравился в сети на этой Ситаре, на PRUSS выжимают 100 МГц логического анализатора на 16 каналов.

https://beaglelogic.readthedocs.io/en/latest/

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


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

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

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

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

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

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

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

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

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

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