sasamy 3 1 сентября, 2022 Опубликовано 1 сентября, 2022 · Жалоба On 9/1/2022 at 12:50 PM, GenaSPB said: делать после записи чтение или DSB делать после - это очередные грабли если используются прерывания или переключения задач запись1 irq -> запись2, dsb2() dsb1() Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 1 сентября, 2022 Опубликовано 1 сентября, 2022 · Жалоба Dsb не адресной... а обратное чтение подитоживает выдачу данных перед использованием результата Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 1 сентября, 2022 Опубликовано 1 сентября, 2022 (изменено) · Жалоба Коль уж здесь заговорили об очерёдности, добавлю, что компилятор также может нарушить очерёдность выполнения вызовов. Столкнулся с этим в обработчике прерывания с максимальным уровнем оптимизации. Дабы гарантированно соблюсти всю последовательность выполнения кода, вынужден перед каждой строчкой кода добавить барьер для компилятора, оформленный в макрос: #define MB asm volatile ("" ::: "memory"); По сути - это пустышка, которая заставляет компилятор делать инструкции в указанном порядке. Интересно, а как сделать такой барьер в ARMCC, CLANG, IAR CC ? Или только 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; } Изменено 1 сентября, 2022 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 1 сентября, 2022 Опубликовано 1 сентября, 2022 · Жалоба Volatile не? А если не имеет побочных эффектов то вполне может переупорядочить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 1 сентября, 2022 Опубликовано 1 сентября, 2022 (изменено) · Жалоба 2 minutes ago, GenaSPB said: Volatile не? Все переменные, которые меняются в обработчике и используются в программе - заволатайлены. Изменено 1 сентября, 2022 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 1 сентября, 2022 Опубликовано 1 сентября, 2022 · Жалоба Volatile не переупоряочиваются Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 1 сентября, 2022 Опубликовано 1 сентября, 2022 · Жалоба 4 minutes ago, repstosw said: Пример обработчика прерывания с добавленными барьерами перед каждой инструкцией Уместнее привести пример некорректного поведения с листингом. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 2 сентября, 2022 Опубликовано 2 сентября, 2022 (изменено) · Жалоба Запустил камеру OV5640 на V3s пока через DVP, следующий шаг - запустить её через MIPI CSI-2 (что уже было сделано с другой камерой OV5647). Пришлось повозиться с инитом этой камеры (инит там не простой). Субъективно, качество изображение этой камеры лучше, чем у OV2640. Есть проблема: справа в середине постоянно пятно из белых пикселей, никак не убирается: снимал в темноте, пятно не исчезает. Что это может быть? Битая матрица? На любом разрешении камеры. Модуль WaveShare, заказывал в electronshik.ru (дочка "ТерраЭлектроника"). Картинки ниже: Изменено 2 сентября, 2022 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 2 сентября, 2022 Опубликовано 2 сентября, 2022 · Жалоба В 01.09.2022 в 13:45, repstosw сказал: Интересно, а как сделать такой барьер в ARMCC, CLANG, IAR CC ? Или только GCC может переставлять местами строчки кода? Другие тоже умеют. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 3 сентября, 2022 Опубликовано 3 сентября, 2022 (изменено) · Жалоба 20 hours ago, repstosw said: следующий шаг - запустить её через MIPI CSI-2 Пока эта камера работать не хочет на MIPI. Есть ли способ по-быстрому с помощью мультиметра или частотомера узнать, есть ли тактовый сигнал с диф-пары камеры ? Показания частотомера хаотично бегают, не устаканиваются. Как подключать щуп - оба вывода на диф-пару или: один вывод на диф-пару, а второй на GND ? Или как вообще? Изменено 3 сентября, 2022 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 3 сентября, 2022 Опубликовано 3 сентября, 2022 · Жалоба 1 hour ago, repstosw said: Есть ли способ по-быстрому с помощью мультиметра или частотомера узнать, есть ли тактовый сигнал с диф-пары камеры ? Нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 3 сентября, 2022 Опубликовано 3 сентября, 2022 · Жалоба 3 hours ago, aaarrr said: Нет. Мультиметр показывает 0 В, если мерять напряжение на любой диф-паре. Если мерять напряжение относительно GND, то на любом выводе диф-пары тактового сигнала напряжение 0,2V. Если мерять напряжение относительно GND, то на любом выводе диф-пары лейна данных напряжение 0,3 .. 1,2 V. Причем на одном лейне преимущественно малые напряжения от 0,3V и выше, а на втором лейне - от 1,2V и ниже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 42 3 сентября, 2022 Опубликовано 3 сентября, 2022 · Жалоба 16 минут назад, repstosw сказал: Если мерять напряжение относительно GND, то на любом выводе диф-пары тактового сигнала напряжение 0,2V. Не должно быть такое на тактовой линии, около вольта - это норм, судя по LVDS дисплею... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 3 сентября, 2022 Опубликовано 3 сентября, 2022 · Жалоба 9 minutes ago, mantech said: Не должно быть такое на тактовой линии, около вольта - это норм, судя по LVDS дисплею... Точно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 42 3 сентября, 2022 Опубликовано 3 сентября, 2022 · Жалоба 1 час назад, repstosw сказал: Точно? В LVDS дисплеях да, как и нарисовано тут 1.2В, что там в MIPI - тут спорить не буду, но ИМХО, 0.2В это мало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться