Я пытаюсь сделать следующее: Сохранение текстового файла (7 КБ) во флэш-памяти платы STEVAL-MKI109V2 (работает с freeRTOS), чтение этого текстового файла и выполнение некоторых вычислений с ним на самом устройстве. У меня есть 2 проблемы, касающиеся этого:
1) Хранение текстового файла
Достаточно ли просто добавить текстовый файл в мой проект keil? Могу ли я получить к нему доступ после компиляции?
2) Доступ к данным
Вот где я потерпел неудачу до сих пор. Сначала я попытался использовать fopen () из stdio.h, но я получил некоторые ошибки при компиляции. Я обнаружил, что мой проект компилируется с использованием microLib, который, кажется, не включает файловый ввод / вывод. После компиляции со стандартной C-библиотекой все прошло успешно, но как только я дошел до части fopen в моем коде, система вылетает.
Теперь я не знаю, причина в том, что текстовый файл не найден или я не могу использовать fopen () в моей встроенной системе. Я не нашел дополнительной информации в документах или форумах STM, кроме FLASH_Unlock (); функция, но, кажется, она используется для записи.
Нужно ли сохранять свой текстовый файл другим способом и получать доступ по адресу памяти, а не по имени файла? Я запутался и не могу найти какую-либо информацию в Интернете.
Заранее благодарю за любую помощь!
Если вы просто хотите, чтобы содержимое файла было символьной строкой, вы можете преобразовать файл в исходный код C, например, используя небольшую программу на Python (или любой другой язык, я просто использую Python для этого, поскольку это проще сделать в Python, чем, например, в C или C ++). Просто создайте что-то вроде:
const char my_text[] = {
... here goes the text
};
Проще всего, просто включите каждую строку "
,
Затем либо добавьте этот файл в проект (вам потребуется объявление extern, откуда вы его используете), либо #include
это и сделать заявление static
(спасибо @clifford).
Если вы просто хотите внедрить ресурс в свое приложение, реализация файловой системы будет излишней, и вам следует использовать метод @ Olaf.
Однако, если вам нужны данные, которые вы можете программировать независимо от вашего приложения; тогда вы можете просто зарезервировать необходимое количество флеш-страниц на кристалле и либо запрограммировать их отдельно через JTAG, либо добавить поддержку загрузки и программирования флеш-страниц в свое приложение. Или для большей гибкости вы можете добавить файловую систему, которая использует зарезервированное количество флеш-страниц, что также потребует от вас добавления в ваше приложение средств для загрузки и записи данных.
Все флэш-страницы на STM32F1xx имеют одинаковый размер, поэтому не имеет значения, используете ли вы страницы с низкой или высокой памятью, но использование верхних страниц проще, потому что вектор сброса, с которого начинается ваш код, находится в малой памяти. Чтобы зарезервировать страницы (не допускать размещения в них кода компилятором), вы просто уменьшаете верхний адрес по умолчанию в параметрах карты памяти проекта (я предполагаю, что вы используете Keil ARM-MDK / uVision, поскольку вы упомянули MicroLib).
И Keil MicroLib, или его полнофункциональная библиотека поддерживают потоки ввода / вывода, но поскольку возможности ввода / вывода цели не могут быть заранее известны, для этого требуется то, что известно как retargetting. Проще всего это часто реализуется только для потоков stdout / stdin, но вы можете реализовать файловые дескрипторы для любого устройства ввода-вывода — однако для выполнения файлового ввода-вывода вам нужны файловые системы, такие как ELM FatFs или же Yaffs для чего вам все еще нужно будет реализовать низкоуровневые драйверы для доступа к флэш-памяти. Если вы используете библиотеку файловой системы; вам на самом деле не нужно подключать stdio через ретаргетинг; вы можете получить доступ к библиотеке напрямую — я упомянул ретаргетинг, потому что вы, кажется, немного разбираетесь в том, как работает stdio.
Детали программирования флэш-памяти на STM32F1xx приведены в отдельное руководство из основного справочника, в то время как стандартная периферийная библиотека STM32 включает функции низкого уровня для поддержки программирования. Здесь вы найдете серьезное замечание, не раскрытое в документации ST; когда вы программируете или стираете флэш-память, она блокирует адрес и шину данных все флеш-память — поскольку именно из этого процессора процессор обычно извлекает инструкции, все ядро останавливается на время выполнения операции, которое может достигать 40 мс (это хуже для STM32F2xx при 800 мс!); следовательно, запись на флэш-страницу может привести к неправильной работе.
Если вы хотите использовать файловую систему на таком устройстве; вам может быть лучше использовать SPI-порт для связи с SD-картой или иным образом использовать внешнюю энергонезависимую память.