но появляется откуда то странная неравномерность в каждом отсчете по количеству тактов Никаких таймеров и прерываний в программе не задействованы,тактовая 72 МГц
как можно организовать самое быстрое чтение порта за целое количество тактов?
Чтобы F3 читал за целое число тактов должно быть выставлено 0WS, для 72 MHz этого можно добиться выполняя код из CCM RAM, будет 2 такта если компилятор все скомпилит в LDR + STR. По нормальному нужно сразу на ассме и писать:
Код:
asm("LDRB R0, [R1]"); asm("STRB R0, [R2], #1");
Из флеша будет 2.5 такта и больше, в зависимости от величины WS.
Любая разработка начинается с чтения документации и изучения доступных средств разработки. Данный материал целиком посвящен средствам разработки, включая детальные инструкции по запуску вашего первого приложения на BlueNRG-LP. Описана работа с отладкой STEVAL-IDB011V1, набором инструментов и пакетом ПО позволяющим разработчику быстро войти в курс дела.
Что привлекает в SiC по сравнению с кремнием, и какие особенности делают компоненты SiC часто используемыми, несмотря на более высокую стоимость в сравнении с кремниевыми высоковольтными устройствами? – Объясняет специалист ведущего разработчика силовых приборов из карбида кремния, компании Infineon.
Зачем распилили один asm-оператор на множество отдельных??? Чтобы себе в ногу выстрелить? Вы разве не понимаете, что всё это внутри си-функции и компилятор вправе вставить между двумя вашими соседними asm-операторами другие команды, которые попортят содержимое R0,R1? Сам синтаксис asm-оператора сделан так, чтобы в него включить весь код, на входе - загрузив все нужные регистры из переменных, на выходе - выгрузив в переменные. А между двумя соседними асм-операторами сохранность регистров не гарантируется. И вообще - зачем использовать явно-указанные регистры R0,R1,R2? Синтаксис asm-оператора позволяет этого не делать избегая таким образом конфликтов с окружающим си-кодом. И что такое "(idr & 0xFFFF)"? Зачем?
Цитата:
asm("STRH R0, [R2], #1");
Если у Вас массив типа u16, то почему шаг между соседними его элементами делаете 1 байт? Читайте описание системы команд Cortex-M. И почему нет указания компилятору что данные асм-операторы обращаются к памяти? Читайте описание синтаксиса оператора asm!
PS: Да и вообще - такой код лучше в отдельном асм-файле писать.
Это зачем? В чём смысл? Читайте раздел про Calling conventions для своего компилятора.
Novice user взял мой пример кода из старой темы, Calling conventions тут не при чем, регистры нужно сохранять потому что компилятор не отслеживает какие из них меняются в случае использования инлайн ассемблера.
Цитата:
asm("MOV R2, %0" : : "r" (arr));
Разве arr у вас внутри функции - в регистре?
Arr не обязана быть в регистре, "r" указывает на то, что вместо %0 должен быть подставлен регистр. Конкретно этот код скомпилируется в :
Код:
ldr r3, [pc, #764] mov r2, r3
Цитата:
Зачем распилили один asm-оператор на множество отдельных??? Чтобы себе в ногу выстрелить? Вы разве не понимаете, что всё это внутри си-функции и компилятор вправе вставить между двумя вашими соседними asm-операторами другие команды, которые попортят содержимое R0,R1? Сам синтаксис asm-оператора сделан так, чтобы в него включить весь код, на входе - загрузив все нужные регистры из переменных, на выходе - выгрузив в переменные. А между двумя соседними асм-операторами сохранность регистров не гарантируется.
Согласен, надежнее сделать все в виде одного asm оператора, хотя если у него нет выходных операндов, то все asm() неявно являются volatile и не оптимизируются.
Цитата:
И вообще - зачем использовать явно-указанные регистры R0,R1,R2? Синтаксис asm-оператора позволяет этого не делать избегая таким образом конфликтов с окружающим си-кодом.
Обычно такой код используют во всяких осциллах, там важны тайминги и если вместо регистров подставлять что-то другое, то может получится как с загрузкой arr, когда была вставлена дополнительная инструкция, а добавить PUSH/POP вроде как не проблема.
Цитата:
И что такое "(idr & 0xFFFF)"? Зачем?
В половину регистра 32-х битное значение не запихнешь, да компилятор это и не позволит, если оставить просто idr, то получим ошибку: immediate value out of range.
Цитата:
Если у Вас массив типа u16, то почему шаг между соседними его элементами делаете 1 байт? Читайте описание системы команд Cortex-M. И почему нет указания компилятору что данные асм-операторы обращаются к памяти? Читайте описание синтаксиса оператора asm!
Novice user взял мой пример кода из старой темы, Calling conventions тут не при чем, регистры нужно сохранять потому что компилятор не отслеживает какие из них меняются в случае использования инлайн ассемблера.
Не отслеживает он потому, что написано через одно место. Не надо внутри asm() использовать явно заданные регистры. И тогда компилятор всё нормально отследит. Ну по крайней мере в IAR так.
Согласен, надежнее сделать все в виде одного asm оператора, хотя если у него нет выходных операндов, то все asm() неявно являются volatile и не оптимизируются.
Оптимизация тут не при чём. Причину Вы сам привели выше. Когда в предыдущем asm() не указали явно как грузить адрес arr и компилятор сделал это через доп. регистр. Повезло что R3 до этого не был использован в предыдущих asm(). Иначе - попортил бы его, возможно.
Обычно такой код используют во всяких осциллах, там важны тайминги и если вместо регистров подставлять что-то другое, то может получится как с загрузкой arr, когда была вставлена дополнительная инструкция, а добавить PUSH/POP вроде как не проблема.
Так я же говорю не про подстановку "чего-то другого", а про подстановку тех же регистров, но без явного указания номера регистра. Чтобы компилятор сам его выбирал, не конфликтуя с окружающим си-кодом.
В половину регистра 32-х битное значение не запихнешь, да компилятор это и не позволит, если оставить просто idr, то получим ошибку: immediate value out of range.
Ничего не понял. Причём тут половина регистра?? В idr вроде как - адрес порта GPIO. Что делает "asm("MOVW R1, %0" : : "n" (idr & 0xFFFF));"? Берёт от адреса младшие 16 бит и потом с получившегося адреса пытается читать? И что будет?
Явные регистры лучше не использовать. Тем более что все возможности для этого есть. А также не указано, что внутри этого asm() есть обращение к памяти. А это очень важно при использовании оптимизации. Вот пример как я делаю:
я оттуда и взял код прошу воздержаться от ответов в этой теме-толку от вас нет,уважаемый ЧЕЛОВЕК!!!или дайте конкретный ответ по теме,если на что-то способны кроме как обозвать обезъяной или что вы там имеете ввиду
Добавлено after 14 minutes 6 seconds: Re: CooCox STM32F303 быстрое чтение порта Прошу администраторов закрыть тему Буду прорываться сам,всех благодарю за участие (и ЧЕЛОВЕКУ jcxz в особенности)
я оттуда и взял код прошу воздержаться от ответов в этой теме-толку от вас нет,уважаемый ЧЕЛОВЕК!!!или дайте конкретный ответ по теме,если на что-то способны кроме как обозвать обезъяной или что вы там имеете ввиду
Странно... вроде помогал, писал, пояснял... В ответ - какие-то обиды, да ещё 4 минуса влепили. Причём по всему форуму похоже прошли чтобы найти мои сообщения. И не лень было хе$#@й заниматься? Может лучше стоило это время потратить на хотя бы минимальное изучения вопроса и поднятия своего уровня компетенции с уровня плинтуса? Или у вас критические дни?? Все остальные поняли мои посты, но до вас похоже так и не дошло. После таких "благодарностей" и желания никакого нет помогать таким как вы - бродите и дальше в своих 3-х соснах... адье!
и чем вы помогли? обозвали обезъяной? ваш срач после той строки даже читать не стал насчет минусов-вы заслужили,если вы себя считаете ЧЕЛОВЕКОМ,а всех остальных обезъянами или кем там,плюса вы точно не заслужили
Добавлено after 1 minute 57 seconds: буду лепить FIFO буфер,с такими ЧЕЛОВЕКАМИ как jcxz далеко не уедешь
и чем вы помогли? обозвали обезъяной? ваш срач после той строки даже читать не стал насчет минусов-вы заслужили,если вы себя считаете ЧЕЛОВЕКОМ,а всех остальных обезъянами или кем там,плюса вы точно не заслужили
"уважаемый" у вас с головой всё в порядке?? Где я вас или кого-то ещё обезьяной назвал? Или ещё как-то обзывал? А то что вы изволили назвать "срачем" - была попытка помочь вам же. Если у вас не хватает ума осмыслить советы - я тут не виноват. Да, грешен, больше помогать не буду пытаться.
jcxz, то рабочий код, он работал когда я его показывал в другой теме и сегодня я тоже его проверял. Соответственно никакой MOVW ничего там не читает из 16-ти битного адреса, MOVW и MOVT работают с 16-ти битными константами, константа туда и передается(после компиляции будет: movw r1, #1040). Просто там все делается явно, но конечно можно дать компилятору распределять регистры самостоятельно, это должно быть проще и пару байт он на этом должен сэкономить
jcxz, то рабочий код, он работал когда я его показывал в другой теме и сегодня я тоже его проверял. Соответственно никакой MOVW ничего там не читает из 16-ти битного адреса, MOVW и MOVT работают с 16-ти битными константами, константа туда и передается
Читает не MOVW, а LDR после него. В том недоразумении, которое трудно назвать кодом, выложенном этим несчастным обиженным человеком. Вы откройте тот файл, что он сюда постил - увидите. Я говорил про тот код.
Про Ваш код я ничего не говорил, у Вас с адресом всё нормально.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения