вот тепереча я вообще ничего не понимаю...
сделал я проект, Микроблайз+таймер+уарт+все считалки какие есть. Все это на 100 МГц
написал программку вида
CODE
float A = 1.12;
float B = 1.234;
float C = 123.2314;
float D = 1234.23241;
float E = 23.134;
float dt = 0.01;
float t = 0;
int i = 0;
float result = 0;
float array[10];
float arr_t[10];
u32 StartArr[10];
u32 StopArr[10];
u32 StartTime2 = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));
u32 StartTime = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));
for(i =0;i<10;i++)
{
StartArr[i] = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));
result = A;
result *= t;
result += B;
result *= t;
result += C;
result *= t;
result += D;
result *= t;
result += E;
array[i] = result;
arr_t[i] = t;
t+= dt;
StopArr[i] = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));
}
u32 StopTime = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));
u32 StopTime2 = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));
xil_printf("\r\nStart %d(%d), Stop %d(%d), Delta %d", StartTime, StartTime2, StopTime, StopTime2, (StopTime-StartTime));
for(i =0;i<10;i++)
xil_printf("\r\n%d: (%d <=> %d), Start %d, Stop %d, Delta %d",i , ((int)(arr_t[i]*1000)), ((int)(array[i]*1000)), StartArr[i], StopArr[i], (StopArr[i]-StartArr[i]));
и она мне говорит
Start 77(69), Stop 333(344), Delta 256
0: (0 <=> 23134), Start 85, Stop 97, Delta 12
1: (10 <=> 35488), Start 110, Stop 122, Delta 12
2: (20 <=> 47867), Start 135, Stop 147, Delta 12
3: (30 <=> 60271), Start 159, Stop 171, Delta 12
4: (40 <=> 72700), Start 191, Stop 204, Delta 13
5: (49 <=> 85153), Start 217, Stop 228, Delta 11
6: (59 <=> 97631), Start 239, Stop 250, Delta 11
7: (69 <=> 110134), Start 261, Stop 272, Delta 11
8: (79 <=> 122661), Start 285, Stop 297, Delta 12
9: (89 <=> 135214), Start 309, Stop 321, Delta 12
внимание вопрос.
почему при первом опросе таймера 2 соседние строчки отличались на 8 тактов.
Код
u32 StartTime2 = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));
u32 StartTime = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));
результат
Start 77(69)
а в конце они же
Код
u32 StopTime = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));
u32 StopTime2 = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));
дали уже 11 тактов
Результат
Stop 333(344)
Дальше поглядел я код в дизасемблере, напрягает отсутствие команд умножения, как то он их соптимизил, но как я не понимаю... и как его попросить это не делать (выключить оптимизатор не вариант). Или это принцип работы хардварного умножителя, он просто в какие то регистры записывает данные и получает ответ?
то есть 12 тактов это реальность? Да еще вопрос, почему число тактов плавает
11 - 12 - 13?
дальше добавил вот такой код
CODE
for(;;)
{
St1 = *((volatile u32 *)0x41C00008);
St2 = *((volatile u32 *)0x41C00018);
result = A;
result *= t;
result += B;
result *= t;
result += C;
result *= t;
result += D;
result *= t;
result += E;
result_t = t;
t+= dt;
En1 = *((volatile u32 *)0x41C00008);
En2 = *((volatile u32 *)0x41C00018);
xil_printf("\r\n(%d <=> %d), Start %d (%d), Stop %d(%d), Delta %d(%d)",((int)(result_t*1000)), ((int)(result*1000)), St1, St2, En1, En2, (En1-St1), (En2-St2));
}
и вот тут вообще странно, результат
(0 <=> 23134), Start 4665603 (4665555), Stop 4665619(4665577), Delta 16(22)
(5 <=> 29308), Start 5330851 (5330803), Stop 5330867(5330825), Delta 16(22)
(10 <=> 35488), Start 5996133 (5996085), Stop 5996149(5996107), Delta 16(22)
(15 <=> 41675), Start 6670053 (6670005), Stop 6670069(6670027), Delta 16(22)
(20 <=> 47867), Start 7343973 (7343925), Stop 7343989(7343947), Delta 16(22)
(24 <=> 54066), Start 8017896 (8017848), Stop 8017912(8017870), Delta 16(22)
(29 <=> 60271), Start 8691809 (8691761), Stop 8691825(8691783), Delta 16(22)
(34 <=> 66483), Start 9365733 (9365685), Stop 9365749(9365707), Delta 16(22)
0x41C00008 - это адрес таймераа + смещение на 8, то есть регистр счетчика вроде как...
почему блин между первыми таймерами разница 16, а между вторыми 22?
на шине только таймер да уарт, делить они вроде шину не должны или должны?
Вообщем кто может объяснить результат, и рассказать про оптимизацию, куда умножения то делись?