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

И вот ещё. 5-я версия ARM компилятора, знающая про __packed, вот что в её описании даёт

packed5.thumb.png.16584b019e05b908bcbdb58e6cc5e7a4.png

 

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


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

Для тех, кто не боится плюсов (код для gcc, у которого нет указателя на невыровненные данные):

unaligned.h

Скрытый текст

#ifndef UNALIGNED_H__
#define UNALIGNED_H__

template<typename T>
struct unaligned
{
    operator T() const          { return Data; }
    void operator =(T value)    { Data = value; }

    T   Data;
} __attribute__((packed));


#endif  // UNALIGNED_H__

 

использование:

void otg_core::tx_fifo::write(void const * from, uint_fast16_t size)
{
    auto pSrc = reinterpret_cast<unaligned<uint32_t> const *>(from);
    size = (size + 3) / 4;    // bytes -> words
    while(size--)
        FIFO = *pSrc++;
}

 

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


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

6 минут назад, AleksBak сказал:

Я понял. Кажется понял. Спасибо. (я понял, что надо применять выравнивание - правильно да?)

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

Например для IAR у меня объявлены такие типы:

typedef __packed u16 u16p8;
typedef __packed s16 s16p8;
typedef __packed u32 u32p8;
typedef __packed s32 s32p8;
typedef __packed u64 u64p8;
typedef __packed s64 s64p8;
typedef __packed u32 u32p16;
typedef __packed s32 s32p16;
typedef __packed u64 u64p16;
typedef __packed s64 s64p16;
typedef          u64 u64p32;
typedef          s64 s64p32;
typedef __packed float floatP8;
typedef __packed float floatP16;
typedef __packed double doubleP8;
typedef __packed double doubleP16;
typedef __packed double doubleP32;

В таких случаях я и использую их. Типа:

u32p8 volatile *ptr =  0xC0001203;

Для других компиляторов (не понимающих __packed) будет немного по-другому.

Для Кейла надеюсь VladislavS нам прояснит как их описать.

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


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

10 минут назад, jcxz сказал:

Если только одно это изменение сделать. Для чистоты эксперимента.....

У меня сейчас нет возможности проверить. Попозже. У меня Keil не основной, так подопытный.

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


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

5 минут назад, Сергей Борщ сказал:

Для тех, кто не боится плюсов (код для gcc, у которого нет указателя на невыровненные данные):

 

В программах для ПК (VS) я примерно так и делаю. Но у этого метода есть существенный недостаток: При компиляции с низким уровнем оптимизации (для отладки), эти методы к сожалению не инлайнятся. Это неудобно.  :sad:

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


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

7 минут назад, jcxz сказал:

Например для IAR у меня объявлены такие типы:

Еще раз спасибо.

OFFTOP: А как тут, на форуме, "плюс" добавляют в репутацию какого-то пользователя так и не понял?

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


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

17 минут назад, Сергей Борщ сказал:

auto pSrc = reinterpret_cast<unaligned<uint32_t> const *>(from);

Это несовместимо с constexpr.

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


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

1 час назад, VladislavS сказал:

Это несовместимо с constexpr.

Не могу придумать, когда это может понадобиться. Не подскажете?

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


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

Вы наперёд знаете что будет передаваться через эту функцию? Те же дескрипторы можно генерить в constexpr контексте.

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


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

54 минуты назад, VladislavS сказал:

Вы наперёд знаете что будет передаваться через эту функцию?

Ах вы про функцию целиком? Ну, это цель дальнейших исследований.

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


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

Мне так и не ответили на главный вопрос...

Как включить для SDRAM кэш в STM32H7?

Без включенного кэша все работает.

настройки MPU:

    MPU_InitStruct.Enable = MPU_REGION_ENABLE;
    MPU_InitStruct.Number = MPU_REGION_NUMBER0;
    MPU_InitStruct.BaseAddress = 0xC0000000;
    MPU_InitStruct.Size = MPU_REGION_SIZE_256MB;
    MPU_InitStruct.SubRegionDisable = 0;
    MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
    MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
    MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
    MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
    MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
    HAL_MPU_ConfigRegion(&MPU_InitStruct);

 

 

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


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


	SCB_InvalidateICache();
	SCB_EnableICache();

	SCB_InvalidateDCache();
	SCB_EnableDCache();

MPU в моих проектах не требовался совсем - его настройки не трогал.

У вас IsBufferable - на вид самая полезное свойство кэша данных - выключено.

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

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


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

10 minutes ago, GenaSPB said:


	SCB_InvalidateICache();
	SCB_EnableICache();

	SCB_InvalidateDCache();
	SCB_EnableDCache();

MPU в моих проектах не требовался совсем - его настройки не трогал.

У вас IsBufferable - на вид самая полезное свойство кэша данных - выключено.

 

с ним тоже не работает.. и пишут что для SDRAM его надо отключать

 

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


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

О... неработающая с data cache программа - известная проблема. Особенно при наличия обмена по DMA
Зачем Вам нужен MPU?

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


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

3 часа назад, Realking сказал:

Мне так и не ответили на главный вопрос...

Как включить для SDRAM кэш в STM32H7?

 

Screenshot_20-10-20_13-23_cor.png

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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