В настоящее время я работаю над настройкой структуры в C для использования между несколькими микроконтроллерами. Рамка должна нести код всего устройства, поэтому приложение содержит только абстрактное использование периферийных устройств (например, SerialPort_Read, write, SetBaudRate и т. Д.)LUT в макросе C
Одна из вещей, с которыми я изо всех сил пытаюсь найти решение для в C - карта вывода ввода/вывода. Я видел проекты (например, очень популярный Arduino), где карта контактов помещена в LUT (таблица поиска), которая используется во время выполнения. Однако этот LUT никогда не будет изменен во время выполнения, поэтому нет необходимости использовать это в памяти. Например, эта функция устраняет некоторые битовые индексы и регистров из некоторых «константных UINT» таблиц, и либо устанавливает или сбрасывает бит:
void pinMode(uint8_t pin, uint8_t mode)
{
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *reg;
if (port == NOT_A_PIN) return;
// JWS: can I let the optimizer do this?
reg = portModeRegister(port);
if (mode == INPUT) {
uint8_t oldSREG = SREG;
cli();
*reg &= ~bit;
SREG = oldSREG;
} else {
uint8_t oldSREG = SREG;
cli();
*reg |= bit;
SREG = oldSREG;
}
}
Потому что это реальный код C работает на контроллере это истощает практичность и скорость , Я предпочел бы определить какое-то макрос, который делает то же самое, но уже решен во время компиляции на «однострочник», который можно скомпилировать гораздо более эффективен:
GPIO_Write(PORTA, 5, 1); // Write '1' to pin 5 on PORTA
> LATA |= 1<<5; // Sets bit 5 high
GPIO_Tris(PORTA, 4, OUTPUT); // Set pin 4 on PORTA to output
> PORTA &= ~(1<<4); // sets pin 4 as output I/O type
Кто-нибудь знает, если это возможно (и как) определять и использовать справочную таблицу с макросом в C?
В данный момент я использую компилятор MicroChip C30, который, как мне кажется, основан на GCC. Он должен быть переносимым между различными компиляторами, включая MicroChip C18, C32, а также ARM и AVR.
Пожалуйста, не ссылайтесь на код на внешних сайтах. –
Хорошо, спасибо, я удалил ссылки и объяснил это здесь. – Hans
В вашем примере кода, что вы хотите, чтобы оптимизатор сделал? Если порт может иметь разные значения во время выполнения, в зависимости от того, как вызывается функция. – blueshift