|
Как лучше описать регистры, оставить как есть в uint32_t или в битовых полях |
|
|
|
Aug 8 2014, 21:43
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Доброго времени Есть у меня некий хидер для LPC177x Там описан volatile регистр, к примеру IOCON, потом регистр пина, к которым доступ примерно такой - LPC_IOCON->P0_0 = xxx; Я тут устал считать биты, описал в виде полей типы вот так: Код typedef struct { union { __IO uint32_t D_IOCON; struct { __IO uint32_t FUNC : 3; __IO uint32_t MODE : 2; __IO uint32_t HYS : 1; __IO uint32_t INV : 1; uint32_t RESERVED0 : 2; __IO uint32_t SLEW : 1; __IO uint32_t OD : 1; uint32_t RESERVED1 : 21; }; }; } LPC_PIN_TypeD_TypeDef; но, разумеется, из-за vilatile код генерится в два этапа: Код ;;;75 LPC_IOCON->P2_24.FUNC = 0; // GPIO pin 00000c 4921 LDR r1,|L1.148| 00000e f8d12160 LDR r2,[r1,#0x160] 000012 f0220207 BIC r2,r2,#7 000016 f8c12160 STR r2,[r1,#0x160] ;;;76 LPC_IOCON->P2_24.MODE = 2; // Pullup enabled 00001a f8d12160 LDR r2,[r1,#0x160] 00001e f0220218 BIC r2,r2,#0x18 000022 3210 ADDS r2,r2,#0x10 000024 f8c12160 STR r2,[r1,#0x160] как можно заставить компилятор генерить код в один этап?
|
|
|
|
|
 |
Ответов
|
Aug 15 2014, 05:58
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (ViKo @ Aug 14 2014, 14:37)  Я показал лучшее решение в сообщении #4, но "опытным профессионалам" лень разобраться и оценить его по-достоинству. Обратите внимание на XX * N. Чем это лучше, чем просто комментить строку? Закомментированная строка сразу видна в редакторе с подсветкой синтактсиса, что, имхо, является плюсом, т.к. сразу видно, что активно, а что нет. Или вы что-то иное, нежели механизм оперативного включения/выключения битов, имели в виду?
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Aug 15 2014, 22:05
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(dxp @ Aug 15 2014, 08:58)  Чем это лучше, чем просто комментить строку? Закомментированная строка сразу видна в редакторе с подсветкой синтактсиса, что, имхо, является плюсом, т.к. сразу видно, что активно, а что нет. Или вы что-то иное, нежели механизм оперативного включения/выключения битов, имели в виду? Иное. Хотя и с вашим утверждением не согласен. Умножил на 0, и знаешь, что этот бит в нуле. Нужна 1, заменил 0 на 1. Однообразие. Имею же в виду следующее, покажу конкретно на примере из сообщения №4. Код ADC12_CCR_DELAY_0 * 4 | // Delay between 2 sampling phases: 5 Из stm32f30x.h имеем Код #define ADC12_CCR_DELAY_0 ((uint32_t)0x00000100) /*!< DELAY bit 0 */ Из мануала на STM32F303xx Цитата Bits 11:8 DELAY: Delay between 2 sampling phases Set and cleared by software. These bits are used in dual interleaved modes. ... 0100 5 * TADC_CLK 0x00000100 * 0x4 = 0x00000400 Таким образом, умножив маску младшего бита на номер режима, я задаю все нужные биты режима одним махом. Не нужно устанавливать/сбрасывать все биты по-отдельности. Получается не 32 строчки (о чем писалось в начале темы), а намного меньше, столько, сколько есть полей для выбора режимов (в некоторых исключительных случаях поля режимов разбиты на 2, один бит где-то в другом месте болтается, тогда приходится описывать его отдельно). И тогда - пробежался взглядом по инициализации, и все установки - как на ладони. Для демонстрации красоты способа, вот другой пример (табуляция сползает, надоело править!): Код DAC->CR = DAC_CR_EN1 * 1 | // DAC channel1 enable DAC_CR_BOFF1 * 0 | // DAC channel1 output buffer disable DAC_CR_TEN1 * 1 | // DAC channel1 Trigger enable DAC_CR_TSEL1_0 * 3 | // DAC channel1 Trigger selection: TIM15 DAC_CR_WAVE1_0 * 2 | // DAC channel1 noise/triangle wave generation DAC_CR_MAMP1_0 * 11 | // DAC channel1 Mask/Amplitude selector: 12 bit DAC_CR_DMAEN1 * 0 | // DAC channel1 DMA enable DAC_CR_EN2 * 1 | // DAC channel2 enable DAC_CR_BOFF2 * 0 | // DAC channel2 output buffer disable DAC_CR_TEN2 * 0 | // DAC channel2 Trigger enable DAC_CR_TSEL2_0 * 7 | // DAC channel2 Trigger selection: Software DAC_CR_WAVE2_0 * 0 | // DAC channel2 noise/triangle wave generation enable DAC_CR_MAMP2_0 * 0 | // DAC channel2 Mask/Amplitude selector DAC_CR_DMAEN2 * 0; // DAC channel2 DMA enable
|
|
|
|
Сообщений в этой теме
toweroff Как лучше описать регистры Aug 8 2014, 21:43 AHTOXA 1. Убрать volatile (__IO) из структуры, добавить в... Aug 8 2014, 22:38 toweroff Цитата(AHTOXA @ Aug 9 2014, 02:38) 1. Убр... Aug 9 2014, 09:53  AHTOXA Цитата(toweroff @ Aug 9 2014, 15:53) 1. Н... Aug 9 2014, 18:21 ViKo А чем хуже, например, такой способ инициализации? ... Aug 9 2014, 09:59 Сергей Борщ Цитата(ViKo @ Aug 9 2014, 12:59) А чем ху... Aug 10 2014, 15:07  ViKo Цитата(Сергей Борщ @ Aug 10 2014, 18:07) ... Aug 10 2014, 15:20   AlexandrY Цитата(ViKo @ Aug 10 2014, 18:20) А я не ... Aug 10 2014, 18:43    AHTOXA Цитата(AlexandrY @ Aug 11 2014, 00:43) Мо... Aug 11 2014, 06:57     ViKo Цитата(AHTOXA @ Aug 11 2014, 09:57) Вариа... Aug 11 2014, 07:22      AHTOXA Цитата(ViKo @ Aug 11 2014, 13:22) Зачем? ... Aug 11 2014, 07:30     AlexandrY Цитата(AHTOXA @ Aug 11 2014, 09:57) А есл... Aug 11 2014, 10:43      AHTOXA Цитата(AlexandrY @ Aug 11 2014, 16:43) В ... Aug 11 2014, 11:59       AlexandrY Цитата(AHTOXA @ Aug 11 2014, 14:59) Вот п... Aug 11 2014, 12:40        AHTOXA Цитата(AlexandrY @ Aug 11 2014, 18:40) Пр... Aug 11 2014, 14:50         AlexandrY Цитата(AHTOXA @ Aug 11 2014, 17:50) Наско... Aug 11 2014, 17:22          AHTOXA Цитата(AlexandrY @ Aug 11 2014, 23:22) Ма... Aug 11 2014, 18:24           AlexandrY Цитата(AHTOXA @ Aug 11 2014, 21:24) В ваш... Aug 11 2014, 19:03            AHTOXA Цитата(AlexandrY @ Aug 12 2014, 01:03) Да... Aug 11 2014, 21:54             menzoda Цитата(AHTOXA @ Aug 12 2014, 01:54) Пишем... Aug 12 2014, 12:44             AlexandrY Цитата(AHTOXA @ Aug 12 2014, 00:54) Во-пе... Aug 12 2014, 13:48 toweroff Спасибо всем
С volatile действительно нужно быть ... Aug 10 2014, 19:59 ViKo Преимущество умножения в том, что для группы битов... Aug 11 2014, 05:09 ViKo У меня вообще нет сдвигов. Я пользуюсь битовыми ма... Aug 11 2014, 07:49 ViKo Для menzoda - мне ваш первый пример логичнее, поня... Aug 12 2014, 13:24 AHTOXA Цитата(menzoda @ Aug 12 2014, 18:44) Вот ... Aug 12 2014, 14:20 menzoda Цитата(AHTOXA @ Aug 12 2014, 18:20) Это б... Aug 12 2014, 14:57  Herz Цитата(menzoda @ Aug 12 2014, 17:57) (изв... Aug 12 2014, 20:20   menzoda ЦитатаПо вашему примеру кода я сразу понял, что сл... Aug 14 2014, 07:19    adnega Цитата(menzoda @ Aug 14 2014, 11:19) Спас... Aug 14 2014, 07:30 AHTOXA Цитата(menzoda @ Aug 12 2014, 20:57) Там ... Aug 12 2014, 20:57   demiurg_spb Поддержу в этом споре Антоху.
Есть системный подхо... Aug 16 2014, 12:49
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|