Я думаю о следующей проблеме: я хочу запрограммировать микроконтроллер (скажем, мегатипа AVR) с помощью программы, которая использует какие-то справочные таблицы.
Первой попыткой было бы найти таблицу в отдельном файле и создать ее с помощью любого другого языка сценариев/программы/.... В этом случае необходимо приложить некоторые усилия для создания необходимых исходных файлов для C.
Моя мысль заключалась в том, чтобы использовать препроцессор и компилятор для обработки вещей. Я попытался реализовать это с помощью таблицы значений синуса (просто в качестве примера):
#include <avr/io.h>
#include <math.h>
#define S1(i,n) ((uint8_t) sin(M_PI*(i)/n*255))
#define S4(i,n) S1(i,n), S1(i+1,n), S1(i+2,n), S1(i+3,n)
uint8_t lut[] = {S4(0,4)};
void main()
{
uint8_t val, i;
for(i=0; i<4; i++)
{
val = lut[i];
}
}
Если я скомпилирую этот код, я получу предупреждение о функции sin
. Дальше в сборке ничего нет в разделе .data
. Если я просто уберу sin
в третьей строке, я получу данные в сборке. Понятно, что вся информация доступна во время компиляции.
Можете ли вы сказать мне, есть ли способ добиться того, чего я хочу: компилятор вычисляет как можно больше значений в автономном режиме? Или лучше всего использовать внешний скрипт/программу/... для вычисления записей таблицы и добавления их в отдельный файл, который будет просто #include
d?
constexpr
как подсказку компилятору для выполнения функции во время компиляции. - person johannes   schedule 22.01.2015constexpr
не преимущество. Он просто позволяет вычислять выражение во время компиляции (и даже принуждение компилятора к нему, например, путем присвоения перечислению, не препятствует его повторной оценке во время выполнения в другом месте в тот же исходный файл!). Он ничего не навязывает и не намекает. Тем не менее, мой GCC прекрасно оптимизирует фрагмент кода в OP в таблицу поиска, оцениваемую во время компиляции (без каких-либо особых танцев). - person Damon   schedule 22.01.2015sin
станет ошибкой, если вы используете-fno-builtin
, потому чтоgcc
в настоящее время обрабатывает большинство математических функций как постоянные выражения, если он использует встроенную версию. - person Shafik Yaghmour   schedule 22.01.2015sin
вернет только-1
/255
,0
или1
. Возможно, вы будете использовать `((uint8_t) (sin(M_PI*(i)/n)+1)/2*255)` - person 12431234123412341234123   schedule 04.07.2017