2016-01-19 4 views
0

В моем проекте используется механизм ведения журнала, который в основном является вызовом макроса в каждом из моих компонентов.Замена макросов во время процесса компиляции

За макроком - это вызов функции, который используется для записи журнала с использованием медленной линии, такой как UART.

Пример:

LOG("An error has occurred. Please check XYZ. Code: %d", errorcode) 

Вместо того, чтобы писать весь текст UART, я хочу, чтобы заменить все вхождения LOG, как это:

LOG("12345 %d", errorcode) 

Каждый вызов LOG должен быть заменен коротким версия, где текст заменяется уникальным номером. Динамическая часть не может быть заменена. Отображение уникального числа в исходный текст должно быть помещено в файл. Что-то вроде этого:

12345:"An error has occurred. Please check XYZ. Code:" 

На другом конце UART читатель журнала должен прочитать этот файл отображения, чтобы сделать его читаемым человеком.

Преимущество в том, что это идеально подходит для низкой пропускной способности.

Мой вопрос: Как это сделать при компиляции моего кода? Я использую gcc и работаю в среде Linux. Я предполагаю, что препроцессор должен справиться с этим. Или какой-то предварительный сценарий? Или есть лучший способ сделать это?

+0

Непонятно для меня. У вас есть функция писать символы в UART или это то, что вы ищете? – LPs

+0

Нет, часть UART работает. Мне просто нужно знать, как сделать такую ​​замену, как описано выше, для уменьшения данных, которые должны быть переданы через UART. – Ferhat

+1

Это не проблема программирования, но проблема с заменой текста текстового редактора? Просто просмотрите код и измените все сообщения. Кроме того, если вы обеспокоены пропускной способностью, почему вы отправляете данные как некоторые секретные бессмысленные номера в ASCII? Если у людей возникнут проблемы, чтобы понять это, отправьте их как исходные двоичные файлы. Два целых числа = 4 или 8 байт, вместо 10 + байтов, которые нужны строке. – Lundin

ответ

1

Для этого вам наверняка понадобится сценарий предварительной обработки. Сила препроцессора C довольно ограничена - в значительной степени она ограничивается простой заменой текста. Если все ваши вызовы LOG находятся по 1 строке каждый, и ни одно из них не содержит парсеров, то вы, вероятно, можете сделать это с помощью довольно простого инструмента обработки текста, возможно, awk. Если нет, я бы использовал язык программирования, возможно, perl, чтобы его построить.

Я предполагаю, что в вашей программе есть большое количество этих вызовов LOG - иначе просто редактирование программы может иметь больше смысла.

+0

Я не могу гарантировать, что все они - только однострочные звонки. Значит, это означает, что я не могу использовать awk? Честно говоря, я раньше не использовал awk. Поэтому вы предпочитаете писать сценарий в perl. Легко ли интегрировать его в make-файл, чтобы он мог запускаться первым, прежде чем компилятор сможет выполнить свою работу? Да, это огромное количество вызовов журналов. – Ferhat

+0

Возможно, вам удастся это сделать в awk, это просто, что чем ближе ваши требования к фактическому анализу кода (например, компилятора), тем больше он будет работать в более простых инструментах. (Хотя, я бы не стал спорить, что какой-то человек с избытком свободного времени не написал компилятор в awk). Да, Makefile может выполнять ряд команд, поэтому включение дополнительного шага в компиляцию легко. –

+0

Предположим, для этого я буду использовать скрипт perl. Вы предпочитаете использовать текстовый поиск и замену (regex?)? Мне нужно проверить, есть ли парсер C, который мог бы мне помочь. Я действительно не хочу писать один сам по себе :) – Ferhat

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