
Originally Posted by
defragster
As noted seemed as if 'magic' must be involved ... for true understanding perhaps would have to look at the generated assembly to understand if there are chances for the 1062's dual execute to do all the manipulations of one in the same time it does the simple transfer of the other.
That's why the binary pin read 'data' was changed { Up & Down } and dumped - as it seemed like it wasn't possibly actually referencing the real pin data and doing those manipulations in that time.

Originally Posted by
jonr
You need to make some use of returned data so the compiler doesn't optimize it away. Then you will see that the use of assembly/bfi is faster.
Based on those suggestion I tried this code. I changed the data before each cycle and used the return value.
But still it is executing at the same speed.
I am not familiar with ARM architecture is it capable of doing that operation so fast.
Code:
#define IMXRT_GPIO6_DIRECT (*(volatile uint32_t *)0x42000000)
const uint16_t mask1 = 0xcfcf;// 1100 1111 1100 1111;
const uint16_t mask2 = 0x0030;// 0000 0000 0011 0000;
const uint16_t mask3 = 0x3000;// 0011 0000 0000 0000;
const int pins[16] = {19, 18, 14, 15, 1, 0, 17, 16, 22, 23, 20, 21, 24, 25, 26, 27}; //{27, 26, 25, 24, 21, 20, 23, 22, 16, 17, 0, 01, 15, 14, 18, 19};
int count = 0;
bool state = 0;
inline uint32_t read() {
uint32_t data = GPIO6_DR;
return ((data >> 16) & mask1) | ((data << 2) & mask2) | (data & mask3);
}
inline uint32_t test5()
{
register uint32_t data = IMXRT_GPIO6_DIRECT;
register uint32_t data2 = data >> 2;
register uint32_t data3 = data >> 12;
asm volatile("bfi %0, %1, 20, 2" : "+r"(data) : "r"(data2));
asm volatile("bfi %0, %1, 28, 2" : "+r"(data) : "r"(data3));
return (data >> 16);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
for (int i = 0; i < 16; i++)
pinMode(pins[i], INPUT_PULLDOWN);
pinMode(pins[count], INPUT_PULLUP);
delay(100);
}
void loop() {
uint32_t data, start, stop;
start = ARM_DWT_CYCCNT;
data = read(); //9 clocks
//data = test5(); //12 clocks
stop = ARM_DWT_CYCCNT;
Serial.print("Time : ");
Serial.print(stop - start);
Serial.print(" || data : ");
data |= 0x10000;
Serial.print(data , BIN);
Serial.print(" || Count :");
Serial.println(count++);
if (count > 15) {
count = 0;
state = !state;
}
if (!state)
pinMode(pins[count], INPUT_PULLUP);
else
pinMode(pins[count], INPUT_PULLDOWN);
delay(100);
}
Code:
Time : 9 || data : 11111111111111110 || Count :0
Time : 9 || data : 11111111111111100 || Count :1
Time : 9 || data : 11111111111111000 || Count :2
Time : 9 || data : 11111111111110000 || Count :3
Time : 9 || data : 11111111111100000 || Count :4
Time : 9 || data : 11111111111000000 || Count :5
Time : 9 || data : 11111111110000000 || Count :6
Time : 9 || data : 11111111100000000 || Count :7
Time : 9 || data : 11111111000000000 || Count :8
Time : 9 || data : 11111110000000000 || Count :9
Time : 9 || data : 11111100000000000 || Count :10
Time : 9 || data : 11111000000000000 || Count :11
Time : 9 || data : 11110000000000000 || Count :12
Time : 9 || data : 11100000000000000 || Count :13
Time : 9 || data : 11000000000000000 || Count :14
Time : 9 || data : 10000000000000000 || Count :15
Time : 9 || data : 10000000000000001 || Count :0
Time : 9 || data : 10000000000000011 || Count :1
Time : 9 || data : 10000000000000111 || Count :2
Time : 9 || data : 10000000000001111 || Count :3
Time : 9 || data : 10000000000011111 || Count :4
Time : 9 || data : 10000000000111111 || Count :5
Time : 9 || data : 10000000001111111 || Count :6
Time : 9 || data : 10000000011111111 || Count :7
Time : 9 || data : 10000000111111111 || Count :8
Time : 9 || data : 10000001111111111 || Count :9
Time : 9 || data : 10000011111111111 || Count :10
Time : 9 || data : 10000111111111111 || Count :11
Time : 9 || data : 10001111111111111 || Count :12
Time : 9 || data : 10011111111111111 || Count :13
Time : 9 || data : 10111111111111111 || Count :14
Time : 9 || data : 11111111111111111 || Count :15