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

Allwinner T113-s3 уделал HiFi4 DSP. Смеяться или плакать?

On 9/1/2022 at 12:50 PM, GenaSPB said:

делать после записи чтение или DSB

делать после -  это очередные грабли если используются прерывания или переключения задач

запись1

irq -> запись2, dsb2()

dsb1()

 

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


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

Dsb не адресной... а обратное чтение подитоживает выдачу данных перед использованием результата 

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


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

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

Дабы гарантированно соблюсти всю последовательность выполнения кода, вынужден перед каждой строчкой кода добавить барьер для компилятора, оформленный в макрос:

#define MB asm volatile ("" ::: "memory");

По сути - это пустышка, которая заставляет компилятор делать инструкции в указанном порядке.

Интересно, а как сделать такой барьер в ARMCC, CLANG, IAR CC ? :biggrin: Или только GCC может переставлять местами строчки кода?

 

Пример обработчика прерывания с добавленными барьерами перед каждой инструкцией:

s32 CSI1_Handler(void *arg)
{
 MB bsp_csi_set_addr(0,(u32)&buf[csi_offset^FI.frm_byte_size]);

 MB bsp_csi_int_clear_status(0,0,CSI_INT_FRAME_DONE);

 MB if(frame==(u32)-1)goto end;

 MB cache_inv_range((u32)&buf[csi_offset],((u32)&buf[csi_offset])+FI.frm_byte_size);

 MB memcpy(input_buf,&buf[csi_offset],FI.frm_byte_size);

 MB csi_offset^=FI.frm_byte_size;

 MB int r=h264enc_encode_picture(encoder);

 MB if(!r)
 {
  MB CSI_Stop();
  MB printf("Encode error\n");
  MB while(1);
 }

 MB u32 length=h264enc_get_bytestream_length(encoder);

 MB static u32 nf=0;
 MB nf++;

 MB if(ve_offset>=BUF_SIZE)
 {
  MB CSI_Stop();
  MB printf("Buffer overflow\n");
  MB while(1);
 }

 MB memcpy(&VEBuffer[ve_offset],output_buf,length);

 MB ve_offset+=length;

 MB if(nf>=NF)
 {

  MB if(!WriteFlag)
  {
   MB CSI_Stop();
   MB printf("File collision\n");
   MB while(1);
  }

  MB SDLength=ve_offset&(~(SD_BOUND-1));

  MB if(SDLength)
  {
   MB printf("%.1f ms\n\n",ft);

   MB printf("%d bytes\n",SDLength);

   MB MEMCPY(SDBuffer,VEBuffer,SDLength); //!!! 64-byte align !!!

   MB ve_offset-=SDLength;

   MB memmove(VEBuffer,&VEBuffer[SDLength],ve_offset);

   MB nf-=NF;

   MB CSI1_Flag=1;
  }

 }

 end:

 MB frame++;

 MB return 0;
}

 

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

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


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

Volatile не?

А если не имеет побочных эффектов то вполне может переупорядочить

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


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

2 minutes ago, GenaSPB said:

Volatile не?

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

 

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

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


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

4 minutes ago, repstosw said:

Пример обработчика прерывания с добавленными барьерами перед каждой инструкцией

Уместнее привести пример некорректного поведения с листингом.

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


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

Запустил  камеру OV5640 на V3s пока через DVP, следующий шаг - запустить её через MIPI CSI-2 (что уже было сделано с другой камерой OV5647).

Пришлось повозиться с инитом этой камеры (инит там не простой).

Субъективно, качество изображение этой камеры лучше, чем у OV2640.

Есть проблема:  справа в середине постоянно пятно из белых пикселей, никак не убирается: снимал в темноте, пятно не исчезает.  Что это может быть?  Битая матрица?

На любом разрешении камеры.

Модуль WaveShare, заказывал в electronshik.ru (дочка "ТерраЭлектроника").

Картинки ниже:

t.png.3dd8c18fa9d688efd2007c176f18edea.png image.png.c52e5662489885deb73211cfbb312bbd.png

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

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


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

В 01.09.2022 в 13:45, repstosw сказал:

Интересно, а как сделать такой барьер в ARMCC, CLANG, IAR CC ? :biggrin: Или только GCC может переставлять местами строчки кода?

Другие тоже умеют.

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


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

20 hours ago, repstosw said:

следующий шаг - запустить её через MIPI CSI-2

Пока эта камера работать не хочет на MIPI.

Есть ли способ по-быстрому с помощью мультиметра или частотомера узнать, есть ли тактовый сигнал с диф-пары камеры ?   Показания частотомера хаотично бегают, не устаканиваются.

Как подключать щуп - оба вывода на диф-пару или: один вывод на диф-пару, а второй на GND ? Или как вообще?

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

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


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

1 hour ago, repstosw said:

Есть ли способ по-быстрому с помощью мультиметра или частотомера узнать, есть ли тактовый сигнал с диф-пары камеры ?

Нет.

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


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

3 hours ago, aaarrr said:

Нет.

Мультиметр показывает 0 В, если мерять напряжение на любой диф-паре.

Если мерять напряжение относительно GND, то на любом выводе диф-пары тактового сигнала напряжение 0,2V.

Если мерять напряжение относительно GND, то на любом выводе диф-пары лейна данных напряжение 0,3 .. 1,2 V. 

Причем на одном лейне преимущественно малые напряжения от 0,3V и выше, а на втором лейне - от 1,2V и ниже.

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


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

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

Если мерять напряжение относительно GND, то на любом выводе диф-пары тактового сигнала напряжение 0,2V.

Не должно быть такое на тактовой линии, около вольта - это норм, судя по LVDS дисплею...

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


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

9 minutes ago, mantech said:

Не должно быть такое на тактовой линии, около вольта - это норм, судя по LVDS дисплею...

Точно?

image.thumb.png.12b65a7c6aafb9649b24f0cf25793e54.png

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


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

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

Точно?

В LVDS дисплеях да, как и нарисовано тут 1.2В, что там в MIPI - тут спорить не буду, но ИМХО, 0.2В это мало.

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


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

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

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

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

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

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

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

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

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

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