реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Разместить массив во внутренней ram, На stm32
Dubov
сообщение Jul 2 2016, 13:52
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Есть плата с stm32f439 и sdram. В программе для скорости необходимо разместить массив данных во внутренней памяти. Достатачно ли для этого использовать класс памяти register?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 2 2016, 15:04
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Dubov @ Jul 2 2016, 16:52) *
Достатачно ли для этого использовать класс памяти register?

Нет.
Go to the top of the page
 
+Quote Post
Dubov
сообщение Jul 2 2016, 17:23
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Цитата(aaarrr @ Jul 2 2016, 18:04) *
Нет.

Спасибо.
Какие средства языка Си нужно использовать для размещения массива во веутренней памяти?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 2 2016, 17:59
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Вам нужно выяснить два момента в документации на используемый компилятор:
1. Как расположить переменную в определенной секции
2. Как описывается секция в скрипте линкера
Затем нужно найти (или создать, если её вдруг нет) секцию, соответствующую внутренней памяти, и расположить в ней массив (обычно это делается через pragma, attribute и т.п).
Go to the top of the page
 
+Quote Post
Dubov
сообщение Jul 2 2016, 20:42
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



А разве компилятор не размещает переменные во внутренней памяти по умолчанию? Ведь для записи и чтения в sdram обычно существуют специальные функции типа sdram_write();
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 2 2016, 21:06
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Dubov @ Jul 2 2016, 23:42) *
Ведь для записи и чтения в sdram обычно существуют специальные функции типа sdram_write();

Обычно? Нет, для случая SDRAM это весьма необычно: с точки зрения компилятора внешняя память ничем не отличается от внутренней.
Go to the top of the page
 
+Quote Post
Dubov
сообщение Jul 3 2016, 08:21
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Нашел пример прямой записи по адресу в sdram:

// с адреса aa=0xD0100000 чисел массива типа float. i-индекс, изменяющийся с
// шагом 1. Его множим на 4, так как тип float занимает 4 байта
for(im=1;im<=nn;im++) {
for(jm=1;jm<=nn;jm++)
{ *(float*) (aa +4*(im+(jm-1)*nn)) =1.0f*((float)(im*jm));
*(float*) (bb +4*(im+(jm-1)*nn))=1.0f/(*(float*) (aa +4*(im+(jm-1)*nn)));
*(float*) (cc +4*(im+(jm-1)*nn))=0.0f;
} }


Разве не сработает если вместо аа подставить адрес начала sram?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 3 2016, 09:16
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Dubov @ Jul 3 2016, 11:21) *
Разве не сработает если вместо аа подставить адрес начала sram?
"Это" сработает. Но где вы тут видите размещение массива, о котором спрашивали? aaarrr вам дал единсвенный правильный ответ на ваш вопрос.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 3 2016, 09:56
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Dubov @ Jul 3 2016, 14:21) *
Нашел пример прямой записи по адресу в sdram:

Вам уже дали исчерпывающий ответ. Если Вы его не хотите читать, зачем тогда спрашиваете?

Цитата(Сергей Борщ @ Jul 3 2016, 15:16) *
"Это" сработает. Но где вы тут видите размещение массива, о котором спрашивали? aaarrr вам дал единсвенный правильный ответ на ваш вопрос.

Чукча не читатель.....
Не хочет он ни в чём разбираться, хочет найти кусок чужого быдлокода чтобы вляпать в свой.... sad.gif((
Go to the top of the page
 
+Quote Post
Dubov
сообщение Jul 3 2016, 11:08
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Цитата(Сергей Борщ @ Jul 3 2016, 12:16) *
"Это" сработает. Но где вы тут видите размещение массива, о котором спрашивали? aaarrr вам дал единсвенный правильный ответ на ваш вопрос.

В том примере что я нашел происходит размещение массива в динамической памяти

Код
Выделение массива a в памяти SRAM
   a = (float *)calloc(n1, sizeof(float));  
// Инициализация матрицы  
// Здесь одномерный массив представляется в виде двумерного
   //  *(float*) (aa +4*i)  - выполняется размещение в динамической памяти (SDRAM)
   // с адреса aa=0xD0100000 чисел массива типа float. i-индекс, изменяющийся с
   // шагом 1. Его множим на 4, так как тип float занимает 4 байта
      for(im=1;im<=nn;im++)  {
        for(jm=1;jm<=nn;jm++)
        { *(float*) (aa +4*(im+(jm-1)*nn)) =1.0f*((float)(im*jm));
        *(float*) (bb +4*(im+(jm-1)*nn))=1.0f/(*(float*) (aa +4*(im+(jm-1)*nn)));
        *(float*) (cc +4*(im+(jm-1)*nn))=0.0f;  
        }   }

Где аа - это адрес.

Полный код здесь: http://www.khnu.km.ua/root/kaf/ksm/sayt2/s...eb/stm32_4.html

Просто я подумал почему бы не указать адресс внутренней sram.


Спасибо за подсказку, просто подумал что есть еще варианты...

Сообщение отредактировал Dubov - Jul 3 2016, 11:37
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 3 2016, 15:38
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(aaarrr @ Jul 2 2016, 23:59) *
Затем нужно найти (или создать, если её вдруг нет) секцию, соответствующую внутренней памяти, и расположить в ней массив (обычно это делается через pragma, attribute и т.п).

Кстати: IAR позволяет обойтись без pragma.
Go to the top of the page
 
+Quote Post
Dubov
сообщение Jul 3 2016, 16:03
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Цитата(jcxz @ Jul 3 2016, 18:38) *
Кстати: IAR позволяет обойтись без pragma.

Не так случайно:
static uint8_t buffer[2*1024*1024] __attribute__ ((section (".sram_data")));
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 3 2016, 16:55
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Dubov @ Jul 3 2016, 22:03) *
Не так случайно:
static uint8_t buffer[2*1024*1024] __attribute__ ((section (".sram_data")));

u8 buffet[...] @ "my_section";
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 00:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01479 секунд с 7
ELECTRONIX ©2004-2016