Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/34: Рейтинг темы: голосов - 34, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141

Экономия RAM.

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

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

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

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

CCM RAM в 303ем
вот в AN4296 в пункте 4.2 описано как весь файл перетащить в CCM (мне как раз бы хотелось все ISR'ы туда запихнуть) -- у когонить этот финт...

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

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

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

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

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

Может быть стоит выложить код?
не знаю много ли видно из кода
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
07.03.2016, 16:45
Задачи на sd карте, это в raw массиве чтоли??? экстрим однако.
Моём понимании задача является компактным исходным кодом, которая уже в процессе своей работы размещает данные в памяти. Динные как таковые лучше хранить в W25Qxx флеш памяти. SD карта с неизвестным временем жизни - для таких операций не подходит, она больше предназначена для пользовательских данных.

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

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

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

В общем где то так.
PS:Извини не могу добавить файл так как .ld, .map и без расширения - "Расширение запрещено администратором." В чем прикол - я не понял.
0
0 / 0 / 0
Регистрация: 06.04.2013
Сообщений: 172
08.03.2016, 07:26
А зазиповать нельзя?
0
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
08.03.2016, 12:41
Цитата Сообщение от Pymkvym
Цитата Сообщение от jimyo77
я думал об этом - хранить задачи на SD карте. но считывание и парсинг займут много времени.
Тоже думал об этом (но не в контексте экономии ROM).
Хочу в прошивке реализовать некое API с основными функциями, а саму логику программы - на SD карте.
Либо скрипт, либо байт-код.
Интересно попробовать.
это по моему самое то http://we.iosyitistromyss.ru/STM32/prik ... stm32.html
0
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
08.03.2016, 12:45
Цитата Сообщение от 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
1 / 1 / 0
Регистрация: 08.05.2015
Сообщений: 225
08.03.2016, 15:30
это нужно смотреть параметры камня - у 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
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 141
08.03.2016, 20:44
Цитата Сообщение от 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
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
08.03.2016, 23:53
Есть вмзуализатор elf файлов - посмотрите им. Хотя из map тоже видно всё - хоть и буквами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.03.2016, 23:53
Помогаю со студенческими работами здесь

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

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

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

Как разделить FLASH и RAM память
Собственно это и есть вопрос. Т.е. как разделить FLASH и RAM память что бы МК можно было прошивать двумя разными прошивками независимых...

Как исправить ошибку «Not enough RAM 'ucHeap'»?
Здравствуйте, уважаемые форумчане. Я переделал под себя пустой проект с Freertos STN32F107, но теперь возникла проблема в виде &quot;Not...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru