Есть ли готовое решение для встроенного c для использования внешнего строкового ресурса на последовательной флэш-памяти?

Я работаю над SoC с 128 КБ ОЗУ, и в настоящее время печать UART слишком велика, поэтому нам нужно уменьшить размер кода, отрисовывая его из памяти.

У нас есть работающая 128-мегабайтная последовательная флэш-память SPI на борту, и я хотел бы хранить на ней строки. Обратите внимание, что на флеш-памяти или в нашей прошивке нет файловой системы.

Вместо того, чтобы писать все самостоятельно, я хотел бы знать, есть ли какой-нибудь полезный код, стандарт или другой материал, который мы можем использовать?

в том числе: (все, что ниже, может быть полезно)

  1. библиотека, генерирующая
  2. реализация метода выборки ресурсов.
  3. Чтение / запись SPI FLASH (на самом деле это я написал).

Я жду чего-то вроде этого:

UART_PRINT(C315);

и на FLASH есть запись «C315», соответствующая «Hello world».

мы читаем его, а затем распечатываем через UART во время выполнения. и конечный результат - "Hello world" на терминале.

конечно, приветствуется все, что поразит меня. :)


person Ethansong    schedule 28.04.2015    source источник
comment
На самом деле это не связано с вопросом, но я думаю, что DMA может поразить вас. Есть ли на вашем чипе DMA? Было бы неплохо, если бы вы могли написать уровень приложения, чтобы вам не приходилось беспокоиться о том, находятся ли данные во встроенной флэш-памяти или во внешней. Не говоря уже о том, чтобы перелопатить все данные из SPI в буферы UART.   -  person Lundin    schedule 28.04.2015


Ответы (2)


Создайте массив указателей на строки и используйте индекс в массиве, аналогичный ресурсу. Этот массив, а также строки могут храниться во флэш-памяти. Может быть проще использовать ассемблер для массива указателей и строк, возможно, как отдельную сборку от вашего встроенного кода. Вам нужно будет согласовать имена индексов, используемые в включаемом файле .h, с массивом указателей на строки, аналогично файлу ресурсов, используемому для приложений Windows. Это можно сделать с помощью нескольких определений или перечисления:

enum stringindexes{C000, C001, ...};

update - мне интересно, можно ли использовать что-то вроде редактора ресурсов Windows для создания указателей и строк. Эта программа make требует некоторого реверс-инжиниринга для создания утилиты для преобразования созданного файла ресурсов в двоичное изображение только с массивом указателей и строк, но при этом автоматически генерируется включаемый файл, дающий имена указателям. Во всяком случае, редактор ресурсов можно использовать в качестве руководства для создания пользовательской программы для создания включаемого файла с определениями или перечислениями для индексации в массиве указателей на строки.

person rcgldr    schedule 28.04.2015
comment
Хранилище находится в памяти с последовательным доступом на шине SPI, а не в шине памяти - у вас не может быть указателя на неадресно отображенную память. - person Clifford; 28.04.2015
comment
Указатели будут смещены во флэш-память. Я предполагаю, что вы можете произвольно обращаться к флеш-памяти через шину SPI. - person rcgldr; 28.04.2015
comment
В контексте тега C термин указатель может вводить в заблуждение, но да, метод доступа - это произвольный доступ / последовательное считывание. Я не могу представить, чтобы это простое и прямое решение еще не пришло в голову OP. Вероятно, простой ответ на его вопрос - нет, и что ему действительно нужно написать свою собственную систему. Однако я думаю, что он, возможно, переоценивает необходимые усилия. Как вы отметили, основная проблема, возможно, в первую очередь заключается в том, чтобы строки попали в память. Не уверен, что на ассемблере было бы что-нибудь проще - в этом нет необходимости. - person Clifford; 28.04.2015
comment
@Clifford - я только упомянул, что может быть проще использовать ассемблер, возможно, как отдельную сборку, для создания двоичного образа, который содержит только указатели (смещения) и строки. Меня беспокоит, что исходный файл C, содержащий только данные (указатели и строки), будет содержать какие-либо дополнительные данные в созданном двоичном изображении. - person rcgldr; 28.04.2015
comment
Я понимаю; Я предполагал, что приложение загружает строки и метаданные динамически, а не встраивает их в код; в этом нет большого преимущества, возможно, потому что вы не могли загрузить последовательную EEPROM с помощью программатора микроконтроллера. - person Clifford; 29.04.2015
comment
Возможно, отдельная инициализированная сборка с кодом, используемым для передачи указателей и данных в EEPROM, тогда после программирования EEPROM будет загружен рабочий код. - person rcgldr; 29.04.2015
comment
Это имеет смысл, хотя я бы предложил включить загрузчик EEPROM в окончательное приложение и получить данные через последовательный порт или USB, что позволит обновлять строки после развертывания. - person Clifford; 29.04.2015
comment
@Clifford - Да, наличие загрузчика EEPROM в конечном приложении имеет смысл. Как это устройство загружается? Есть ли что-то вроде ПЗУ с кодом, достаточным для загрузки небольшого приложения для обновления, которое, в свою очередь, обновит EEPROM и рабочее приложение? - person rcgldr; 30.04.2015

Вы можете использовать компоновщик.

Поместите строки SPI FLASH в настраиваемый раздел в настраиваемой области. Запрограммируйте SPI FLASH с содержимым настраиваемой области, созданным компоновщиком.

Используйте строковые указатели в качестве аргумента для UART_PRINT(). Функция должна преобразовать указатель в смещение, вычитая базовый адрес настраиваемого раздела из указателя строки. Затем используйте смещение, чтобы получить строку из SPI FLASH.

person D Krueger    schedule 29.04.2015