2016-09-24 12 views
0

C newbie here - Я работаю со встроенным устройством и заинтересован в передаче «страницы» символов ASCII по определенному протоколу.Как построить серию 32-битных слов из блока текста во время компиляции

Этот протокол предусматривает передачу 2 символов (в частности, разрядных позиций) 32-битного слова. Остальные биты слова используются для других целей.

Вместо определения страницы, такие как

MY_PAGE { 
{ WHATEVER, 'H', 'E', BAR} // word 1 
{ WHATEVER, 'L', 'L', BAR} //word 2 
{ WHATEVER, 'O', NUL, BAR} // word 3 
} 

Для ясности, я хотел бы просто указать «Hello» и пусть макрос рукоятку в сборе слов данных, чтобы это произошло. Это больше хлопот, чем того стоит?

Для решения времени выполнения я бы просто проанализировал строковый литерал и построил что-то в памяти.

Спасибо!

ответ

0

Я бы использовал язык сценариев для генерации данных во время компиляции. Выберите свой выбор, но питона идеально подходит для такого рода вещи:

sourcefile = open ("page.src") 
generatedfile = open("page.out", "w") 

# Do whatever processing you need to generate 
# code from your source data that will be read by the c-compiler eg 

dat = sourcefile.read(2) 
generatedfile.write("{FOO, %s, %s, BAR}" %(dat[0], dat[1])) 
#etc 

Теперь включить сгенерированный файл в C Источник

#include "page.out" 

Чтобы сохранить файл проще сценарий, убедитесь, что любой код, который может быть содержащиеся в файле C содержится в файле C, а не в сгенерированном файле, например:

struct _page pagedata = { 
#include "page.out" 
}; 

Как реальный пример, я сделал это в прошлом, как и

const char * fpga_data = { 
#include "comma_separated_byte_values.inc" 
}; 

Если вы используете сделать файл, сказать ему, что page.out зависит от page.src и на вашем питона скрипт, и что ваш файл объекта зависит от page.out:

page.out: page.src processpage.py 
    python processpage.py 

main.o: main.c page.out 
    $cc main.c 
+0

интересный! никогда не думал об использовании питона или чего-либо вне препроцессора действительно ... большое спасибо – user3457614

0

Звучит скорее как работа для функции времени выполнения, чем макрос, если честно. Вы можете иметь различные строки & константы и другие вещи и собирать их на выходе. Это также отделяет ваше хранилище от вашей передачи, которое не обязательно должно быть одним и тем же, и, вероятно, не должно.

+0

Я вообще согласен, хотя я основывал свой ответ на предположении, что была причина, по которой OP должен был это сделать во время компиляции. Например, возможно, система имеет очень небольшой след? – Rodney

 Смежные вопросы

  • Нет связанных вопросов^_^