typedef struct packet_t{
uint8_t a; // sizeof(uint8_t) returns 1
uint8_t b; // sizeof(uint8_t) returns 1
float c; // sizeof(float) returns 4
};
sizeof(packet_t) //returns 8
typedef struct __attribute((__packed__)) packet_t{
uint8_t a;
uint8_t b;
float c;
};
Будет исключение.Поддерживается ли в ESP32 работа с невыровенными адресами или будет исключение ?
Думаю, что нет.Про замедление и плохой стиль я знаю.
На ESP32 исключения не возникает.Будет исключение.
В IRAM, (кеш) Flash, registers - всегда должно быть выровнено и желательно чтение/запись по 32 бита.
void unaligned_access_test(void) {
static char buffer[61];
unsigned int index, data;
volatile char *ptr1;
// fill buffer
for (index=0; index < sizeof(buffer); index++)
buffer[index]=index;
// check buffer alignment
ptr1=&buffer[0];
printf("&buffer[0]=0x%x\n", (unsigned int)ptr1);
if (((unsigned int)ptr1 & 3) !=0) {
printf("unaligned!\n");
data = (unsigned int)ptr1;
data|=3;
data+=1; // 4-byte aligned address
ptr1=(volatile char *)data;
printf("new: 0x%x\n", (unsigned int)ptr1);
}
// unaligned access test
for (index=0; index<4; index++) {
printf("[0x%x] : 0x%04x\n", (unsigned int)ptr1, *(unsigned int*)ptr1);
ptr1++;
}
}
&buffer[0]=0x3ffb2eb4
[0x3ffb2eb4] : 0x3020100
[0x3ffb2eb5] : 0x4030201
[0x3ffb2eb6] : 0x5040302
[0x3ffb2eb7] : 0x6050403
extern unsigned int g_ticks_per_us_pro;
void unaligned_access_test(void) {
static char buffer[61];
unsigned int index, data, ccount_now, ccount_prv;
volatile char *ptr1;
printf("ticks per us = %u\n", g_ticks_per_us_pro);
// fill buffer
for (index=0; index < sizeof(buffer); index++)
buffer[index]=index;
// check buffer alignment
ptr1=&buffer[0];
printf("&buffer[0]=0x%x\n", (unsigned int)ptr1);
if (((unsigned int)ptr1 & 3) !=0) {
printf("unaligned!\n");
data = (unsigned int)ptr1;
data|=3;
data+=1; // 4-byte aligned address
ptr1=(volatile char *)data;
printf("new: 0x%x\n", (unsigned int)ptr1);
}
// unaligned access test
for (index=0; index<4; index++) {
//ccount_prv = xthal_get_ccount();
__asm__ __volatile__("rsr %0,ccount":"=a" (ccount_prv));
data=*(volatile unsigned int*)ptr1;
//ccount_now = xthal_get_ccount();
__asm__ __volatile__("rsr %0,ccount":"=a" (ccount_now));
printf("[0x%x] : 0x%04x cycles : %d\n",
(unsigned int)ptr1, data,
(ccount_now < ccount_prv)? ccount_prv-ccount_now : ccount_now- ccount_prv);
ptr1++;
}
}
ticks per us = 240
&buffer[0]=0x3ffb2eb4
[0x3ffb2eb4] : 0x3020100 cycles : 3
[0x3ffb2eb5] : 0x4030201 cycles : 10
[0x3ffb2eb6] : 0x5040302 cycles : 10
[0x3ffb2eb7] : 0x6050403 cycles : 10
То в простой SRAM. А в других областях "В IRAM, (кеш) Flash, registers"?На ESP32 исключения не возникает.
При невыровненном чтении данных из области Instruction External Flash (0x400C2000-0x40BFFFFF) возникает исключение LoadStoreAlignment и далее ребут. Выровненное чтение из этой области работает.То в простой SRAM. А в других областях "В IRAM, (кеш) Flash, registers"?
ticks per us = 240
&buffer[0]=0x3f402e9e
unaligned!
new: 0x3f402ea0
[0x3f402ea0] : 0x5040302 cycles : 287
[0x3f402ea1] : 0x6050403 cycles : 12
[0x3f402ea2] : 0x7060504 cycles : 12
[0x3f402ea3] : 0x8070605 cycles : 12
ticks per us = 240
&buffer[0]=0x3f402e9e
unaligned!
new: 0x3f402ea0
[0x3f402ea0] : 0x5040302 cycles : 4
[0x3f402ea1] : 0x6050403 cycles : 12
[0x3f402ea2] : 0x7060504 cycles : 12
[0x3f402ea3] : 0x8070605 cycles : 12
Это на одно считывание?287 циклов - подгрузка кэш.
В мануале не нашел. На форуме пишут "Cache lines are 32 bytes".Это на одно считывание?
Какая длина блока чтения у "кеш" из SPI-Flash? 16-ть байт или ?
240MHz/287 = 830 кГц 2хCPU
32 байта QSPI -> 64 такта SPI шины + заголовок с адресом (5 байт = 10 тактов + до пары тактов на старте).В мануале не нашел. На форуме пишут "Cache lines are 32 bytes".
В теории должно быть
40MHz / (32+5) = 1.08 МHz или 0.925us на промах кэш.
Если оно работает из SRAM (IRAM) - то работает как и работало.Интересно что происходит с работой второго ядра во время загрузки кэша ?
Скажем второе ядро исполняет критичный по времени код только из IRAM и в это время первое ядро подгружает кэш.
"предвыборки" нет и док-во в лишней команде "memw" и "extw".Шина как я понимаю одна и как пишут на форуме блоков предвыборки в процессорах нет