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

Переменная по адресу не кратному 4 байт.

37 minutes ago, Grizzly said:

А для невыровненного случая будет дополнительная инструкция в dasm? Я правильно понимаю, что ничего даром не даётся?)

Выше код приведен. Задействован NEON.

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


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

25 минут назад, aaarrr сказал:

Выше код приведен.

Спасибо. Не увидел сразу, что это для моего случая.

UPD.: А NEON задаействован именно из-за того, что источник не выровнен? То есть в таком случае будут всегда использоваться регистры сопроцессора или возможны доп. инструкции с целочисленными регистрами, когда у VFP все занято?

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


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

1 hour ago, Grizzly said:

А NEON задаействован именно из-за того, что источник не выровнен? То есть в таком случае будут всегда использоваться регистры сопроцессора или возможны доп. инструкции с целочисленными регистрами, когда у VFP все занято?

1. Да.

2. Возможно, тут все на откуп компилятору.

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


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

Не могу устранить

Warning: L6918W: Execution region RW_IRAM2 placed at 0x20000000 needs padding to ensure alignment 4 of emac_stm32f7xx.o(.bss.ARM.__at_0x2000C000).

Подскажите как подойти к вопросу. Спасибо.

 Desc                                     0x2000c000   Data        9412  emac_stm32f7xx.o(.bss.ARM.__at_0x2000C000)
    [Anonymous Symbol]                       0x2000c000   Section        0  emac_stm32f7xx.o(.bss.ARM.__at_0x2000C000)

 

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


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

/* Ethernet DMA Descriptor/Buffer memory */
static struct {
  RX_Desc  rx[NUM_RX_BUF];
  TX_Desc  tx[NUM_TX_BUF];
  uint32_t rx_buf [NUM_RX_BUF][ETH_BUF_SIZE>>2];
  uint32_t tx_buf [NUM_TX_BUF][ETH_BUF_SIZE>>2];
} Desc __MEMORY_AT(EMAC_DMA_MEMORY_ADDR);
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20010000 0x00040000  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM2 0x20000000 0x00010000  {
   .ANY (+RW +ZI)
  }
}

 

файл EMAC_STM32F7xx.c

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


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

41 minutes ago, smk said:

__attribute__((packed)

Выстрел в ногу.

 

42 minutes ago, smk said:

__MEMORY_AT(EMAC_DMA_MEMORY_ADDR)

Лучше в секцию определить.

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


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

Как это сделать?

тут еще такое есть:
 

/* DMA TX Descriptor */
typedef struct tx_desc {
  uint32_t volatile CtrlStat;
  uint32_t          Size;
  uint8_t          *Addr;
  struct tx_desc   *Next;
#if ((EMAC_CHECKSUM_OFFLOAD != 0) || (EMAC_TIME_STAMP != 0))
  uint32_t          Reserved[2];
  uint32_t          TimeLo;
  uint32_t          TimeHi;
#endif
} TX_Desc;


/* DMA RX Descriptor */
typedef struct rx_desc {
  uint32_t volatile Stat;
  uint32_t          Ctrl;
  uint8_t  const   *Addr;
  struct rx_desc   *Next;
#if ((EMAC_CHECKSUM_OFFLOAD != 0) || (EMAC_TIME_STAMP != 0))
  uint32_t          ExtStat;
  uint32_t          Reserved[1];
  uint32_t          TimeLo;
  uint32_t          TimeHi;
#endif
} RX_Desc;

 

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


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

On 9/14/2018 at 7:04 PM, aaarrr said:

Пруф. Нельзя вызывать memcpy абы как.

 

Ну и обратный пруф - memcpy спасает мир :biggrin:

 

С опасностями memcpy имел дело на Cortex-A7 + GCC.  Без указания нужного флага и spec подключается либа, не учитывающая выравнивание.

Подробно здесь + решение : 

 

https://gamedev.ru/flame/forum/?id=262348&page=10&m=5434017#m149

 

cо 149-го сообщения

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

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


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

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

Выстрел в ногу.

А где у него упаковка? Или он уже поправил сообщение...

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


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

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

поправил

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


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

1 hour ago, smk said:

когда включаю кеш программа уходит в ошибку

1. Включать кэш в области IRAM смысла нет

2. За когерентностью при работе с DMA нужно следить самому - инвалидировать перед чтением

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


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

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

2. За когерентностью при работе с DMA нужно следить самому - инвалидировать перед чтением

И тогда уже надо выравнивать по странице кеша 32 байта, иначе могут пропасть нужные данные. Или в некешируемой области размещать буфера ДМА.

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


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

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

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

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

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

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

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

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

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

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