У меня есть встроенное приложение с критичным по времени ISR, которое должно перебирать массив размером 256 (предпочтительно 1024, но минимум 256) и проверять, соответствует ли значение содержимому массивов. Значение bool
будет установлено в true, если это так.
Микроконтроллер представляет собой ядро NXP LPC4357, ARM Cortex M4, а компилятор - GCC. Я уже объединил уровень оптимизации 2 (3 медленнее) и поместил функцию в оперативную память вместо флэш-памяти. Я также использую арифметику указателей и цикл for
, который выполняет обратный отсчет вместо повышения (проверка, если i!=0
быстрее, чем проверка, если i<256
). В итоге я получаю длительность 12,5 мкс, которую необходимо резко сократить, чтобы это было возможно. Это (псевдо) код, который я сейчас использую:
uint32_t i;
uint32_t *array_ptr = &theArray[0];
uint32_t compareVal = 0x1234ABCD;
bool validFlag = false;
for (i=256; i!=0; i--)
{
if (compareVal == *array_ptr++)
{
validFlag = true;
break;
}
}
Какой самый быстрый способ сделать это? Использование встроенной сборки разрешено. Другие "менее элегантные" трюки также допускаются.