MSP430 RAM переполнение

MSP430G2553 имеет только 512 байт ОЗУ, но 16 КБ флэш-памяти. На этом микроконтроллере все статические / глобальные переменные назначаются в ОЗУ в разделе .bss. Все локальные переменные назначаются в ОЗУ в разделе .stack. Все динамически выделяемые переменные памяти (malloc) назначаются в ОЗУ в разделе .sysmem.

Мне нужен этот MSP430 для отслеживания подключенных устройств через Wi-Fi. У меня есть структура как таковая:

struct dev
{
    char type[20];
    char ipAddress[13];
    char name[20];
    char status[1];
};

Эта структура занимает 54 байта памяти для каждого устройства. Я планирую подключить к этому MSP430 20+ устройств, и мне понадобится 20 таких структур. 20 х 54 байта = 1080 байтов. Очевидно, это слишком много для 512 байт оперативной памяти.

Есть ли способ записать эти структуры во FLASH, поскольку у меня есть 16 КБ памяти для использования? Я понимаю, что FLASH - это переменные, которые доступны только для чтения. Эти структуры, очевидно, будут назначены, поэтому это чтение-запись, и я не уверен, возможно ли это.

Я не совсем понимаю, зачем TI делать устройство с 16 КБ флэш-памяти и только 512 байтами ОЗУ, когда все переменные, требующие операций чтения-записи, хранятся в ОЗУ. Похоже, это пустая трата места.

Я попытался изменить эти разделы .bss / .stack / .sysmem на FLASH в файле компоновщика, и MSP430 не будет работать в таком виде. Я также попытался изменить размер ОЗУ и файла компоновщика и изменить места в памяти, добавив еще 512 байт, но это тоже не будет работать так.

Есть ли у меня здесь какие-нибудь варианты?


person user1779362    schedule 23.07.2015    source источник
comment
Кодируйте все, вам не нужно сохранять все в виде строк, кроме имени.   -  person user3528438    schedule 23.07.2015
comment
Зачем вам нужно 20 байтов для определения типа? Тип char может ссылаться на 256 различных типов, которые могут быть подробно описаны в ПЗУ (или коде FLASH), но вы должны поместить поле рядом с полем status или упаковать struct. В любом случае, в чем смысл char status[1]?   -  person Weather Vane    schedule 23.07.2015
comment
IPv4 требует только 4 байта, а не 13. IPv6 требует только 6 байтов.   -  person Weather Vane    schedule 23.07.2015
comment
@WeatherVane: 6 байтов будут Ethernet. IPv6 на самом деле занимает 16 байт (128 бит)   -  person too honest for this site    schedule 23.07.2015
comment
Если значения меняются более одного раза, вам категорически не следует записывать их во Flash! Также обратите внимание, что запись во флэш-память требует специальной последовательности команд и сначала для стирания сектора, а затем для программирования. Оба обычно занимают от нескольких мсек до 1 секунды (фактическую продолжительность см. В таблице данных). В это время ЦП не может выполнять код из флэш-памяти, поэтому вся система останавливается.   -  person too honest for this site    schedule 23.07.2015
comment
@Olaf mybad, ты прав.   -  person Weather Vane    schedule 23.07.2015
comment
Примечание: используйте stdint.h типы, а не стандартные типы. Также: мне все еще интересно, откуда у вас IP-адрес 13 char?   -  person too honest for this site    schedule 23.07.2015
comment
Можете ли вы добавить какое-нибудь дополнительное аппаратное обеспечение, например, flash-память последовательного порта / SPI, как эти маленькие жуки Atmel с последовательным EEPROM?   -  person Martin James    schedule 23.07.2015
comment
не совсем понимаю, почему TI ...: На самом деле это наиболее распространенное поведение для микроконтроллеров со встроенной Flash. То же самое и при использовании внешней Flash, будь то параллельный NOR, NAND или последовательный. Покажите мне, пожалуйста, флеш-устройство, которое вы можете читать во время письма.   -  person too honest for this site    schedule 23.07.2015
comment
Это могло быть грубое кодирование IPv4 как "001002003004\0"   -  person Weather Vane    schedule 23.07.2015
comment
@WeatherVane: Понятно. Кто бы мог использовать такое? Квадрат с точками для пользовательского ввода-вывода (плюс терминатор) или двоичный uint32_t, как в IP-кадре.   -  person too honest for this site    schedule 23.07.2015
comment
@Olaf тот же человек, который использует char status[1];   -  person Weather Vane    schedule 23.07.2015
comment
@WeatherVane: Достаточно честно: -}. Программисты для ПК стали «голыми железами».   -  person too honest for this site    schedule 23.07.2015
comment
... или кто не выясняет свои системные требования до определения чипа.   -  person Weather Vane    schedule 23.07.2015
comment
Похоже на моего бывшего босса: это не должно стоить больше x € - посмотрите, что вы можете сделать!   -  person too honest for this site    schedule 23.07.2015
comment
@WeatherVane Однажды я купил эту стартовую панель MSP с двумя разными чипами за 4 доллара. Полагаю, это работает так: Вау! Дешевая доска! Принимая это. Теперь .. что я могу с этим сделать?   -  person Eugene Sh.    schedule 23.07.2015
comment
У меня еще валяется PIC16F84. Где мне взять для этого веб-сервер? Конечно, многопроцессорность   -  person too honest for this site    schedule 23.07.2015
comment
ОПИСАНИЕ ... Типичные приложения включают недорогие сенсорные системы, которые улавливают аналоговые сигналы, преобразуют их в цифровые значения, а затем обрабатывают данные для отображения или передачи в хост-систему. ti.com/lit/ds/symlink/msp430g2553.pdf   -  person Weather Vane    schedule 23.07.2015
comment
@WeatherVane: ... для передачи в хост-систему. Если это может быть один хост, почему не 20+? Не может быть этого намного сложнее ...   -  person too honest for this site    schedule 23.07.2015
comment
@Olaf Я истекаю кровью за него. Мне приходилось писать что-то, когда ОЗУ не хватало, но каким-то образом мне удавалось это исправить.   -  person Weather Vane    schedule 23.07.2015
comment
@WeatherVane: В 80-х / начале 90-х годов программное обеспечение для сжатия PC-RAM было широко распространено (это было скорее плацебо). Но да, я знаю то же самое. Но сделали черновое планирование заранее. OP даже забыл про другие переменные и стек. MSP430 использует изрядное количество стека для прерываний: 14 регистров * 2 байта). Но это больше похоже на частный проект, а не на работу. Для этого M0 (+), вероятно, будет дешевле.   -  person too honest for this site    schedule 23.07.2015


Ответы (4)


Да, вы можете записывать данные во флеш-память. Единственная проблема возникает, когда вы хотите изменить данные. Вы можете стереть только те сектора, которые имеют размер 512 байт. Таким образом, вы можете взять два флеш-сектора из флеш-памяти и хранить данные для 10 устройств в каждом секторе. Однако флэш-память может читаться как ОЗУ, поэтому вам не нужен какой-то код подкачки, вы просто указываете каждую запись устройства с помощью указателя. Последняя проблема заключается в том, что у флеш-памяти есть ограничение на количество циклов стирания, здесь около 10000 циклов. Таким образом, вам также может потребоваться написать код для распределения данных по разным секторам с течением времени, в зависимости от количества ожидаемых изменений и желаемой долговечности службы.

person John Hammond    schedule 23.07.2015
comment
Когда вы говорите, что размер секторов составляет 512 байт, вы имеете в виду этот конкретный микроконтроллер или все микроконтроллеры? - person Fiddling Bits; 23.07.2015
comment
@FiddlingBits: для данного MCU это 512 байт, но FUG называет это сегментами. Это не относится ко всем флеш-устройствам (будь то микроконтроллеры или дискретные). - person too honest for this site; 23.07.2015

Вы можете хранить постоянные данные во флеш-памяти / памяти программ. Если вы знаете, что некоторые переменные / массивы фактически не меняются после инициализации, вы можете объявить их как static const в своем коде, и компилятор поместит их в раздел .text, который обычно хранится во FLASH-памяти. Если у вас есть динамические данные, которые не помещаются в памяти ... хорошо. Вы облажались, если не думаете об оптимизации (например, о повторном использовании одного и того же пространства для разных вещей в разное время ...). Конечно, есть возможность реализовать какую-то функцию «подкачки» с FLASH, если ваша часть имеет программный доступ к записи FLASH. Но на самом деле все не так просто.

И для этого:

Я не совсем понимаю, зачем TI делать устройство с 16 КБ флэш-памяти и только 512 байтами ОЗУ, когда все переменные, требующие операций чтения-записи, хранятся в ОЗУ. Похоже, это пустая трата места.

Вы получаете то, за что платите. У каждого микроконтроллера есть определенный набор приложений, для которых он предназначен. Если эта конкретная микросхема не подходит для вашего приложения, вероятно, она не входит в этот диапазон.

person Eugene Sh.    schedule 23.07.2015
comment
Да .. с этим требованием и harwdare, я бы остановился на "Вы облажались" :( - person Martin James; 23.07.2015
comment
@MartinJames: Проблем нет, есть только вызовы. Иногда мы чувствуем себя более сложными, чем обычно. - person too honest for this site; 23.07.2015
comment
@Olaf, но иногда ты теряешь вызов :) - person Eugene Sh.; 23.07.2015
comment
@EugeneSh .: Нет, просто терпение. :-) - person too honest for this site; 23.07.2015
comment
@ Олаф, в таком случае, я рад, что ты не хирург. - person Martin James; 24.07.2015

В этой структуре вы можете освободить немало места.

Поле типа type, вероятно, не обязательно должно быть массивом символов. Вы можете использовать набор символьных констант со всеми возможными типами.

IP-адрес также не нужно хранить в виде строки. Предполагая IPv4, вам нужно всего четыре байта.

status не обязательно должен быть массивом размера 1. Достаточно простого char.

Итак, теперь у вас есть что-то вроде этого:

struct dev
{
    uint32_t ipAddress;   // 4 bytes
    char name[20];        // 20 bytes
    char type;            // 1 byte
    char status;          // 1 byte
};                        // 2 bytes padding, total = 28 bytes

Этого все еще недостаточно, чтобы вместить 20 из них в 512 байт памяти, но лучше, чем было у вас.

person dbush    schedule 23.07.2015
comment
В США уже закончились адреса PIv4. Для Интернета вещей я настоятельно рекомендую использовать IPv6. (а char [1] не требует больше, чем char. Это похоже на версию до C99 для гибкого элемента массива). Примечание: MSP430 - это 16-битная архитектура. Таким образом, заполнение идет по четным адресам, а не по 32-битной границе. - person too honest for this site; 23.07.2015
comment
Вам также понадобится стопка. - person Weather Vane; 24.07.2015

Честно говоря, ваш лучший вариант - это, вероятно, переключиться на более производительный набор микросхем. MSP430 G-line действительно предназначена для приложений с очень низким энергопотреблением и низкой производительностью, Ethernet не является ни тем, ни другим (и уж точно не несколькими соединениями TCP / IP одновременно!).

Что касается того, почему они сделали микросхему с огромным пространством для флэш-памяти и крошечной SRAM, ну, флэш-память дешевая и компактная, а SRAM занимает много места на кристалле, поэтому TI пришлось пойти на компромиссы, чтобы поставить этот MCU менее чем за 1 доллар. . Как упоминалось в некоторых других ответах, вы можете использовать этот большой объем Flash для написания большего количества кода, который может кодировать / сжимать / декодировать / распаковывать данные в / из SRAM.

Другой вариант - использовать одну из микросхем MSP430 серии «Росомаха». В них используется единый банк FRAM, а не отдельные банки Flash и SRAM.

person TezlaCoil    schedule 24.07.2015
comment
Что ж, огромные по сравнению с оперативной памятью; фактор 32 разницы. - person TezlaCoil; 28.07.2015