|
Распределение ОЗУ памяти для ARM Cortex M4 |
|
|
|
Jun 3 2016, 08:43
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 29-11-13
Пользователь №: 79 419

|
Добрый день уважаемые форумчане.
Уже не первый день мучаюсь с вопросом о том как можно грамотно распределить память для своего проекта.
Имеется плата с: - МК NXP LPC4357 - 32 бит, ядро Cortex-M4, сопроцессор Cortex-M0, Flash 1 МБ, 136 кБ RAM, 16 кБ EEPROM, 64 кБ ROM, 128 байт OTP; - 16 МБ NOR Flash; - 4 МБ Quad-SPI Flash; - 16 МБ SDRAM; - 16 кБ I2C EEPROM.
В проекте собираюсь задействовать FreeRTOS, LwIP, modbusTCP, emWin, работу с microSD и еще несколько специфичных для устройства задач.
Буду очень признателен услышать ваше мнение о том что и куда распределили бы вы.
Свои же рассуждения приведу ниже.
Первое с чего решил начать - это выбор памяти для записи самой программы. По своему опыту работы с ARM7 всегда писал во встроенную в МК флэш память и был счастлив. А здесь как я понимаю вариантов уже больше - имеем Flash 1 МБ и некую 4 МБ Quad-SPI Flash, также предназначенную для хранения программы. Так как на данный момент программа не большая, то решил остановиться на первом варианте. Но если появится необходимость в памяти большего размера, то для меня не совсем понятно как надо настроить проект, чтобы контроллер знал, что прошивка лежит во внешней 4 МБ Quad-SPI Flash (использую Keil)..
Дальше взялся за конфигурацию startup - требуется определить размер стека и кучи. Но здесь все будет завязано на то как настрою FreeRTOS. Во FreeRTOS существует 4 варианта выделения памяти heap1.c, heap2.c, heap3.c, heap4.c. Решил что буду пользоваться heap3.c. Соответственно размер кучи в этом случае назначается в startup. Но вопрос в том что какого размера должна быть эта куча и где размещена для того что бы FreeRTOS запустила работу со стеком LwIP, modbusTCP и в дальнейшем заработала с emWin. При этом 136 Кб встроенной памяти ОЗУ разделены на части и разбросаны по всему адресному пространству МК. Так же складывается ощущение, что за счет только этих 136 Кб решить задачу не удастся, может ошибаюсь. Но напрашивается вопрос о том как с пользой использовать 16 Мб внешней памяти и что для этого требуется сделать..
Сообщение отредактировал masterok - Jun 3 2016, 08:48
|
|
|
|
|
 |
Ответов
(1 - 10)
|
Jun 3 2016, 09:55
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(masterok @ Jun 3 2016, 14:43)  - 16 МБ NOR Flash; - 4 МБ Quad-SPI Flash; - 16 МБ SDRAM; - 16 кБ I2C EEPROM. А зачем такой зоопарк из стольких типов разной флеши??? Плюс ещё встроенная флешь МК и SD... Цитата(masterok @ Jun 3 2016, 14:43)  Но если появится необходимость в памяти большего размера, то для меня не совсем понятно как надо настроить проект, чтобы контроллер знал, что прошивка лежит во внешней 4 МБ Quad-SPI Flash (использую Keil).. Вы сперва хотя-бы попробуйте написать прошивку такого размера, чтобы в 1МБ не влезла. Цитата(masterok @ Jun 3 2016, 14:43)  может ошибаюсь. Но напрашивается вопрос о том как с пользой использовать 16 Мб внешней памяти и что для этого требуется сделать.. Странно как-то у вас платы разрабатываются - сперва зачем-то прилепили SDRAM (плюс куча флешей), а затем начали думать как и для чего её использовать.... Сначала ставится задача - что надо сделать. Затем - определяются пути её решения и средства для этого необходимые. Не надо ставить телегу впереди лошади.
|
|
|
|
|
Jun 3 2016, 10:02
|

отэц
    
Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684

|
Цитата(jcxz @ Jun 3 2016, 12:55)  Странно как-то у вас платы разрабатываются - сперва зачем-то прилепили SDRAM (плюс куча флешей), а затем начали думать как и для чего её использовать.... Сначала ставится задача - что надо сделать. Затем - определяются пути её решения и средства для этого необходимые. Не надо ставить телегу впереди лошади. ..действительно, не ставьте ничего лишнего! А если вдруг потом понадобится - просто переразведите плату.
--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0 SHA-256
|
|
|
|
|
Jun 3 2016, 10:20
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 29-11-13
Пользователь №: 79 419

|
Взятая плата - это готовое решение - evolution board Keil MCB4357 и как я понимаю производитель хотел сделать ее на все случаи жизни. Моя задумка в том, чтобы сейчас с помощью нее отточить навыки работы с необходимым функционалом, а дальше как вы правильно подметили изготовить свою плату.
Карту памяти MicroSD планирую задействовать для ведения лога работы программы в виде обычных текстовых файлов. Тем более что на плате есть модуль RTC и батарейка.
Сообщение отредактировал masterok - Jun 3 2016, 10:23
|
|
|
|
|
Jun 3 2016, 11:11
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(masterok @ Jun 3 2016, 11:43)  Первое с чего решил начать - это выбор памяти для записи самой программы. По своему опыту работы с ARM7 всегда писал во встроенную в МК флэш память и был счастлив. А здесь как я понимаю вариантов уже больше - имеем Flash 1 МБ и некую 4 МБ Quad-SPI Flash, также предназначенную для хранения программы. Так как на данный момент программа не большая, то решил остановиться на первом варианте. Но если появится необходимость в памяти большего размера, то для меня не совсем понятно как надо настроить проект, чтобы контроллер знал, что прошивка лежит во внешней 4 МБ Quad-SPI Flash (использую Keil).. Вам придется написать загрузчик, который будет программу из этой флеши копировать в sdram, а оттуда ее уже можно исполнять. Но учтите, что кортекс заточен все ж под программу во внутренней флеши, скорость исполнения из sdram вероятно будет ниже. Опять де внутреннюю флеш можно залочить стандартными средствами, с внешней придется уже заморачиваться самому. Цитата Дальше взялся за конфигурацию startup - требуется определить размер стека и кучи. Но здесь все будет завязано на то как настрою FreeRTOS. Во FreeRTOS существует 4 варианта выделения памяти heap1.c, heap2.c, heap3.c, heap4.c. Решил что буду пользоваться heap3.c. Соответственно размер кучи в этом случае назначается в startup. Но вопрос в том что какого размера должна быть эта куча и где размещена для того что бы FreeRTOS запустила работу со стеком LwIP, modbusTCP и в дальнейшем заработала с emWin. При этом 136 Кб встроенной памяти ОЗУ разделены на части и разбросаны по всему адресному пространству МК. Так же складывается ощущение, что за счет только этих 136 Кб решить задачу не удастся, может ошибаюсь. Но напрашивается вопрос о том как с пользой использовать 16 Мб внешней памяти и что для этого требуется сделать.. насчет разбиения вашей внутренней памяти не подскажу, с этим МК не сталкивался. Во фриртосе вроде как есть куча, которая умеет жить в нескольких несвязанных регионах ОЗУ. Чтобы работать со sdram, надо настроить процессор (в stm32f4 это FMC, что у вас - не знаю). После этого sdram просто доступна по какому-то адресу. Указываете frertos держать кучу там и вуаля.
|
|
|
|
|
Jun 3 2016, 16:49
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Цитата Имеется плата с: - МК NXP LPC4357 - 32 бит, ядро Cortex-M4, сопроцессор Cortex-M0, Flash 1 МБ, 136 кБ RAM, 16 кБ EEPROM, 64 кБ ROM, 128 байт OTP; - 16 МБ NOR Flash; - 4 МБ Quad-SPI Flash; - 16 МБ SDRAM; - 16 кБ I2C EEPROM. -программа во внутренней флешке -стек и куча во внутреннем ОЗУ -большие "медленные" данные в SDRAM -настройки в EEPROM QSPI Flash, прикольно что от туда можно исполняться, но ооочень медленно.
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Jun 3 2016, 16:56
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Непомнящий Евгений @ Jun 3 2016, 17:11)  Вам придется написать загрузчик, который будет программу из этой флеши копировать в sdram, а оттуда ее уже можно исполнять. Но учтите, что кортекс заточен все ж под программу во внутренней флеши, скорость исполнения из sdram вероятно будет ниже. Скорей всего не нужны там никакие самопальные загрузчики. По-крайней мере в безфлешевых МК семейства LPC43xx встроенный ROM-загрузчик может либо копировать исполняемый код из внешних чипов памяти сидящих на разных интерфейсах (I2C, SPI, SPIFI и т.д.) во внутреннее или внешнее ОЗУ, либо грузить его в ОЗУ из UART, USB и т.п., либо напрямую выполнять код из внешней FLASH-памяти подключенной по SPIFI. При компиляции необходимо образ прошивки создавать либо для загрузки и выполнения в ОЗУ (встроенный загрузчик копирует в ОЗУ и передаёт ему управление), либо для выполнения кода напрямую по адресам компоновки для памяти отображаемой в адресное пространство МК (SPIFI или любая память сидящая на параллельной шине, если она есть в вашем МК). "Заточенность" кортекса под выполнение кода из какого-то типа памяти определяется частотой этой памяти и пропускной способностью шины к ней. И очень сильно ещё на это влияет наличие кешей.
|
|
|
|
|
Jun 4 2016, 10:03
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(masterok @ Jun 3 2016, 11:43)  Имеется плата с: - МК NXP LPC4357 - 32 бит, ядро Cortex-M4, сопроцессор Cortex-M0, Flash 1 МБ, 136 кБ RAM, 16 кБ EEPROM, 64 кБ ROM, 128 байт OTP; - 16 МБ NOR Flash; - 4 МБ Quad-SPI Flash; - 16 МБ SDRAM; - 16 кБ I2C EEPROM. Цитата Стюардесса в салоне нового лайнера объявляет о том, что находится в самолете: - На первой палубе - багаж, на второй - бар, на третьей - поле для гольфа, на четвертой бассейн. И добавляет: - А теперь, господа, пристегнитесь. Сейчас со всей этой #%йней мы попробуем взлететь. Короче, много лишнего там
|
|
|
|
|
Jun 4 2016, 13:44
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(IgorKossak @ Jun 4 2016, 14:47)  Исполнять программу из SPI Flash не очень хорошо, хоть и можно. Она скорее предназначена для загрузчика. Но я храню в ней ещё и логи. Обе эти операции не требуют больших скоростей. Никто не спорит, что конечно код оттуда считывается медленнее, но не нужно там располагать код требующий большого быстродействия. В безфлешевых МК быстрый код нужно копировать в ОЗУ на старте, а тот где не нужно большой скорости (а такого кода имхо большая часть обычно) - можно и в SPIFI. К тому же никто не отменял кеш. У ТС конечно смысла в этом нет - у него есть встроенная FLASH. Но если например будут нужны какие-то массивы данных большого размера (картинки и т.п.), то их можно хранить в этой SPIFI памяти - доступ к ней удобнее чем к просто SPI-флешке.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|