Arlleex 173 18 октября, 2023 Опубликовано 18 октября, 2023 · Жалоба 4 часа назад, repstosw сказал: Это точно, что в этих случаях каждый элемент массива будет volatile? Или только имя массива? 100% 4 часа назад, repstosw сказал: Для DSP барьер памяти : memw, для CPU - инструкция DSB У Cortex-M аж три CPU инструкций барьеров: DMB, DSB, ISB. В Вашем, думаю, около того же... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 1 18 октября, 2023 Опубликовано 18 октября, 2023 (изменено) · Жалоба On 10/18/2023 at 4:05 AM, repstosw said: Они тормозят ядро? время на синхронизацию конечно требуется, в мануале написано так Quote Lock time of the processor is predictable (less than 200 cycles) On 10/18/2023 at 4:05 AM, repstosw said: Тогда не подходит. То, что флаг установился/сбросился, это ещё недостаточно, чтобы тормозить ядро. Потому что оно кроме этого ещё некоторые вещи делает. вообще не очень понятно как вам может подойти ядро которое считает в несколько раз медленней судя по вашим тестам и при этом вы будете поллить результат на более быстром ядре. В чём смысл ? Я бы ещё понял что считается параллельно пока CPU что-то делает другое полезное и прерывается по готовности результата аппаратно. Кстати а сброс кеша по вашему мгновенный ? Quote cache_flush_range((u32)RSC,((u32)RSC)+fsize); или это другое 🙂 Изменено 18 октября, 2023 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 18 октября, 2023 Опубликовано 18 октября, 2023 · Жалоба 4 часа назад, repstosw сказал: Это точно, что в этих случаях каждый элемент массива будет volatile? Или только имя массива? Имя массива не может быть volatile. Как и имя любой другой переменной. Оно имя. volatile относится к содержимому переменной/массива. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 18 октября, 2023 Опубликовано 18 октября, 2023 (изменено) · Жалоба 5 hours ago, sasamy said: вообще не очень понятно как вам может подойти ядро которое считает в несколько раз медленней судя по вашим тестам и при этом вы будете поллить результат на более быстром ядре. В чём смысл ? Я бы ещё понял что считается параллельно пока CPU что-то делает другое полезное и прерывается по готовности результата аппаратно. ARM CPU 0 - кодер Рида-Соломона. 34 FPS ARM CPU 1 - декодер Рида-Соломона 15 FPS HiFI4 DSP - главная программа + JPEG encoder/decoder(аппаратно), CELT coder/decoder (софтово), эхоподавитель(софтово), G2D(аппаратно), захват с камеры(аппаратно), ADC/DAC(аппаратно). Сделал HiFi4 DSP главным, потому что Рида-Соломона он не вывозит на 12 FPS. Зато на остальное его хватает. Нужно одновременно кодирование и декодирование на 12..15 FPS. 34 FPS + 15 FPS = 10.4 FPS < 12..15 FPS Итого: все ТРИ ядра активны. 5 hours ago, Сергей Борщ said: Имя массива не может быть volatile. Как и имя любой другой переменной. Оно имя. volatile относится к содержимому переменной/массива. А если указатель volatile? Что в этом случае что изменчиво - само значение указателя (адрес) или содержимое памяти (при разыменовывании) , на которое указывает этот указатель? 5 hours ago, sasamy said: Кстати а сброс кеша по вашему мгновенный ? Quote cache_flush_range((u32)RSC,((u32)RSC)+fsize); или это другое 🙂 И сколько времени надо ждать, прежде чем другое ядро сможет обращаться к этим данным? Изменено 18 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 173 18 октября, 2023 Опубликовано 18 октября, 2023 · Жалоба 57 минут назад, repstosw сказал: А если указатель volatile? Что в этом случае что изменчиво - само значение указателя (адрес) или содержимое памяти (при разыменовывании) , на которое указывает этот указатель? Если сам указатель volatile, то, естественно, с точки зрения компилятора "изменчив" будет только он, а не то, куда он показывает. u32 volatile *p = (какой-то адрес); // указатель на volatile: например, периферийный регистр u32 *volatile p = (какой-то адрес); // вот этот вот "какой-то адрес" нельзя оптимизировать; например, ISR "двигает" позиции программного FIFO 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 1 18 октября, 2023 Опубликовано 18 октября, 2023 · Жалоба On 10/18/2023 at 2:18 PM, repstosw said: Сделал HiFi4 DSP главным тогда понятно On 10/18/2023 at 2:18 PM, repstosw said: И сколько времени надо ждать, прежде чем другое ядро сможет обращаться к этим данным? нисколько, с двумя разнородными ядрами вам надо постоянно синхронизировать кеши с памятью на разных ядрах и это ненулевые задержки - этого не нужно если бы всё делать на arm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 18 октября, 2023 Опубликовано 18 октября, 2023 · Жалоба 24 минуты назад, sasamy сказал: этого не нужно если бы всё делать на arm Или (в качестве shared memory) использовать внутреннюю ОЗУ. Доступную всем ядрам. Без всяких кешей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 18 октября, 2023 Опубликовано 18 октября, 2023 (изменено) · Жалоба 1 hour ago, Arlleex said: u32 volatile *p = (какой-то адрес); // указатель на volatile: например, периферийный регистр u32 *volatile p = (какой-то адрес); // вот этот вот "какой-то адрес" нельзя оптимизировать; например, ISR "двигает" позиции программного FIFO Какой из ваших двух примеров будет означать буфер с изменчивыми данными? Нужен буфер с volatile-содержимым. Статический массив не подходит, потому что длина может меняться. Указатель на массив - тоже не годится : потому что надо указывать размер: char (*mem)[256]; Изменено 18 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 173 18 октября, 2023 Опубликовано 18 октября, 2023 · Жалоба 4 часа назад, repstosw сказал: Какой из ваших двух примеров будет означать буфер с изменчивыми данными? Нужен буфер с volatile-содержимым. Статический массив не подходит, потому что длина может меняться. u32 volatile *..., т.е. указатель на volatile. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 23 октября, 2023 Опубликовано 23 октября, 2023 (изменено) · Жалоба On 10/18/2023 at 1:21 AM, Сергей Борщ said: int volatile * volatile pd; // volatile-указатель на volatile-int Шедевр! Никогда не встречал такой конструкции. On 10/18/2023 at 10:50 PM, jcxz said: Или (в качестве shared memory) использовать внутреннюю ОЗУ. Доступную всем ядрам. Без всяких кешей. У Allwinner можно закешировать SRAM A1 и не только. И она быстрее работает. Хотя по логике вещей скорость не должна была измениться (как у того же TMS320C6745) Изменено 23 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 23 октября, 2023 Опубликовано 23 октября, 2023 · Жалоба 38 минут назад, repstosw сказал: У Allwinner можно закешировать SRAM A1 и не только. И она быстрее работает. Ну так - не кешировать её. Зачем кешировать расшаренную память, используемую для межъядерного обмена? Выигрыш - копейки (или вообще нет), а проблем сами же себе создаёте вагон. PS: В OMAP-L137 для межъядерного обмена я использовал L2-RAM. И мне даже в голову не приходила мысль кешировать её. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 23 октября, 2023 Опубликовано 23 октября, 2023 · Жалоба 38 minutes ago, jcxz said: Ну так - не кешировать её. Зачем кешировать расшаренную память, используемую для межъядерного обмена? Выигрыш - копейки (или вообще нет), а проблем сами же себе создаёте вагон. Что определяет расшаренную память? Мануал на контроллер или бит SHARED в MMU ? Вопрос в контексте Cortex A7. Конкретнее T113-s3. В мануале перечислены адреса памяти. Некоторые адреса подключены к Internal Bus DSP, от того и быстрые. Может ли она быть SHARED? Для ARM CPU Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 23 октября, 2023 Опубликовано 23 октября, 2023 · Жалоба 1 минуту назад, repstosw сказал: Что определяет расшаренную память? Программист. "расшаренная" - используемая совместно ядрами, для межъядерного обмена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться