Регистры 32-х битные, достаточно по границе 4-х байт выровнять.
можно поподробнее?
Код: Выделить всё
const uint64_t table[256];можно поподробнее?
Код: Выделить всё
const uint64_t table[256];что 4 что 1024 не помогло.Reflector писал(а):Регистры 32-х битные, достаточно по границе 4-х байт выровнять.
Говорил же, поподробнее.Reflector писал(а):Код: Выделить всё
const uint64_t table[256];
Код: Выделить всё
*((volatile uint64_t*)&DMABuffer[0]) = tablica[pixeld[pixel_cnt].g];
*((volatile uint64_t*)&DMABuffer[8]) = tablica[pixeld[pixel_cnt].r];
*((volatile uint64_t*)&DMABuffer[16]) = tablica[pixeld[pixel_cnt].b];Код: Выделить всё
#define HIGH 26 //38=0x26
#define LOW 13 //19=0x13
#define _CONCAT_(x,a,s,d,f,g,h,j,k) x ## a ## s ## d ## f ## g ## h ## j ## k
#define CONCAT(x,a,s,d,f,g,h,j,k) _CONCAT_(x,a,s,d,f,g,h,j,k)
const uint64_t tablica [256] =
{
CONCAT(0x,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW),
CONCAT(0x,LOW,LOW,LOW,LOW,LOW,LOW,LOW,HIGH),
CONCAT(0x,LOW,LOW,LOW,LOW,LOW,LOW,HIGH,LOW),
CONCAT(0x,LOW,LOW,LOW,LOW,LOW,LOW,HIGH,HIGH),
CONCAT(0x,LOW,LOW,LOW,LOW,LOW,HIGH,LOW,LOW),
CONCAT(0x,LOW,LOW,LOW,LOW,LOW,HIGH,LOW,HIGH),
CONCAT(0x,LOW,LOW,LOW,LOW,LOW,HIGH,HIGH,LOW),
CONCAT(0x,LOW,LOW,LOW,LOW,LOW,HIGH,HIGH,HIGH),
CONCAT(0x,LOW,LOW,LOW,LOW,HIGH,LOW,LOW,LOW),Код: Выделить всё
*((volatile uint64_t*)&DMABuffer[0]) = tablica[pixeld[pixel_cnt].g];Только сейчас глянул, он переворачивает байты. Поменял такReflector писал(а):Нужно всего-то скопировать несколько элементов из одного массива в другой
Код: Выделить всё
#define _CONCAT_(x,a,s,d,f,g,h,j,k) x ## k ## j ## h ## g ## f ## d ## s ## aНет, когда игрался c F100, добился стабильности только тогда когда между светиками делаю паузу, то есть вот такReflector писал(а):DMABuffer надеюсь тоже выровнял?
Код: Выделить всё
*((volatile uint64_t*)&DMABuffer[0]) = tablica[pixeld[pixel_cnt].g];
*((volatile uint64_t*)&DMABuffer[8]) = tablica[pixeld[pixel_cnt].r];
*((volatile uint64_t*)&DMABuffer[16]) = tablica[pixeld[pixel_cnt].b];
DMABuffer[24] = 0;
}
else
{warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
И чем это обошлось? МК, лента и компутер?VladislavS писал(а):Как же дорого обходится не слушать советы бывалых.
Код: Выделить всё
__attribute__((aligned(4)))Код: Выделить всё
*((volatile uint64_t*)&DMABuffer[0]) = tablica[pixeld[pixel_cnt].g];
*((volatile uint64_t*)&DMABuffer[8]) = tablica[pixeld[pixel_cnt].r];
*((volatile uint64_t*)&DMABuffer[16]) = tablica[pixeld[pixel_cnt].b];Код: Выделить всё
memcpy(&DMABuffer[0], &tablica[pixeld[pixel_cnt].g], 8);
memcpy(&DMABuffer[8], &tablica[pixeld[pixel_cnt].r], 8);
memcpy(&DMABuffer[16], &tablica[pixeld[pixel_cnt].b], 8);И чем это обошлось?[/uquote]Болью. Больно смотреть на эти мучения.VladislavS писал(а):Как же дорого обходится не слушать советы бывалых.
У на уже есть преобразование HSV->RGB.VladislavS писал(а): Вот думаю, предложить или нет добавить преобразование HSV->RGB на лету?
Код: Выделить всё
volatile uint64_t* p = (uint64_t*)DMABuffer;
p[0] = tablica[pixeld[pixel_cnt].g];
p[1] = tablica[pixeld[pixel_cnt].r];
p[2] = tablica[pixeld[pixel_cnt].b];
Код: Выделить всё
static void rxtx_Handler(){
uint16_t epstatus = KEEP_DTOG(USB->EPnR[3]);
if(RX_FLAG(epstatus)){
rxNE = 1;
epstatus = (epstatus & ~(USB_EPnR_STAT_TX | USB_EPnR_CTR_RX)) ^ USB_EPnR_STAT_RX; // set valid RX, clear RX ctr
}else{
tx_succesfull = 1;
epstatus = (epstatus & ~(USB_EPnR_CTR_TX|USB_EPnR_STAT_TX|USB_EPnR_STAT_RX)); // clear TX ctr
}
USB->EPnR[3] = epstatus;
}Не совсем.GARMIN писал(а):А оно у вас точно правильное?
Так онлайн-конвертеры говорят и ваша программа.ARV писал(а):С чего вы взяли, что последние должны быть чисто красные?
Код: Выделить всё
mData mHSVfast(uint8_t h, uint8_t s, uint8_t v) {
// быстрый HSV
uint8_t r, g, b;
uint8_t value = ((24 * h / 17) / 60) % 6;
uint8_t vmin = (long)v - v * s / 255;
uint8_t a = (long)v * s / 255 * (h * 24 / 17 % 60) / 60;
uint8_t vinc = vmin + a;
uint8_t vdec = v - a;
switch (value) {
case 0: r = v; g = vinc; b = vmin; break;
case 1: r = vdec; g = v; b = vmin; break;
case 2: r = vmin; g = v; b = vinc; break;
case 3: r = vmin; g = vdec; b = v; break;
case 4: r = vinc; g = vmin; b = v; break;
case 5: r = v; g = vmin; b = vdec; break;
}
rgb_temp2.R = r;
rgb_temp2.G = g;
rgb_temp2.B = b;
return 0;
}
Код: Выделить всё
mData mHSV(uint8_t h, uint8_t s, uint8_t v) {
// обычный HSV
float r, g, b;
float H = h / 255.0;
float S = s / 255.0;
float V = v / 255.0;
int16_t i = (int16_t)(H * 6);
float f = H * 6 - i;
float p = V * (1 - S);
float q = V * (1 - f * S);
float t = V * (1 - (1 - f) * S);
switch (i % 6) {
case 0: r = V, g = t, b = p; break;
case 1: r = q, g = V, b = p; break;
case 2: r = p, g = V, b = t; break;
case 3: r = p, g = q, b = V; break;
case 4: r = t, g = p, b = V; break;
case 5: r = V, g = p, b = q; break;
}
r *= 255.0;
g *= 255.0;
b *= 255.0;
rgb_temp2.R = (uint8_t)r;
rgb_temp2.G = (uint8_t)g;
rgb_temp2.B = (uint8_t)b;
return 0;
}
Код: Выделить всё
void hsv_to_rgb(uint8_t h, uint8_t s, uint8_t v){
unsigned char region, remainder, p, q, t;
if (s == 0){
rgb_temp2.R = v;
rgb_temp2.G = v;
rgb_temp2.B = v;
return;
}
region = h / 43;
remainder = (h - (region * 43)) * 6;
p = (v * (256 - s)) >> 8;
q = (v * (256 - ((s * remainder) >> 8))) >> 8;
t = (v * (256 - ((s * (256L - remainder)) >> 8))) >> 8;
switch (region){
case 0:
rgb_temp2.R = v; rgb_temp2.G = t; rgb_temp2.B = p;
break;
case 1:
rgb_temp2.R = q; rgb_temp2.G = v; rgb_temp2.B = p;
break;
case 2:
rgb_temp2.R = p; rgb_temp2.G = v; rgb_temp2.B = t;
break;
case 3:
rgb_temp2.R = p; rgb_temp2.G = q; rgb_temp2.B = v;
break;
case 4:
rgb_temp2.R = t; rgb_temp2.G = p; rgb_temp2.B = v;
break;
default:
rgb_temp2.R = v; rgb_temp2.G = p; rgb_temp2.B = q;
break;
}
}
Точно, 255 это примерно 358 градусов.ARV писал(а):сравните в своей таблице последнюю строку с первой
Код: Выделить всё
// быстрый HSV
uint8_t r, g, b;
uint8_t value = ((24 * h / 17) / 60) % 6;Код: Выделить всё
h = h * uint32_t(65536 * (360.0f / 256) + 0.5f) >> 16;