Easyelectronics.ru

Электроника для всех
Текущее время: 05 июн 2020, 15:54

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 40 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: KEIL V5 vs V6 H7
СообщениеДобавлено: 23 мар 2020, 18:38 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1182
ArtDen писал(а):
Глядя на код, могу сказать, что ошибка скорее всего где-то в другом месте. То, что помогло volatile - скорее всего случайность.

Хотел то же самое написать, смущает, что с отключенным кешем работает и без volatile.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL V5 vs V6 H7
СообщениеДобавлено: 23 мар 2020, 18:45 
Заглядывает иногда

Зарегистрирован: 02 янв 2016, 06:47
Сообщения: 132
на счет разности работы оптимизатора и компилера
например, буфер для приема пакетов по USB
в пятом было достаточно просто объявить буфер

uint8_t recievedBufUSB[USBD_CUSTOMHID_OUTREPORT_BUF_SIZE];

и в другом хидере указать

extern uint8_t recievedBufUSB[USBD_CUSTOMHID_OUTREPORT_BUF_SIZE];

в шестом нужно явно объявить этот буфер через volatile, тут как бы вполне это логично и очевидно, но все же...

вообщем, надеюсь, кому-то, это будет, в итоге, полезно при переходе с v5 на v6


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL V5 vs V6 H7
СообщениеДобавлено: 23 мар 2020, 18:50 
Заглядывает иногда

Зарегистрирован: 02 янв 2016, 06:47
Сообщения: 132
Reflector писал(а):
ArtDen писал(а):
Глядя на код, могу сказать, что ошибка скорее всего где-то в другом месте. То, что помогло volatile - скорее всего случайность.

Хотел то же самое написать, смущает, что с отключенным кешем работает и без volatile.


с отключенным кешем, проблем с памятью и дма у Н7 нет, он работает как старые М4 и ниже... не надо ни с регионами парится ни с MPU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL V5 vs V6 H7
СообщениеДобавлено: 23 мар 2020, 18:58 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1182
vasiliuz писал(а):
с отключенным кешем, проблем с памятью и дма у Н7 нет, он работает как старые М4 и ниже... не надо ни с регионами парится ни с MPU

Это понятно, не ясно чем в данном случае поможет volatile... Например, пишешь ты в буфер, потом копируешь его при помощи DMA, перед копирование нужно очистить(Flush) кеш, ну или отключить его или пометить память используемую буфером как не кешируемую, а volatile или уровень оптимизации тут могут помочь разве что косвенно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL V5 vs V6 H7
СообщениеДобавлено: 23 мар 2020, 19:08 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 366
vasiliuz писал(а):
uint8_t recievedBufUSB[USBD_CUSTOMHID_OUTREPORT_BUF_SIZE];

и в другом хидере указать

extern uint8_t recievedBufUSB[USBD_CUSTOMHID_OUTREPORT_BUF_SIZE];

Здесь тоже нужен volatile. В 5-м кейле это работало случайно из-за отсутствия LTO. При LTO оптимизатор вправе выбросить обращение к таким переменным, если он не видит пути в потоке исполнения между записью и чтением этой переменной. Даже если объявление и использование переменной разнесено по разным файлам

PS: можно попробовать отключить LTO. Возможно всё заработает в старом коде.


Последний раз редактировалось ArtDen 23 мар 2020, 19:11, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL V5 vs V6 H7
СообщениеДобавлено: 23 мар 2020, 19:11 
Заглядывает иногда

Зарегистрирован: 02 янв 2016, 06:47
Сообщения: 132
поэтому я и создал тему...

если у кого-то есть под руками железо с Н7 можете попробовать у себя

scatter

Код:
  DMASRAM3BUF 0x30040000 0x00000800  {  ; RW data 256b D2 240MHz  SRAM3
   *(.dmaSRAM3BuffArea)
  }

  SRAM3 0x30040800 0x00007800  {  ; RW data 32k-512b D2 240MHz
   *(.SRAM3)
  }


Настройки MPU

Код:
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.BaseAddress = 0x30040000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_2KB;
  MPU_InitStruct.SubRegionDisable = 0x0;
  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_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);


Объявление переменных

Код:
ALIGN_32BYTES (uint8_t lcdDATA[1024]) __attribute__((section(".dmaSRAM3BuffArea"))); 
ALIGN_32BYTES (uint8_t lcdCMD[32]) __attribute__((section(".dmaSRAM3BuffArea"))); 

volatile  TLCD_Config LCD_Config __attribute__((section(".SRAM3")));


Header

Show


C файл

Show


применение

Код:
   
// LCD Init
   
   LCD_SetPinRST(&LCD_Config, LCD_RESET_GPIO_Port, LCD_RESET_Pin);
   LCD_SetPinDC(&LCD_Config, LCD_DC_GPIO_Port, LCD_DC_Pin);
   LCD_SetPinCS(&LCD_Config, NA_USART1_TX_GPIO_Port, NA_USART1_TX_Pin);
   LCD_SetSPI(&LCD_Config, &hspi2);
   LCD_SetDataBuf(&LCD_Config, lcdDATA);
   LCD_SetCmdBuf(&LCD_Config, lcdCMD);
   LCD_Init(&LCD_Config, (uint8_t*)LCD_ST7565R_180, sizeof(LCD_ST7565R_180), 128, 64, 1, 4);
   
        // const uint8_t StartLogo[1024] = { массив коснтант

   for(uint16_t i = 0; i < 1024; i++)
      LCD_Config.BufData[i] = StartLogo[i];   

   LCD_UpdateScreen(&LCD_Config);





Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL V5 vs V6 H7
СообщениеДобавлено: 23 мар 2020, 19:13 
Заглядывает иногда

Зарегистрирован: 02 янв 2016, 06:47
Сообщения: 132
ArtDen писал(а):
vasiliuz писал(а):
uint8_t recievedBufUSB[USBD_CUSTOMHID_OUTREPORT_BUF_SIZE];

и в другом хидере указать

extern uint8_t recievedBufUSB[USBD_CUSTOMHID_OUTREPORT_BUF_SIZE];

Здесь тоже нужен volatile. В 5-м кейле это работало случайно из-за отсутствия LTO. При LTO оптимизатор вправе выбросить обращение к таким переменным, если он не видит пути в потоке исполнения между записью и чтением этой переменной. Даже если объявление и использование переменной разнесено по разным файлам

PS: можно попробовать отключить LTO. Возможно всё заработает в старом коде.


LTO включена всегда, отключать нельзя в моем случае. Она мне очень нужна и важна. в пятом тоже была включена -О3 + LTO


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL V5 vs V6 H7
СообщениеДобавлено: 23 мар 2020, 19:17 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 366
Значит LTO в 5-м кейле был не настолько агрессивным, если простого extern + использования в другом файле хватало для корректной работы


Последний раз редактировалось ArtDen 23 мар 2020, 19:21, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL V5 vs V6 H7
СообщениеДобавлено: 23 мар 2020, 19:19 
Заглядывает иногда

Зарегистрирован: 02 янв 2016, 06:47
Сообщения: 132
ArtDen писал(а):
Значит LTO в 5-м кейле был не настолько агрессивным, если простого extern + использования в другом файле хватало корректной работы


я потому и описываю разные применения, чтобы картина была лучше видна... для тех, кому это интересно
чтобы можно было провести аналогии и параллели...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL V5 vs V6 H7
СообщениеДобавлено: 23 мар 2020, 19:22 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1182
vasiliuz писал(а):
если у кого-то есть под руками железо с Н7 можете попробовать у себя

Есть только F7 и то я с ним еще не так много игрался, но судя по коду все как я и говорил... Ты пишешь в config->BufCmd, потом скармливаешь его адрес DMA, а в самом буфере мусор(если эта память кешируется), т.к. записанные данные в кеше. Попробуй перед запуском DMA вызвать SCB_CleanDCache().

Код:
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

А тут наверно должно быть SHAREABLE.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL V5 vs V6 H7
СообщениеДобавлено: 23 мар 2020, 20:03 
Заглядывает иногда

Зарегистрирован: 02 янв 2016, 06:47
Сообщения: 132
Reflector писал(а):
vasiliuz писал(а):
если у кого-то есть под руками железо с Н7 можете попробовать у себя

Есть только F7 и то я с ним еще не так много игрался, но судя по коду все как я и говорил... Ты пишешь в config->BufCmd, потом скармливаешь его адрес DMA, а в самом буфере мусор(если эта память кешируется), т.к. записанные данные в кеше. Попробуй перед запуском DMA вызвать SCB_CleanDCache().

Код:
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

А тут наверно должно быть SHAREABLE.


Ну так весь смысл использования MPU, в данном случае, чтобы не использовать в ручную SCB_CleanDCache
И запретить кеширование для определенного региона
Заполняется извне только указатель на буфер

например, есть другая периферия, которая находится в том же регионе , и там в инит ДМА указывается напрямую буфер и там все работает ок
а в данном случае через переменную указатель

И данные по дма шлются не циклично, поэтому буфер инитится каждый раз перед отправкой


Должно быть MPU_ACCESS_NOT_SHAREABLE
если MPU_ACCESS_SHAREABLE то никакая периферия не работает, которая по дма ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL V5 vs V6 H7
СообщениеДобавлено: 23 мар 2020, 20:57 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1182
vasiliuz писал(а):
Ну так весь смысл использования MPU, в данном случае, чтобы не использовать в ручную SCB_CleanDCache
И запретить кеширование для определенного региона

Это если все в порядке, а когда в буфер не пишет, при этом отключение кеша помогает, то возможно что-то с настройками кеширования не так.

Цитата:
Должно быть MPU_ACCESS_NOT_SHAREABLE
если MPU_ACCESS_SHAREABLE то никакая периферия не работает, которая по дма ...

NOT_SHAREABLE - это регион к которому имеет доступ один CPU, а если их несколько, или речь о CPU и DMA, то атрибут должен быть SHAREABLE, иначе нужно позаботиться о когерентности кеша. В AN4839 описано 4 способа, один из них как раз добавление shared атрибута. Почему в таком случае не будет работать периферия непонятно, по-моему работать должно, атрибут же специально для DMA.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL V5 vs V6 H7
СообщениеДобавлено: 23 мар 2020, 21:05 
Заглядывает иногда

Зарегистрирован: 02 янв 2016, 06:47
Сообщения: 132
Reflector писал(а):
vasiliuz писал(а):
Ну так весь смысл использования MPU, в данном случае, чтобы не использовать в ручную SCB_CleanDCache
И запретить кеширование для определенного региона

Это если все в порядке, а когда в буфер не пишет, при этом отключение кеша помогает, то возможно что-то с настройками кеширования не так.

Цитата:
Должно быть MPU_ACCESS_NOT_SHAREABLE
если MPU_ACCESS_SHAREABLE то никакая периферия не работает, которая по дма ...

NOT_SHAREABLE - это регион к которому имеет доступ один CPU, а если их несколько, или речь о CPU и DMA, то атрибут должен быть SHAREABLE, иначе нужно позаботиться о когерентности кеша. В AN4839 описано 4 способа, один из них как раз добавление shared атрибута. Почему в таком случае не будет работать периферия непонятно, по-моему работать должно, атрибут же специально для DMA.


я помнил, что не работает, но перед тем как ответить вам - я проверил еще раз дополнительно, чтобы наверняка
с MPU_ACCESS_SHAREABLE не работает ни spi ни sai по дма


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL V5 vs V6 H7
СообщениеДобавлено: 25 мар 2020, 00:41 
Только пришел

Зарегистрирован: 03 фев 2017, 16:49
Сообщения: 23
Откуда: Москва
Ну логично, что в этом случае volatile помогло. Я так понимаю, что в память вы писали, но значение потом сами не использовали. И с точки зрения компилятора это лишняя операция, которую можно убрать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: KEIL V5 vs V6 H7
СообщениеДобавлено: 25 мар 2020, 00:51 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1182
DarkMike писал(а):
Ну логично, что в этом случае volatile помогло. Я так понимаю, что в память вы писали, но значение потом сами не использовали. И с точки зрения компилятора это лишняя операция, которую можно убрать.

Каким образом получается рабочий код с убранной "лишней" операцией если выключить кеш?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 40 ]  На страницу Пред.  1, 2


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Glebiys, Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB