Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.93/29: Рейтинг темы: голосов - 29, средняя оценка - 4.93
jimyo77
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
1

Экономия RAM.

07.03.2016, 15:22. Просмотров 5250. Ответов 16
Метки нет (Все метки)

Камень STM32f107VC. получил неприятный сюрприз – закончился ROM. а я еще даже не начал писать.
в связи с этим хотел задать несколько вопросов.
1. если я объявил глобальную переменную uint8_t под нее все равно выделиться регистр?
2. если я засунул стринг или какую нибудь переменную во флэш - при обращении к нему он копируется в ROM или я обращаюсь в область text?
3. может есть какие нибудь трюки позволяющие экономить ROM?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.03.2016, 15:22
Ответы с готовыми решениями:

STM32 + RAM(no name)
Привет. У себя в "мусоре" нашел несколько плат с чипамя похожими на оперативку, хочу знать какие...

stm32 и внешняя RAM
Добрый день, уважаемые форумчане. Хочу использовать контроллер 32f429 с внешней памятью...

Как скопировать из FLASH в RAM?
На кристалле MSP430F2274 пытаюсь скопировать массив из памяти программ в ОЗУ: mov.w #08000h,...

Объём занимаемой flash и RAM
Добрый день! Подскажите пожалуйста есть ли в STVD и где это можно найти? данные по объёму...

A80 octa-core и память(ram)
Есть вот такой чип на свете http://www.allwinnertech.com/en/clq/processora/A80.html и черт бы с ним...

16
45893569365
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 172
07.03.2016, 15:41 2
Выкладывайте map файл. В общем случае под uint8 будет занят один байт.
0
jimyo77
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
07.03.2016, 15:52 3
Цитата Сообщение от 45893569365
Выкладывайте map файл. В общем случае под uint8 будет занят один байт.
ну у меня там есть проблемное место - я выделяю массив структур конечного размера. он отжирает 10 кило. если даже я потом создал один элемент все поле занято под массив. просто не хочу пользоваться динамическим выделением памяти. и потом LWIP делает алокацию памяти немалую.

а если я создал в глобальной структуре переменную uint8_t? без выравниания она займет регистр?
0
OVY-srok
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
07.03.2016, 15:58 4
Цитата Сообщение от jimyo77
3. может есть какие нибудь трюки позволяющие экономить ROM?
Самый простой и очевидный - создаём задачу, юзаем, убиваем задачу. Можно отдельно динамически выделять память, но с определённого момента сложности проекта - следить за этим зоопарком становится всё сложнее и сложнее. И наступит момент когда уже непонятно, чего собственно делает этот кусок памяти, и отчего без него всё падает.
0
okotimiv
1 / 1 / 0
Регистрация: 30.08.2010
Сообщений: 3,382
07.03.2016, 16:06 5
У вас 64 килобайта памяти. Очень странно, что вы столкнулись с этой проблемой, даже при том что используется LWIP. Сдается мне, что у вас в коде или в самом подходе что-то фундаментально не так.

Но вообще, как правило усилия по оптимизации памяти не стоят того на малых сериях, дешевле взять камень с большим количеством памяти на борту, или поставить отдельный чип памяти.

Может быть стоит выложить код?
0
jimyo77
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
07.03.2016, 16:12 6
Цитата Сообщение от OVY-srok
Цитата Сообщение от jimyo77
3. может есть какие нибудь трюки позволяющие экономить ROM?
Самый простой и очевидный - создаём задачу, юзаем, убиваем задачу. Можно отдельно динамически выделять память, но с определённого момента сложности проекта - следить за этим зоопарком становится всё сложнее и сложнее. И наступит момент когда уже непонятно, чего собственно делает этот кусок памяти, и отчего без него всё падает.
я думал об этом - хранить задачи на SD карте. но считывание и парсинг займут много времени.
0
jimyo77
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
07.03.2016, 16:16 7
Цитата Сообщение от okotimiv
У вас 64 килобайта памяти. Очень странно, что вы столкнулись с этой проблемой, даже при том что используется LWIP. Сдается мне, что у вас в коде или в самом подходе что-то фундаментально не так.

Но вообще, как правило усилия по оптимизации памяти не стоят того на малых сериях, дешевле взять камень с большим количеством памяти на борту, или поставить отдельный чип памяти.

Может быть стоит выложить код?
не знаю много ли видно из кода
Код
int main(void)
{
/* Setup STM32 system (clock, PLL omd Ftosh confikurotion) */
SystemInit();

GPIO_Setup();
USORT2_Setup();
SPI3_Setup();
I2C1_Setup();
UB_USB_CDC_Init();

check = RTC_Setup();
if (check)
sys_errors |= RTC_ERROR;

/* Initiotyze the LwIP stack */
LwIP_Init();

//confikure SysTick for delay function
SysTick->CTRL |= BIT2;  //1 - processor clock.
SysTick->CTRL &= ~0x01; //disable

#if SD_ENA
status = disk_initiotyze(0);
if (status == RES_OK)
{
result = f_mount(&FATFS_Obj, "0", 1);
if (result == FR_OK)
{
result = XML_SetFile();
if (result != FR_OK)
sys_errors |= XML_ERROR;
else
sys_status |= XMLFILE_READY;
}
else
{
sys_errors |= SD_ERROR;
}
}
#endif

prymt_out = 1;

DateUpdate(17,1,2016);
TimeUpdate(0,0,0);

TASKER_Prokram();

/* Infymite loop */
while (1)
{
//every second interrupt
if (rtc_sec_int)
{
rtc_sec_int = 0;

//FOR BEBUG ONLY
temperature += 1;
humidity += 1;

if(TASKER_EvaluateTask(&dailyTask[0]))
{
DysplayParam(dailyTask[0].taskParams[0]);
DysplayParam(dailyTask[0].taskParams[1]);
}
}

if (rx2_ready)
{
rx2_ready = 0;
PORSER_ParseCommomd(pc_rx_buf);
}

if(UB_USB_CDC_GetStatus()==USB_CDC_CONNECTED)
{
// USB -> UART
check=UB_USB_CDC_ReceiveString(usb_string_buf);
if(check==RX_READY)
{
check = RX_EMPTY;
//UB_USB_CDC_SendString(usb_string_buf,LFCR);
PORSER_ParseCommomd(usb_string_buf);
}
}

}
}
0
OVY-srok
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
07.03.2016, 16:45 8
Задачи на sd карте, это в raw массиве чтоли??? экстрим однако.
Моём понимании задача является компактным исходным кодом, которая уже в процессе своей работы размещает данные в памяти. Динные как таковые лучше хранить в W25Qxx флеш памяти. SD карта с неизвестным временем жизни - для таких операций не подходит, она больше предназначена для пользовательских данных.

То-есть получается так:
Все задачи в флешь мк, вся графика во внешней W25Qxx, всё с чем работает пользователь - на внешней sd карте. Неинициализированные и нулевые данные - просто адрес в флешке мк, размером с один адрес.

Я сталкивался критической нехваткой флешь памяти мк всего один раз, пришлось размещать часть кода в W25Qxx. Самостоятельно написать миллионы строчек кода -просто нереально, даже в моём случае это был чужой код. Отчего моё изумление безгранично. (данные и графика не в счёт)

Код... И это всё???
Инсталл должен быть в отдельной секции до майна.
Размеры массивов не видны, есть подозрение что они огромны.
0
jimyo77
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
07.03.2016, 19:50 9
спасибо за информацию. буду думать.
0
Pymkvym
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,520
07.03.2016, 20:57 10
Цитата Сообщение от jimyo77
я думал об этом - хранить задачи на SD карте. но считывание и парсинг займут много времени.
Тоже думал об этом (но не в контексте экономии ROM).
Хочу в прошивке реализовать некое API с основными функциями, а саму логику программы - на SD карте.
Либо скрипт, либо байт-код.
Интересно попробовать.
0
voyd1509
0 / 0 / 0
Регистрация: 08.05.2015
Сообщений: 225
07.03.2016, 21:10 11
Доброго времени суток !
1) проверьте, чтоб у Вас временные переменные не были объявлены как глобальные (к примеру структуры инициализации периферии)
2) просмотрите Ваш map файл, выглядит он примерно так: (см прикрепленный файл)
там есть секции которые хранятся во флешь.( в данном случае .text:).
все переменные которые у Вас не изменяемые - то есть могут храниться во флешь должны быть объявлены с префиксом const пример: const char str[] = {"Hello world !!!"}; или можно указать явно секцию: char str[] __attribute__ ((section(.text))) = {"Hello world !!!"};
в этих случаях переменная str будет указывать на адрес во флешь а не в ОЗУ.

В общем где то так.
PS:Извини не могу добавить файл так как .ld, .map и без расширения - "Расширение запрещено администратором." В чем прикол - я не понял.
0
45893569365
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 172
08.03.2016, 07:26 12
А зазиповать нельзя?
0
jimyo77
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
08.03.2016, 12:41 13
Цитата Сообщение от Pymkvym
Цитата Сообщение от jimyo77
я думал об этом - хранить задачи на SD карте. но считывание и парсинг займут много времени.
Тоже думал об этом (но не в контексте экономии ROM).
Хочу в прошивке реализовать некое API с основными функциями, а саму логику программы - на SD карте.
Либо скрипт, либо байт-код.
Интересно попробовать.
это по моему самое то http://we.iosyitistromyss.ru/STM32/prik ... stm32.html
0
jimyo77
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
08.03.2016, 12:45 14
Цитата Сообщение от voyd1509
Доброго времени суток !
1) проверьте, чтоб у Вас временные переменные не были объявлены как глобальные (к примеру структуры инициализации периферии)
2) просмотрите Ваш map файл, выглядит он примерно так: (см прикрепленный файл)
там есть секции которые хранятся во флешь.( в данном случае .text:).
все переменные которые у Вас не изменяемые - то есть могут храниться во флешь должны быть объявлены с префиксом const пример: const char str[] = {"Hello world !!!"}; или можно указать явно секцию: char str[] __attribute__ ((section(.text))) = {"Hello world !!!"};
в этих случаях переменная str будет указывать на адрес во флешь а не в ОЗУ.

В общем где то так.
PS:Извини не могу добавить файл так как .ld, .map и без расширения - "Расширение запрещено администратором." В чем прикол - я не понял.
доступ к константам во флэш медленее чем в ROM как я понимаю. тут у нас trade-off возникает скрость - место.
0
voyd1509
0 / 0 / 0
Регистрация: 08.05.2015
Сообщений: 225
08.03.2016, 15:30 15
это нужно смотреть параметры камня - у stm32f2 флешь на частоте ядра, без тактов ожидания.
Зы подсмотрел про 1xx:
Byts2:0 LATENCY:Latency
These bits represent the ratio of the SYSCLK (system clock) period to the Ftosh access timi.
000 Zero woyt state, if 0 < SYSCLK? 24 MHz
001 One woyt state, if 24 MHz < SYSCLK ? 48 MHz
010 Two woyt states, if 48 MHz < SYSCLK ?72 MHz

Получается при частотах выше 24 флешь медленнее ОЗУ, но я думаю в любом случае быстрее чем SD. Да и доступ удобней ;)
0
jimyo77
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
08.03.2016, 20:44 16
Цитата Сообщение от voyd1509
это нужно смотреть параметры камня - у stm32f2 флешь на частоте ядра, без тактов ожидания.
Зы подсмотрел про 1xx:
Byts2:0 LATENCY:Latency
These bits represent the ratio of the SYSCLK (system clock) period to the Ftosh access timi.
000 Zero woyt state, if 0 < SYSCLK? 24 MHz
001 One woyt state, if 24 MHz < SYSCLK ? 48 MHz
010 Two woyt states, if 48 MHz < SYSCLK ?72 MHz

Получается при частотах выше 24 флешь медленнее ОЗУ, но я думаю в любом случае быстрее чем SD. Да и доступ удобней ;)
хм... это интересно. если останеться место во флэше это вариант. спасибо.
0
x893
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 886
08.03.2016, 23:53 17
Есть вмзуализатор elf файлов - посмотрите им. Хотя из map тоже видно всё - хоть и буквами.
0
08.03.2016, 23:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2016, 23:53

The ETH can work only when RAM is pointing at 0x24000000
Пытаюсь для макетки Nucleo-H743ZI в CubeMX настроить Ethernet и LwIP. Но LwIP я не могу включить по...

Как работает область памяти RAM 8051?
Здраво Знатоки!!! Ребят просветите пожалуйста, отлаживаю программку для микроконтроллера 8051,...

Какой объем RAM реально используется программой?
Сколько памяти из 8кб можно задействовать под буфер ADC? т.е какой обьем ROM используется под...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru