А не скажите ! Времени зря не потратил - впервые переделал сортировку индексами на указателями и понял что это рулёз ! Но так как не вижу конечной путёвой цели на этом заканчиваю. Внутри [+] передаю автору, то что оптимизнул
#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; //Для удобства отслежки в АСМе
}