С точки зрения программиста еще неизвестно, что лучше: сразу знать, что происходит, или вспоминать карту адресов...
и какие воспоминания каких адресов на вас норовят нахлынуть при виде такого кода?
Код:
TOGGLE_REG_BIT(GPIOC->ODR, GPIO_ODR_ODR13);
в том и красота приведенных макросов, что ни о чем больше не надо заботиться, если хочется щелкнуть каким-нибудь битиком.
VladislavS писал(а):
Во-первых, в R2 и R4 адреса из воздуха материализовались?
пост не о таинстве экономии парочки байтов.
VladislavS писал(а):
Во-вторых, ни на чём кроме некрофильского F1 это не работает, ибо порты не попадают в область BB.
ложное утверждение. еще как работает на F1, F2, F3, F4 и L1. и, да, я считаю, что STM32F103C8T6 по прежнему весьма хорош.
VladislavS писал(а):
В-третьих, опять макросы, которые даже не подумают предупредить что параметры заданы неверно.
разве мысль о том, что в регистр TIM1->CR1 не стоит пихать что-то отличное от TIM_CR1_чегототам, является такой уж сложной для понимания? надо ли увлекаться гиперопекой в этом случае?
Вы не поверите: если всё обернуть в макрос, то и щелканье битиком даже с управлением по интернету через океан ничем от вашего примера отличаться не будет!
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
разве мысль о том, что в регистр TIM1->CR1 не стоит пихать что-то отличное от TIM_CR1_чегототам, является такой уж сложной для понимания? надо ли увлекаться гиперопекой в этом случае?
не надо валить все в одну кучу. когда у меня в коде встречается именованная константа, то я могу навести на нее мышкой и посмотреть значение: а когда я вижу что-то вроде:
я считаю что автор пытается обфусцировать код. потому что: 1. профита от использования bit-banding никакого. 2. при портировании кода на другие архитектуры, все эти макросы придется переписывать. очевидно автор считает, что это будет делать не он.
не надо валить все в одну кучу. когда у меня в коде встречается именованная константа, то я могу навести на нее мышкой и посмотреть значение:
а в моем случае, что вам мешает сделать то же самое? там ровно те же регистры и макроопределения, что и у вас.
Цитата:
1. профита от использования bit-banding никакого.
это серьезное заблуждение. или вы предполагаете, что сидели такие армы и думали, как бы им сделать что нибудь громоздкое и бесполезное, потратив кучу бабла на разработку?
Цитата:
2. при портировании кода на другие архитектуры, все эти макросы придется переписывать. очевидно автор считает, что это будет делать не он.
никогда ничего не портировал, но переписать макросы для замены битбендинга на что-то другое -- это точно будет одна из самых меньших зол портирования.
Если в функцию volatile аргументы передавать, то дополнительные накладные расходы будут... Вообще самую крутую систему я в Pico видел, там атомарные Or/And/Xor работают практические со всеми регистрами, просто смещение к адресам добавляется. И в отличие от BB, время выполнения таких операций такая же как у обычной записи. А у Pico2 для портов есть сопроцессор и чтобы пин затоглить нужно вызвать соответствующую 32-х битную инструкцию которой только номер пина передается, никаких базовых адресов.
А у Pico2 для портов есть сопроцессор и чтобы пин затоглить нужно вызвать соответствующую 32-х битную инструкцию которой только номер пина передается, никаких базовых адресов.
Как видно - тоже просто запись в соответствующий IO-регистр.
Допустим нужно затоглить GP40, значит сначала в регистр записывается 40, это делается 16-ти битной MOVS, а в вашем случае константа более жирная и инструкция скорее всего будет 32-х битная. Далее на Pico идет 32-х битная инструкция сопроцессора, а у вас будет запись в порт, перед этим загрузка адреса этого порта и еще отдельно сам этот адрес, суммарно ~96 бит. Или нет?
Допустим нужно затоглить GP40, значит сначала в регистр записывается 40, это делается 16-ти битной MOVS, а в вашем случае константа более жирная и инструкция скорее всего будет 32-х битная. Далее на Pico идет 32-х битная инструкция сопроцессора, а у вас будет запись в порт, перед этим загрузка адреса этого порта и еще отдельно сам этот адрес, суммарно ~96 бит. Или нет?
Я не знаю архитектуры этого самого Pico, потому не могу сказать про него ничего. Но знаю что у каждой архитектуры есть свои преимущества.
А насчёт "константы 40": Если мне нужно "затугглить" не один бит порта, а скажем = 8 соседних? То на XMC4xxx будет ровно та же самая инструкция записи. Только с другой константой. И toggle будет выполнен одновременно всеми пинами. А на Pico для этого видимо нужно 8 команд? И ни о какой одновременности речи не может идти?
Насчёт выполнения сопроцессором (не знаю что это такое) - манипуляции с пинами на XMC4xxx можно выполнить вообще без процессора. Поручив DMA и таймеру пересылку потока инвертирующих констант в регистр правления GPIO. И не отвлекая основной поток программы от более важных дел. Возможно ли такое на Pico с его сопроцессором?
Посмотрите скриншот в моём сообщении, там видно адрес порта. Не может он там работать. Собственно, и не работает.
беру свои слова назад. по неведомой мне причине заголовочник stm32f303xc.h утверждает, что битбендинг есть, а на самом деле его нет. Спойлер из списка устройств поддерживающих бетбендинг семейство f3 должно вычеркнуть.
А на Pico для этого видимо нужно 8 команд? И ни о какой одновременности речи не может идти?
Нет, для отдельных пинов одни команды, для портов целиком - другие. У Pico2 максимум 48 GPIO, сопроцессору можно передать в качестве аргументов команды две 32-х битных маски и затоглить любые из этих пинов одновременно, т.к. интерфейс сопроцессора 64-х битный. И сопроцессор - это дополнительная фича, у первого Pico его не было, у второго он работает только с M33, а там еще RISC-V есть, потому обычные регистры GPIO позволяющие выполнять атомарные операции тоже есть.
jcxz писал(а):
Насчёт выполнения сопроцессором (не знаю что это такое) - манипуляции с пинами на XMC4xxx можно выполнить вообще без процессора. Поручив DMA и таймеру пересылку потока инвертирующих констант в регистр правления GPIO. И не отвлекая основной поток программы от более важных дел. Возможно ли такое на Pico с его сопроцессором?
Когда в стартапе пишут что-то типа:
Код:
SCB->CPACR |= (3 << 20) | (3 << 22); // set CP10 and CP11 Full Access
то включают сопроцессор для FPU, а у M33+(начиная с какой-то ревизии) появились вендор специфик кастомные инструкции, т.е. возможность добавлять свои сопроцессоры. У Pico часть периферии висит на Single-cycle IO, в том числе порты, потому тут как с M0+/M23, где DMA не работает с портами. С сопроцессором DMA тоже не работает, но зато есть 12 PIO( programmable input/output block) которые специализированны для работы с портами, т.е. DMA гонит данные в PIO, 32 бита за такт!, и там можно одной командой за 1 такт вывести до 32-х бит в порт начиная с указанного пина, параллельно дергая еще до 5-ти других пинов. И у самомого PIO есть 16.8 делитель частоты, так что даже без дополнительного таймера можно скорость вывода настроить и в отличие от DMA c таймером не будет никакого джиттера.
Да есть он там, но по описанной ранее причине не работает с портами и ADC, c остальной периферией должно работать.
занятный прикол: если даташит не содержит упоминания некой фичи, а референс не описывает ее, то это не значит, что в железе ее нет. bit-banding у stm32f3 и stm32l4 описывается в документе под названием: "AN4832 Application note Migrating from STM32F303 line to STM32L4 Series and STM32L4+ Series microcontrollers" и написано там следующее:
Цитата:
Bit-banding on Cortex-M4
STM32F303 line and STM32L4 Series / STM32L4+ Series support bit-banding on the lowest 1 Mbyte of SRAM and on the peripheral memory region.
However the peripherals mapped in this bit-banding region are not the same on each series of products.
The peripherals accessible with bit-banding are: • For STM32F303 line: all the peripherals except FMC, ADC, GPIOx registers. • For STM32L4 Series and STM32L4+ Series: all the peripherals except FSMC, RNG, AES, USB OTG FS, GPIOx, ADC registers.
таким образом, исключенный ранее f3 возвращается в список, плюс еще два семейства: l4 и l4+. похоронщики bit-banding'а посрамлены.
занятный прикол: если даташит не содержит упоминания некой фичи, а референс не описывает ее, то это не значит, что в железе ее нет. bit-banding у stm32f3 и stm32l4 описывается в документе под названием: "AN4832 Application note Migrating from STM32F303 line to STM32L4 Series and STM32L4+ Series microcontrollers"...
BB - это опциональная фича ядра, она и не обязана описываться в DS или RM, для этого есть "Cortex-M4 Generic User Guide" или его ST аналог: "STM32 Cortex-M4 programming manual". Так что сам BB много где есть, даже у некоторых H7, где есть второе ядро M4, но с портами BB работает далеко не везде.
В теме для начинающих лучше бы объяснили, что именно в этом способе доступа к битам вас так возбуждает? Атомарность? Ну, ок, а разве нельзя без этой атомарности решить задачу, где, якобы, атомарность необходима? Можно наверняка! Миллионы устройств на МК без этого битбанга по всему миру изготовлено, и?!
Начинающим важнее понять, в чем фишка, чем просто про эту фишку прочесть
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения