Easyelectronics.ru

Электроника для всех
Текущее время: 04 июл 2020, 14:42

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



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: что за память такая CCM (core coupled memory) ?
СообщениеДобавлено: 23 фев 2015, 15:22 
Заглядывает иногда

Зарегистрирован: 24 мар 2012, 15:01
Сообщения: 38
Снова поднимаю тему.
Как явно указать, чтоб переменную в CCM записать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что за память такая CCM (core coupled memory) ?
СообщениеДобавлено: 23 фев 2015, 21:53 
Заглядывает иногда

Зарегистрирован: 08 ноя 2014, 02:44
Сообщения: 162
Откуда: Нерюнгри
тоже хотел задействовать, вот пара ссылок - не повторял
http://sigalrm.blogspot.ru/2013/12/using-ccm-memory-on-stm32.html
http://www.tarangshah.me/how-to-use-the-stm32f4-ccm-in-a-keil-project/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что за память такая CCM (core coupled memory) ?
СообщениеДобавлено: 25 май 2015, 12:33 
Только пришел

Зарегистрирован: 09 июн 2012, 19:42
Сообщения: 17
avtoneru писал(а):
вот пара ссылок
Работает с Keil. Отлично. Стек и кое-какие данные для DSP в больших объёмах перекочевали туда. Благодарю.
Понравился синтаксис
Код:
const char array[10] __attribute__((section ("CCM_DATA"))) = {0, '1', 2, 3};


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что за память такая CCM (core coupled memory) ?
СообщениеДобавлено: 18 янв 2017, 12:52 
Здравствуйте!

Зарегистрирован: 18 янв 2017, 12:29
Сообщения: 1
LWW писал(а):
Хранение констант, таблиц. Стек. Процессор имеет доступ сюда без задержек. И никакие DMA не помешают. Так что одноцикловый доступ гарантируется.

Ну и самое главное, исполнение кода в этой памяти будет максимально быстрым. В некоей статье говорится о приросте скорости до 52%

Если хранить константы по старинке, во флеше, то будете ждать по 8-10 циклов, что бы прочитать один байт или слово... (измерял на F103RET). Это вам не 8 bit AVR ;)


Я ради интереса сделал замеры пересылок между RAM - RAM, FLASH - RAM

Код:
  uint16_t Table[];
  uint16_t TT[400];
  const uint16_t Cl_ModBus_CRC16::CRC16Table[]

  for(a = 0; a < 256; a++) TT[a] = Table[a];   6925 тактов

  for(a = 0; a < 256; a++) TT[a] = Cl_ModBus_CRC16::CRC16Table[a]; 7949 тактов

  memcpy(TT, Cl_ModBus_CRC16::CRC16Table, 256); 2842 тактов

  memcpy(TT, Table, 256); 2331 тактов

Такие получились результаты проц STM32F103C8 частота 72, latency = 2


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что за память такая CCM (core coupled memory) ?
СообщениеДобавлено: 18 янв 2017, 22:56 
Заглядывает иногда

Зарегистрирован: 09 янв 2013, 16:21
Сообщения: 199
По идее, если это обычные камушки без кэша, вся оперативка должна быть одноцикловая. Чтение же константы из флешки может занимать до 7-9 циклов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что за память такая CCM (core coupled memory) ?
СообщениеДобавлено: 19 янв 2017, 10:21 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2870
У CCM смысл другой. Она висит на той же шине что и флеш, проц имеет к ней максимально быстрый доступ, и никакой DMA не отнимет приоритет. DMA вообще к этой памяти доступа не имеет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что за память такая CCM (core coupled memory) ?
СообщениеДобавлено: 18 авг 2017, 15:12 
Старожил

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 542
Нашел интересную ссылку по теме CCM на STM32: http://www.stmcu.org/module/forum/threa ... 4-1-1.html
по картинкам многое можно понять. Но если в Keil в опциях выставить IRAM2, то по мере написания программы и увеличения используемой памяти наступает момент, когда компиляция начинает выдавать ошибку. Причем CCM не используется при этом вообще, а массивами и прочим занято только 80кб из 100кб не-CCM памяти. Ошибка по номеру даже не гуглится, весьма редкая. Если я правильно понял, по каким-то причинам линкер решает засунуть какую-то мелочь в CCM, хотя ещё полно свободной IRAM1. По этой причине я решил не использовать этот вариант, т.к. слишком много мороки, особенно если проект придётся править через несколько месяцев или вообще на другом компиляторе.

Если я правильно понимаю, то переменным можно жестко указать адрес в CCM:
Цитата:
__IO uint32_t tmpBuffer1[FFT_BUFFER_SIZE] __attribute__((at(0x10000000))); - оказалось по адресу 0x10000000
__IO uint32_t tmpBuffer2[FFT_SIZE] __attribute__((at(0x10000000))); - в реальности оказалось по адресу 0x10004000
__IO uint32_t* tmp1 = (uint32_t *)0x10000000; - оказалось по адресу 0x10000000
__IO uint32_t* tmp2 = (uint32_t *)0x10000000; - оказалось по адресу 0x10000000


Мне часто требуются временные массивы переменных размеров. Чтобы оптимально использовать память, логично повторно использовать освободившиеся адреса. Что я и попытался сделать выше для массивов tmpBuffer1, tmpBuffer2.
Но при указании __attribute__((at(0x10000000))) линкер почему-то автоматически сдвинул адрес tmpBuffer2 на 16384 байта (длину массива tmpBuffer1). Возможно, что так и задумано. Поэтому единственным выходом пока вижу использование указателей: tmp1 и tmp2 оказались по одному адресу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что за память такая CCM (core coupled memory) ?
СообщениеДобавлено: 18 авг 2017, 15:55 
Старожил

Зарегистрирован: 07 авг 2014, 17:15
Сообщения: 383
Откуда: дальнее надмосковье
Вот краткий и хороший документ насчет как использовать CCM с GCC.

И вот очень полезный докумет от самих ST для CCM конкретно под STM32F3, но многое из документа пригодно и для других серий.

Дело в том, что CCM тоже бывают разные, например на CCM STM32F405 нельзя исполнять код (потому что CCM подключен только к шине D-BUS), а на CCM STM32F303 - можно (есть доступ и по D-BUS и по I-BUS, потому что CCM подключен к матрице шин AHB). Это наглядно продемонстрировано на картинках "block diagram" в даташитах.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что за память такая CCM (core coupled memory) ?
СообщениеДобавлено: 18 авг 2017, 16:23 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
CCM можно использовать для хранения стека, или для операционной системы, благодаря отдельной шине, связывающей напрямую ядро МК и ОЗУ. Не надо класть в CCM всё подряд. Наоборот, разделяйте.
Для указания компилятору, что данные должны быть положены в ССМ, используйте секции, либо указатели.
Цитата:
__IO uint32_t tmpBuffer1[FFT_BUFFER_SIZE] __attribute__((at(0x10000000))); - оказалось по адресу 0x10000000
__IO uint32_t tmpBuffer2[FFT_SIZE] __attribute__((at(0x10000000))); - в реальности оказалось по адресу 0x10004000

А как вы хотели? Два разных массива не могут лежать по одному адресу. В атрибутах вы указываете только начало секции, а выделен будет первый свободный адрес. Так что всё верно.
С указателями же ситуация другая. Когда вы создаете указатель, указывающий на конкретный адрес, создается еще одна 4-хбайтовая переменная, содержащая написанный вами адрес. Два разных указателя могут указывать на одинаковый адрес. это нормально и не противоречит. Потому что переменная указателя, повторюсь, это отдельная переменная, содержащая числовое значение адреса


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что за память такая CCM (core coupled memory) ?
СообщениеДобавлено: 18 авг 2017, 17:41 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Ну и с веселыми картинками, щоб нагляднее было:
как видим, массивы выделяются в обозначенной секции, один за другим, начиная с адреса 0х1000 0000
а указатели на эти массивы помещаются вообще по другому адресу, но содержат адреса начала массивов, на которые они указывают


Вложения:
Без-имени-1.png
Без-имени-1.png [ 60.87 Кб | Просмотров: 5262 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что за память такая CCM (core coupled memory) ?
СообщениеДобавлено: 18 авг 2017, 21:54 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Цитата:
Мне часто требуются временные массивы переменных размеров. Чтобы оптимально использовать память, логично повторно использовать освободившиеся адреса. Что я и попытался сделать выше для массивов tmpBuffer1, tmpBuffer2.

Ага, понятно, что вы хотите получить. Для этого есть возможности динамического выделения памяти через malloc и её вариации, доступные после подключения stdlib.h
Почитайте, ознакомьтесь - http://www.c-cpp.ru/funkcii/dinamichesk ... ie-pamyati и другие материалы по этой теме.
Вручную конечно тоже можете, только придется держать размеры и адреса в голове, управлять самостоятельно, чтобы нигде ничего не наехало и не запортилось.
Встроенный стандартный "выделятор" перед каждым выделенным массивом создает 8-байтный управляющий заголовок, по которому и распознает границы выделенных массивов.


Сравнительно недавно тут была тема про динамическое выделение памяти. Правда, к сожалению, там топикстартер наворотил полнейшего бреда сивой кобылы и глубоких заблуждений, но как суть при использовании - можно ознакомиться viewtopic.php?f=56&t=32376


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


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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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