Перейти к содержанию
    

Приведение типа указателя на элемент структуры

А неважно.

Выровняет по границе машинного слова (16/32/64) - и все ваши RESERVED превратятся в дополнительные 16/32/64р "дыры"

Не выравняет. :) Потому что имеется следующий код.

typedef struct {
  __I uint8_t RCR;    //<! Revision Code Register,            0x00
  __I uint8_t DBSR;    //<! Dislpay Buffer Size Register,        0x01
  __I uint8_t CRR;    //<! Configuration Readback Register,        0x02
} ReadOnlyConf_t;    //<! Read-Only Configuration Registers

typedef struct {
  __IO uint8_t MCCR;    //<! Memory Clock Configuration Register,    0x04
  __IO uint8_t PCCR;    //<! Pixel Clock Configuration Register,    0x05
} ClockConf_t;        //<! Clock Configuration Registers
...

#define DPYCTRL_BASE    ((uint32_t)0x6C000000)    //<! Dysplay base address
#define S1DREGS_BASE    DPYCTRL_BASE        //<! S1D13706 registers base

#define READONLYCONF_BASE    S1DREGS_BASE
#define CLOCKCONF_BASE        S1DREGS_BASE + 0x04
#define LOOKUPTABLE_BASE    S1DREGS_BASE + 0x08
...
#define READONLYCONF    ((ReadOnlyConf_t *) READONLYCONF_BASE)
#define CLOCKCONF    ((ClockConf_t *) CLOCKCONF_BASE)
#define LOOKUPTABLE    ((LookUpTable_t *) LOKUPTABLE_BASE)
...

А дальше - обращения по указателям...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для того и вводятся резервные места, ну, как в stm32xxx.h

Не надо брать пример с индуистского кода. Правильный ответ(причем, всегда)

typedef struct
{
  __IO uint32_t DR;         /*!< CRC Data register,             Address offset: 0x00 */
  union
{
  __IO uint8_t  reg8bit;        /*!< CRC Independent data register, Address offset: 0x04 */
  uint32_t IDR_space;
} IDR;
  __IO uint32_t CR;         /*!< CRC Control register,          Address offset: 0x08 */
} CRC_TypeDef;

 

Почему у них идеологически не так? Патамушо эти хедеры не для того, чтобы ими пользоваться! :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Патамушо эти хедеры не для того, чтобы ими пользоваться! :)

Интересно, а чем же пользоваться?

Самому хидеры на процы делать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Интересно, а чем же пользоваться?

Самому хидеры на процы делать?

Я тут давеча психанул и наваял по означенному выше принципу. Ессно, только структуры, без всяких функций сомнительного сервиса. Но у проекта, который сейчас пилю, уже поезд ушел, тестинг откладывается.

Странно, но LPC такой ненависти не вызывают. Очень странно... :)

Вообще, я там сильно повыделывался - дал битовым полям осмысленные имена... там по-хорошему надо двуязычие, тоже на основе union{}- с сохранением мнемоники и с сохранением смысла... этот момент разрулю - будет тыщи три строк.

И вроде бы взять да и сделать базу в libreoffice base, чтоб генерило то,что надо... блин, лень забадала.

Изменено пользователем _Pasha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в каком случае может не сработать индуистский вариант? Я что-то с наскока не смог добиться, чтобы размер структуры

typedef struct
{
  uint32_t DR;
  uint8_t  IDR;
  uint8_t  spacer;
  uint16_t  spacer2;
  uint32_t CR;
} CRCpeDef;

был не 12. Пробовал все мыслимые варианты -fpack-struct=1, 2, 4, 8, 16.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ух как у меня все это перекликается... и с volatile, и со структурами

Тоже бодаюсь. Чуть позже выложу, если позволите, в этой теме, ибо оооочень похоже

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не надо брать пример с индуистского кода. Правильный ответ(причем, всегда)

...

Я тоже кинулся было править stm32f2xx.h, когда увидел, что не могу одной командой установить и сбросить биты в порту. Из-за

...
  __IO uint16_t BSRRL;    /*!< GPIO port bit set/reset low register,  Address offset: 0x18      */
  __IO uint16_t BSRRH;    /*!< GPIO port bit set/reset high register, Address offset: 0x1A      */
  // __IO uint32_t BSRR;        // GPIO port bit set/reset: 0xRRRRSSSS, Address offset: 0x18
...
} GPIO_TypeDef;

Причем, BSRRL отвечает за установку бита, а BSRRH - за сброс.

Но при пользовании объединениями в имени регистра появляется дополнительное обозначение, которого не хочу.

Поэтому приведение типа указателя для меня более приемлемо.

 

А насчет библиотеки - функциями не пользуюсь.

А насчет определения битов - #define меня устраивают.

Главное, чтобы код не разбухал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Итак, добавляю :)

есть две области в ARM968E-S

в первой висит 16-битный супресс USB, во второй - NOR Flash

 

Читается/пишется в первую область только по/из фиксированным адресам

Во вторую - и так, и с инкрементом

 

оптимизация компилятора в Time и O3

 

Шины. 1-я с супрессом - 16бит, 2-я - 32 бит

 

Что-то фигню наблюдаю

 

Первая область объявлена как

#define        FX2_FIFO2            (*(volatile unsigned int *)(FX2_BASE_ADDR + (0x00UL<<2)))
#define        FX2_FIFO4            (*(volatile unsigned int *)(FX2_BASE_ADDR + (0x02UL<<2)))

 

вторая - также через volatile, но в своем диапазоне

 

Доступ к памяти осцилл показывает и, судя по тестам, точно как и надо

 

А вот данные - не пойми чего

Для пересылки и сокращения доступа к той и другой области памяти попробовал сделать union с тремя полями - U16, U16 и U32

Например, чтение из первой области - в две U16 подряд, потом из U32 - в другую область запись

 

Шаманство :) Не работает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я тоже кинулся было править stm32f2xx.h, когда увидел, что не могу одной командой установить и сбросить биты в порту. Из-за[кусь]

Поэтому приведение типа указателя для меня более приемлемо.

 

Не пойму, кто заремил BSRR, милое дело ©

Inline void pin_set_by_msk(const GPIO_typedef *port, const uint16_t msk, const bool state)
{
  port->BSRR = state?(msk):(msk<<16);
}

компиляется в минимум,- жаль, редко, когда в две-это при интенсивных операциях -инструкции

Изменено пользователем _Pasha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не пойму, кто заремил BSRR, милое дело ©

Я же и закомментировал. Сам приписал, сам убрал. Когда возникла дилемма - или писать всегда по 32 бита, или писать, когда надо, по 16-битов. В-общем, надо было иметь и ту, и другую возможность. А union ... уже говорил ... А *(uint32_t *) &GPIOB.BSRRL - то шо надо!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не пойму, кто заремил BSRR, милое дело ©

Дык, индусы, кто ж ещё:) Причём битовые маски оставили как для 32-битного BSRR. (Это для F2xx.)

Я всё же такого не стерпел, и переписал это определение.

_Pasha, так в каком случае индуистский подход с ручными отступами в структурах может привести к неправильному результату? Или здесь речь чисто об эстетике? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Админы, я так понимаю, здесь свой колхоз :)

я это все отправлю а "ARM, 32bit", здесь уберите, мешает всем

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

port->BSRR = state?(msk):(msk<<16);

...

компиляется в минимум,- жаль, редко, когда в две-это при интенсивных операциях -инструкции

Это если один бит задавать. А по началу можно весь порт установить в нужное состояние.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

_Pasha, так в каком случае индуистский подход с ручными отступами в структурах может привести к неправильному результату? Или здесь речь чисто об эстетике? :)

Вообще-то подозрения в выравнивании - не мои. Если MrYuran сталкивался, думаю, он поделится.

Хотя, странно -fpack-struct=8 должен бы, как представляется...

Я только выразил недоумение по поводу головоломок там, где их быть не должно, при передвижении на круглых колесах, тсз.:)

Изменено пользователем _Pasha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это если один бит задавать. А по началу можно весь порт установить в нужное состояние.

Вообще-то для этого есть ODR :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...