А не скажите ! Времени зря не потратил - впервые переделал сортировку индексами на указателями и понял что это рулёз ! Но так как не вижу конечной путёвой цели на этом заканчиваю. Внутри [+] передаю автору, то что оптимизнул
#include <iom128.h> #include <inavr.h> #define b00000000 0 #define b00000001 1 #define b00000010 2 #define b00000100 4 #define b00001000 8 #define b00010000 16 #define b00100000 32 #define b01000000 64 #define b10000000 128 #define NUMBER 24 __flash char mass_time [] = {50, 51, 52, 53, 100, 100, 100, 100, 100}; __flash char mass_channel [] = { 0, 2, 3, 6, 7, 1, 4, 5, 8}; __flash char pattern [3][NUMBER] = { b00000001, b00000000, b00000000, b00000010, b00000000, b00000000, b00000100, b00000000, b00000000, b00001000, b00000000, b00000000, b00010000, b00000000, b00000000, b00100000, b00000000, b00000000, b01000000, b00000000, b00000000, b10000000, b00000001, b00000000, b00000000, b00000010, b00000001, b00000000, b00000100, b00000000, b00000000, b00001000, b00000000, b00000000, b00010000, b00000000, b00000000, b00100000, b00000000, b00000000, b01000000, b00000000, b00000000, b10000000, b00000000, b00000000, b00000000, b00000001, b00000000, b00000000, b00000010, b00000000, b00000000, b00000100, b00000000, b00000000, b00001000, b00000000, b00000000, b00010000, b00000000, b00000000, b00100000, b00000000, b00000000, b01000000, b00000000, b00000000, b10000000 }; void main (void) { PORTA = 0x55; //Для удобства отслежки в АСМе char k = 1, i, j, def; char *p1, *p2, *min, *s1, *s2; //Для чистоты эксперимента значения получены в Excel =ОКРУГЛ(СЛЧИС() * 100; 0) char time[NUMBER] = {32, 11, 56, 31, 84, 76, 6, 51, 51, 25, 9, 5, 75, 54, 43, 69, 76, 98, 17, 46, 47, 31, 13, 14}; char channel[NUMBER] = {94, 53, 45, 16, 90, 21, 53, 80, 35, 79, 37, 94, 60, 6, 69, 44, 58, 52, 33, 78, 63, 70, 57, 53}; //таблица уставок char pwmtable [4][NUMBER]; //рабочая таблица //Упорядочение входных уставок по времени (Вариант MJ) p1 = &time[0]; s1 = &channel[0]; for(i = 0; i < NUMBER; i++) { min = p1; p2 = p1 + 1; for(j = i + 1; j < NUMBER; j++) { if(*p2 < *min) min = p2; p2++; } if (min != p1) { k = *p1; *p1 = *min; *min = k; //строка *p1 ^= *s1 ^= *p1 ^= *s1; не эффективна по критерию сокращения времени //Смена channels возможно не работоспособна s2 = s1 + (min - p1); k = *s1; *s1 = *s2; *s2 = k; } p1++; s1++; } //Формирование рабочей таблицы очередного шим pwmtable[0][0] = time[0]; pwmtable[1][0] = pattern[1][channel[0]]; pwmtable[2][0] = pattern[2][channel[0]]; pwmtable[3][0] = pattern[3][channel[0]]; k = 0; for(i = 0; i < NUMBER; i++) { if(pwmtable[0][k] = time[i]) { pwmtable[0][k] = time[i]; pwmtable[1][k] |= pattern[1][channel[i]]; pwmtable[2][k] |= pattern[2][channel[i]]; pwmtable[3][k] |= pattern[3][channel[i]]; } else { pwmtable[0][k + 1] = time[i]; pwmtable[1][k + 1] = pwmtable[1][k] | pattern[1][channel[i]]; pwmtable[2][k + 1] = pwmtable[2][k] | pattern[2][channel[i]]; pwmtable[3][k + 1] = pwmtable[3][k] | pattern[3][channel[i]]; k++; } } //Для входных уставок /*И нафиг они нужны в конце файла ??? MJ (c)*/ for (i = 0; i < 9; time[i] = mass_time[i], channel[i++] = mass_channel[i]); PORTA = 0xAA; //Для удобства отслежки в АСМе }