Ekka 0 27 июня, 2018 Опубликовано 27 июня, 2018 · Жалоба Привет всем. Не совсем понимаю задачу, которую нужно решить, может, кто-то просветит меня( Дело в том, что у меня не хватило памяти для программы. на rom выделено 32K, добавить нельзя сюда, ибо подключается стороннее приложение, которому нужна память с определенного адреса. MEMORY { rom (rx) : ORIGIN = 0x08000000, LENGTH = 32K app_flash (rx) : ORIGIN = 0x08008000, LENGTH = 992K ram (rwx) : ORIGIN = 0x20000000, LENGTH = 8K appram (rwx) : ORIGIN = 0x20002000, LENGTH = 120K } Некто посоветовал мне подключить SDRAM. Чтобы посмотреть, как эта штука вообще работает, пробую на stm32f429 работать с SDRAM. Пока только на HAL. Так вот... простите за тупые вопросы, не совсем понимаю, каким именно образом мне сократить объем программы, используя внешнюю память. Что туда грузить? Массивы из библиотек, которые подключаю? Кто-нибудь, объясните, пожалуйста, доходчиво для тех, кто в танке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 27 июня, 2018 Опубликовано 27 июня, 2018 · Жалоба Кто-нибудь, объясните, пожалуйста, доходчиво для тех, кто в танке. А не проще какую-нить NOR-память задействовать? Иначе придется из какого-то внешнего энергонезависимого хранилища копировать все в SDRAM, а оттуда уже запускать. При этом в это внешнее хранилище часть прошивку нужно будет как-то записать. Аналогично и с NOR, придется как-то туда прошивку записывать, но можно исполнять код прямо из NOR, без копирования в SDRAM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 27 июня, 2018 Опубликовано 27 июня, 2018 · Жалоба Так вот... простите за тупые вопросы, не совсем понимаю, каким именно образом мне сократить объем программы, используя внешнюю память. SDRAM - это ОЗУ. Соответственно - размещать в ней можно только объекты требующие ОЗУ. Ну если не считать того, что для отладки её можно использовать для загрузки ROM-секций программы (код и данные). К "сокращению объёма программы" это вообще никакого отношения не имеет. Сокращает объём программы оптимизация и голова программиста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ekka 0 27 июня, 2018 Опубликовано 27 июня, 2018 · Жалоба SDRAM - это ОЗУ. Соответственно - размещать в ней можно только объекты требующие ОЗУ. Ну если не считать того, что для отладки её можно использовать для загрузки ROM-секций программы (код и данные). К "сокращению объёма программы" это вообще никакого отношения не имеет. Сокращает объём программы оптимизация и голова программиста. Код сокращен до минимума. Как можно решить эту проблему с нехваткой? получаю вот что region `rom' overflowed by 10748 bytes на форумах пишут, что можно как бы добавить к _rom, но внешнее подключенное приложение пишет свои данные начиная с определенного адреса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 27 июня, 2018 Опубликовано 27 июня, 2018 · Жалоба получаю вот что ... rom (rx) : ORIGIN = 0x08000000, LENGTH = 32K А нафига обрезали сегмент flash-кода до 32K??? :wacko: Там же 2 МБ флеша! Наведите порядок с регионами памяти: define memory mem with size = 4G; define region FLASH_regionA = mem:[from 0x08000000 to 0x081FFFFF]; define region RAM_regionA = mem:[from 0x10000000 size 0x10000]; //CCM SRAM define region RAM_regionB = mem:[from 0x20000000 size 0x20000]; //main SRAM (bit-band) define region RAM_regionC = mem:[from 0x20020000 size 0x10000]; //main SRAM (bit-band) define region RAM_regionD = mem:[from 0x40024000 size 0x01000]; //backup SRAM define region ROM_region = mem:[from 0xE00FF000 to 0xE00FFFFF]; define region SDRAM_region = mem:[from 0xD0000000 size 0x00800000]; //SDRAM для STM32F429 с SDRAM. Секции ro-data и text линковать в FLASH_regionA: place in FLASH_regionA {ro}; Для отладки можно использовать SDRAM для размещения кода и ro-данных, типа так: define memory mem with size = 4G; define region FLASH_regionA = mem:[from 0x08000000 to 0x081FFFFF]; define region RAM_regionA = mem:[from 0x10000000 size 0x10000]; //CCM SRAM define region RAM_regionB = mem:[from 0x20000000 size 0x20000]; //main SRAM (bit-band) define region RAM_regionC = mem:[from 0x20020000 size 0x10000]; //main SRAM (bit-band) define region RAM_regionD = mem:[from 0x40024000 size 0x01000]; //backup SRAM define region ROM_region = mem:[from 0xE00FF000 to 0xE00FFFFF]; define region SDRAM_regionA = mem:[from 0xD0000000 size 0x00040000]; //SDRAM (code/const) define region SDRAM_regionB = mem:[from 0xD0040000 size 0x000BF000]; //SDRAM (data) define region SDRAM_regionC = mem:[from 0xD00FF000 size 0x00701000]; //SDRAM (data) define block HEAP with alignment = 8, size = 0x000 {}; //.dma: channel control table for DMA-controller //.BITBAND_RAM: для bitband-переменных initialize by copy {rw}; do not initialize {section .noinit}; do not initialize {section .raw}; do not initialize {section .ccm}; do not initialize {section .dma}; do not initialize {section .eraw}; do not initialize {section .edma}; do not initialize {section .bssStk}; do not initialize {section .bssStkMain}; do not initialize {section .imonSave}; do not initialize {section .backup}; do not initialize {section .aoutRecord}; do not initialize {section .graphMem}; do not initialize {section .rawMp3}; do not initialize {section .rawAac}; do not initialize {section .rawAacSbr}; define overlay .rawMpeg {section .rawMp3}; define overlay .rawMpeg {section .rawAac}; define block IMAGE_HEAD with fixed order {section .intvec, section .checksum, section .codehead, section .intvecTail, section .codebegin}; place in RAM_regionA {section .bssStkMain, section .bssStk, overlay .rawMpeg, section .ccm}; place in RAM_regionB {ro, first block IMAGE_HEAD, last section .codetail, section .rodataInternal, section .textInternal, section .constFast}; place in RAM_regionC {section .BITBAND_RAM, section .dma}; place in RAM_regionA | RAM_regionC {rw, section .bssInternal, block HEAP}; place in RAM_regionD {section .backup}; place in SDRAM_regionB {section .eraw, section .edma, section .framCache, section .graphMem}; place in SDRAM_regionC {section .aoutRecord}; place in SDRAM_regionA { section .codeSignature, section .fnt, section .rodata, section .text object rds.o, section .text object menu.o, section .text object ir_term.o, section .text object fonttest.o, section .text object storage.o, section .text object tuner.o, section .text object esp_link.o, section .text object datetime.o, section .text object sntp.o, section .text object dflash.o, section .text object bakf.o, section .text object dte.o, section .text object dte_lcd.o, section .text object fram_map.o, section .text object periodic.o, section .text object pack.o, section .text object ansi.o, section .text object config.o, section .text object tscr.o, section .text object spi.o, section .text object service.o, section .text object ui.o }; Как видно - код и ro-данные линкуются частично в RAM_regionB, частично в SDRAM_regionA. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ekka 0 27 июня, 2018 Опубликовано 27 июня, 2018 · Жалоба Наверное, я не правильно задаю вопрос( Лучше так: Как можно исправить эту ошибку? region `rom' overflowed by 10748 bytes А нафига обрезали сегмент flash-кода до 32K??? :wacko: Там же 2 МБ флеша! Наведите порядок с регионами памяти: define memory mem with size = 4G; define region FLASH_regionA = mem:[from 0x08000000 to 0x081FFFFF]; define region RAM_regionA = mem:[from 0x10000000 size 0x10000]; //CCM SRAM define region RAM_regionB = mem:[from 0x20000000 size 0x20000]; //main SRAM (bit-band) define region RAM_regionC = mem:[from 0x20020000 size 0x10000]; //main SRAM (bit-band) define region RAM_regionD = mem:[from 0x40024000 size 0x01000]; //backup SRAM define region ROM_region = mem:[from 0xE00FF000 to 0xE00FFFFF]; define region SDRAM_region = mem:[from 0xD0000000 size 0x00800000]; //SDRAM для STM32F429 с SDRAM. Секции ro-data и text линковать в FLASH_regionA: place in FLASH_regionA {ro}; сейчас объясню. у меня есть проект рантайма от разработчиков с возможностью его "поправить под себя". проект сделан под stm32f4 - discovery, с таким вот распределением памяти /* Define memory regions. */ MEMORY { rom (rx) : ORIGIN = 0x08000000, LENGTH = 32K app_flash (rx) : ORIGIN = 0x08008000, LENGTH = 992K ram (rwx) : ORIGIN = 0x20000000, LENGTH = 8K appram (rwx) : ORIGIN = 0x20002000, LENGTH = 120K } PROVIDE( _stack = ORIGIN(appram) + LENGTH(appram) ); PROVIDE( _app_start = ORIGIN(app_flash) ); PROVIDE( _app_end = _app_start + LENGTH(app_flash) ); Это стандартная прошивка. Начиная с адреса app_flash работает внешнее приложение YAPLC_IDE (это я просто в попытках хотя бы посмотреть, как настраивать sdram, пробую на hal stm32f429, а так мк - stm32f407vg) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 27 июня, 2018 Опубликовано 27 июня, 2018 · Жалоба Как можно исправить эту ошибку? region `rom' overflowed by 10748 bytes В этом сообщении компоновщик Вам сообщает, что Вы пытаетесь какой-то сегмент выходного образа прошивки засунуть в регион 'rom', но там не хватает места. Исправить - перераспределить память, увеличить 'rom', перенести сегмент который не лезет в другие регионы. Например: сдвиньте 'app_flash' вниз (уменьшив соответственно его размер) и на освобождённый размер увеличьте 'rom'. Или определите выше 'app_flash' дополнительный регион (уменьшив 'app_flash') и компонуйте нелезущие сегменты туда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ekka 0 27 июня, 2018 Опубликовано 27 июня, 2018 · Жалоба В этом сообщении компоновщик Вам сообщает, что Вы пытаетесь какой-то сегмент выходного образа прошивки засунуть в регион 'rom', но там не хватает места. Исправить - перераспределить память, увеличить 'rom', перенести сегмент который не лезет в другие регионы. Например: сдвиньте 'app_flash' вниз (уменьшив соответственно его размер) и на освобождённый размер увеличьте 'rom'. Или определите выше 'app_flash' дополнительный регион (уменьшив 'app_flash') и компонуйте нелезущие сегменты туда. в том то и проблема, что я app_flash не могу двигать с этого адреса - 0х08008000, потому что внешнее приложение оттуда пишет свое, а в его внутренних кишках (среда YAPLC-IDE, с файлами на питоне и многой другой ерундой) и лезть нечего... там все поедет, программа разработчиков. Потому и спрашиваю, как сделать можно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 27 июня, 2018 Опубликовано 27 июня, 2018 · Жалоба и лезть нечего... там все поедет, программа разработчиков. Потому и спрашиваю, как сделать можно... Тогда второй вариант, как писал выше. Наверняка там не весь объём 'app_flash' используется и в конце 0xFF. К тому же в STM32F429 как я уже писал - 2МБ флеша, а по вашим сообщениям видно что у Вас описан только 1МБ. Так что выше 'app_flash' есть ещё 1МБ. Определите там регион и компонуйте в него. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ekka 0 27 июня, 2018 Опубликовано 27 июня, 2018 (изменено) · Жалоба Тогда второй вариант, как писал выше. Наверняка там не весь объём 'app_flash' используется и в конце 0xFF. К тому же в STM32F429 как я уже писал - 2МБ флеша, а по вашим сообщениям видно что у Вас описан только 1МБ. Так что выше 'app_flash' есть ещё 1МБ. Определите там регион и компонуйте в него. нет-нет-нет... у меня STM32F4-DISCOVERY, stm32f429 просто поиграться... мне на 407VG надо, у stm32f4 disco всего 1мб flash вроде Изменено 27 июня, 2018 пользователем Ekka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 27 июня, 2018 Опубликовано 27 июня, 2018 · Жалоба Зайдём с другой стороны. Где именно на STM32F4DISCOVERY припаяна SDRAM ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
controller_m30 1 27 июня, 2018 Опубликовано 27 июня, 2018 · Жалоба region `rom' overflowed by 10748 bytes Если во внутренней SRAM есть свободного места на 10748 байт, тогда сделать так: на внешние пины подключить последовательную флешку, в которой будет храниться не вместившийся в основную флешь-память фрагмент программы. После инициализации этот фрагмент переносится из внешней флешь во внутреннюю SRAM, и там исполняется. Если места во внутренней SRAM нету, тогда всё тоже самое + подключить внешнюю SRAM. Достаточно объёма 16 Кб и для доп.ОЗУ и для доп.флешь. У STM32F407 есть FSMC, который может работать с внешней SRAM. Фрагмент хранится во внешней флешь, а исполняется во внешней SRAM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ekka 0 27 июня, 2018 Опубликовано 27 июня, 2018 · Жалоба Зайдём с другой стороны. Где именно на STM32F4DISCOVERY припаяна SDRAM ? СЕЙЧАС нигде. Поэтому принцип работы разбираю на готовой плате stm32f429 (понимаю, это тупо) и вообще сомневаюсь, что мне хватит свободных ног для работы с ней у discovery Потому я и спрашиваю, можно ли как-то и что-то с этим rom сделать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 27 июня, 2018 Опубликовано 27 июня, 2018 · Жалоба Варианты: 1) если планируется какое-то своё железо (407VG + SDRAM - это НЕ дискавери), поставить камень потолще и не морочить себе и окружающим голову 2) договориться с "программой разработчиков", что адреса их интерпретатора будут другие. 3) написать свой кусок более компактно. Городить внешнюю память в этом случае смысла как-то немного... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 27 июня, 2018 Опубликовано 27 июня, 2018 · Жалоба Потому я и спрашиваю, можно ли как-то и что-то с этим rom сделать В общем случае, лучше выбрать МК с большим объемом Flash, благо такие существуют. Или уговаривать разработчиков на другую карту распределения памяти. Все остальное - усложнения жизни, по масштабу несравнимые с первым вариантом. Но я бы попробовал подрезать app_flash в пользу rom, уговорив разработчиков. По сути нужно где-то только поправить константы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться