Альтернативный взгляд: микроконтроллерам не хватает памяти.
По крайней мере, не при правильном программировании. Программирование микроконтроллера не совсем то же самое, что программирование общего назначения, чтобы сделать это правильно, вы должны знать о его ограничениях и программировать соответственно. Есть инструменты, которые помогут обеспечить это. Ищите их и изучайте их - по крайней мере, как читать сценарии компоновщика и предупреждения.
Однако, как говорят Majenko и другие, плохо запрограммированный микроконтроллер может исчерпать память, а затем сделать что-нибудь, включая бесконечный цикл (который, по крайней мере, дает сторожевому таймеру шанс сбросить его. Вы включили сторожевой таймер, не так ли? )
Общие правила программирования для микроконтроллеров избегают этого: например, вся память либо выделяется в стеке, либо статически (глобально) выделяется; «new» или «malloc» запрещены. Так же как и рекурсия, так что максимальная глубина вложенности подпрограммы может быть проанализирована и показана для размещения в доступном стеке.
Таким образом, максимальная требуемая память может быть вычислена при компиляции или компоновке программы и сравнена с объемом памяти (часто кодируемым в сценарии компоновщика) для конкретного процессора, на который вы нацелены.
Тогда микроконтроллеру может не хватить памяти, но ваша программа может. И в этом случае вы получите
- переписать, поменьше или
- выберите больший процессор (они часто доступны с разным объемом памяти).
Одним из общих правил программирования микроконтроллеров является MISRA-C , принятый в автомобильной промышленности.
На мой взгляд, лучшая практика - использовать подмножество Ады SPARK-2014 . На самом деле Ada достаточно хорошо ориентируется на небольшие контроллеры, такие как AVR, MSP430 и ARM Cortex, и, по сути, обеспечивает лучшую модель для программирования микроконтроллеров, чем C. Но SPARK добавляет в программу аннотации в виде комментариев, которые описывают, что делает программа.
Теперь инструменты SPARK будут анализировать программу, включая эти аннотации, и проверять ее свойства (или сообщать о потенциальных ошибках). Вам не нужно тратить время или пространство кода на ошибочные обращения к памяти или целочисленные переполнения, поскольку доказано, что они никогда не происходят.
Несмотря на то, что SPARK требует дополнительной предварительной работы, опыт показывает, что он может получить продукт быстрее и дешевле, потому что вы не тратите время на погоню за таинственными перезагрузками и другим странным поведением.
Сравнение MISRA-C и SPARK