jcmvbkbc
New member
Я посмотрю, но не слишком скоро.Ещё не ясно вот это:
WRITE_PERI_REG(PERIPHS_GPIO_BASEADDR + GPIO_OUT_W1TS_ADDRESS, TEST_PIN_IO); // SET_PIN_IO (*((volatile uint32_t *)(0x60000300 + 0x04))) = (uint32_t)(0x00001000)
40100c3a: fcfa21 l32r a2, 40100024
40100c3d: fff831 l32r a3, 40100c20
40100c40: 0020c0 memw
40100c43: 0329 s32i.n a2, a3, 0
WRITE_PERI_REG(PERIPHS_GPIO_BASEADDR + GPIO_OUT_W1TC_ADDRESS, TEST_PIN_IO); //СLR_PIN_IO (*((volatile uint32_t *)(0x60000300 + 0x08))) = (uint32_t)(0x00001000)
40100c45: fff731 l32r a3, 40100c24
40100c48: 0020c0 memw
40100c4b: 0329 s32i.n a2, a3, 0
40100c4d: f00d ret.n
1) Почему не работает оптимизация у транслятора - два раза грузится адрес: 0x60000304 и 0x60000308. Можно было использовать смещение.
Как минимум memw, ненужный тут совсем. Лучше весь этот кусок переписать на ассемблере, например так:2) Время между SET_PIN_IO и СLR_PIN_IO равно 75ns при CLK у CPU 160MHz (осциллограмма дана выше). Не ясно кто дает задержку в 12 тактов CPU.
При 80MHz у CPU имеем строб 100.4ns.
asm volatile (
"s32i %0, %1, 4\n\t"
"s32i %0, %1, 8"
: : "r"(0x00001000), "r"(0x60000300) : "memory");
Получите 1 такт + задержку внешней шины.