9632360caa
* Add ARRAY_SIZE and CEILING utility macros * Apply a coccinelle patch to use ARRAY_SIZE * fix up some straggling items * Fix 'make test:secure' * Enhance ARRAY_SIZE macro to reject acting on pointers The previous definition would not produce a diagnostic for ``` int *p; size_t num_elem = ARRAY_SIZE(p) ``` but the new one will. * explicitly get definition of ARRAY_SIZE * Convert to ARRAY_SIZE when const is involved The following spatch finds additional instances where the array is const and the division is by the size of the type, not the size of the first element: ``` @ rule5a using "empty.iso" @ type T; const T[] E; @@ - (sizeof(E)/sizeof(T)) + ARRAY_SIZE(E) @ rule6a using "empty.iso" @ type T; const T[] E; @@ - sizeof(E)/sizeof(T) + ARRAY_SIZE(E) ``` * New instances of ARRAY_SIZE added since initial spatch run * Use `ARRAY_SIZE` in docs (found by grep) * Manually use ARRAY_SIZE hs_set is expected to be the same size as uint16_t, though it's made of two 8-bit integers * Just like char, sizeof(uint8_t) is guaranteed to be 1 This is at least true on any plausible system where qmk is actually used. Per my understanding it's universally true, assuming that uint8_t exists: https://stackoverflow.com/questions/48655310/can-i-assume-that-sizeofuint8-t-1 * Run qmk-format on core C files touched in this branch Co-authored-by: Stefan Kerkmann <karlk90@pm.me> |
||
---|---|---|
.. | ||
gpio_extr.h | ||
matrix.c | ||
readme.md |
Debug version matrix.c
This matrix.c is 0.13.19:quantum/matrix.c with the following additions:
- Added the MATRIX_DEBUG_SCAN_{START/END} macro to measure the execution time of matrix_scan().
- Added the MATRIX_DEBUG_DELAY_{START/END} macro to measure delay time.
- Added the MATRIX_MUL_SELECT handling for symmetric70_proto.
Current performance
MCU | delay type | execution time of matrix_scan() |
matrix scan rate |
---|---|---|---|
Pro Micro (16MHz) | default | 503us | 1810 scans/sec |
Pro Micro (16MHz) | adaptive | 383us | 2320 scans/sec |
Pro Micro (16MHz) | fast adaptive | 382us | 2330 scans/sec |
Proton C (72MHz) | default | 210us | 4350 scans/sec |
Proton C (72MHz) | adaptive | 76.4us | 10600 scans/sec |
Proton C (72MHz) | fast adaptive | 75.6us | 10800 scans/sec |
Compile
- Set MATRIX_IO_DELAY value
make MTEST=mdelay0 handwired/symmetric70_proto/promicro/normal:default:flash
make MTEST=mdelay=1 handwired/symmetric70_proto/promicro/normal:default:flash
make MTEST=mdelay=2 handwired/symmetric70_proto/promicro/normal:default:flash
make MTEST=mdelay=3 handwired/symmetric70_proto/promicro/normal:default:flash
make MTEST=mdelay=4 handwired/symmetric70_proto/promicro/normal:default:flash
make MTEST=mdelay=5 handwired/symmetric70_proto/promicro/normal:default:flash
make MTEST=mdelay=10 handwired/symmetric70_proto/promicro/normal:default:flash
make MTEST=mdelay=20 handwired/symmetric70_proto/promicro/normal:default:flash
make MTEST=mdelay=30 handwired/symmetric70_proto/promicro/normal:default:flash
- Measure the execution time of matrix_scan()
make MTEST=matrix_debug_scan[,<other options>..] handwired/symmetric70_proto/promicro/normal:default:flash
- Measure delay time.
make MTEST=matrix_debug_delay[,<other options>..] handwired/symmetric70_proto/promicro/normal:default:flash
- Change the behavior of delay
make MTEST=matrix_debug_delay,always_delay handwired/symmetric70_proto/promicro/normal:default:flash
make MTEST=matrix_debug_delay,adaptive_delay,mdelay0 handwired/symmetric70_proto/promicro/normal:default:flash
make MTEST=matrix_debug_delay,adaptive_delay_fast,mdelay0 handwired/symmetric70_proto/promicro/normal:default:flash
Measurement result
Pro Micro (ATmega32u4 16Mhz)
Default setting (show matrix_scan()
time)
make MTEST=matrix_debug_scan handwired/symmetric70_proto/promicro/normal:default:flash
- CH1: Row 0
- CH2: Row 1
- CH3: Row 4
- CH4: matrix_scan()
- Execution time of matrix_scan() 503us
- Frequency of matrix scan 1.81kHz (551.0us)
Always call matrix_output_unselect_delay()
(show matrix_scan()
time, default MATRIX_IO_DELAY)
make MTEST=matrix_debug_scan,always_delay handwired/symmetric70_proto/promicro/normal:default:flash
- CH1: Row 0
- CH2: Row 1
- CH3: Row 4
- CH4: matrix_scan()
- Execution time of matrix_scan() 521us
- Frequency of matrix scan 1.76kHz (568.5us)
Adaptive delay (show matrix_scan()
time, MATRIX_IO_DELAY = 0)
make MTEST=matrix_debug_scan,mdelay0,adaptive_delay handwired/symmetric70_proto/promicro/normal:default:flash
- CH1: Row 0
- CH2: Row 1
- CH3: Row 4
- CH4: matrix_scan()
- Execution time of matrix_scan() 383us
- Frequency of matrix scan 2.32kHz (431us)
Adaptive delay (show delay time, MATRIX_IO_DELAY = 0)
make MTEST=matrix_debug_delay,mdelay0,adaptive_delay handwired/symmetric70_proto/promicro/normal:default:flash
Press R0C1, R1C1 key
- CH1: Row 0
- CH2: Row 1
- CH3: Row 4
- CH4: delay time
- Delay time 68us
- Frequency of matrix scan 1.77kHz (565us)
Fast adaptive delay (show matrix_scan()
time, MATRIX_IO_DELAY = 0)
make MTEST=matrix_debug_scan,mdelay0,adaptive_delay_fast handwired/symmetric70_proto/promicro/normal:default:flash
- CH1: Row 0
- CH2: Row 1
- CH3: Row 4
- CH4: matrix_scan()
- Execution time of matrix_scan() 382us
- Frequency of matrix scan 2.33kHz (428us)
Fast adaptive delay (show delay time, MATRIX_IO_DELAY = 0)
make MTEST=matrix_debug_delay,mdelay0,adaptive_delay_fast handwired/symmetric70_proto/promicro/normal:default:flash
Press R0C1, R1C1 key
- CH1: Row 0
- CH2: Row 1
- CH3: Row 4
- CH4: delay time
- Delay time 11us
- Frequency of matrix scan 2.21kHz (452us)
Proton C (STM32F303 72MHz)
Default setting (show matrix_scan()
time)
make MTEST=matrix_debug_scan handwired/symmetric70_proto/proton_c/normal:default:flash
- CH1: Row 0
- CH2: Row 1
- CH3: Row 4
- CH4: matrix_scan()
- Execution time of matrix_scan() 210us
- Frequency of matrix scan 4.35kHz (230.0us)
Always call matrix_output_unselect_delay()
(show matrix_scan()
time, default MATRIX_IO_DELAY)
make MTEST=matrix_debug_scan,always_delay handwired/symmetric70_proto/proton_c/normal:default:flash
- CH1: Row 0
- CH2: Row 1
- CH3: Row 4
- CH4: matrix_scan()
- Execution time of matrix_scan() 242us
- Frequency of matrix scan 3.85kHz (260.0us)
Adaptive delay (show matrix_scan()
time, MATRIX_IO_DELAY = 0)
make MTEST=matrix_debug_scan,mdelay0,adaptive_delay handwired/symmetric70_proto/proton_c/normal:default:flash
- CH1: Row 0
- CH2: Row 1
- CH3: Row 4
- CH4: matrix_scan()
- Execution time of matrix_scan() 76.4us
- Frequency of matrix scan 10.6kHz (94.4us)
Adaptive delay (show delay time, MATRIX_IO_DELAY = 0)
make MTEST=matrix_debug_delay,mdelay0,adaptive_delay handwired/symmetric70_proto/proton_c/normal:default:flash
Press R0C1, R1C1 key
- CH1: Row 0
- CH2: Row 1
- CH3: Row 4
- CH4: delay time
- Delay time 7.6us
- Frequency of matrix scan 9.47kHz (105.6us)
Connect a 500pF capacitor between C2 line and GND, Press R0C2, R1C2, R2C2, R3C2, R4C2 keys
- CH1: Row 0
- CH2: Row 1
- CH3: Col 2
- CH4: delay time
- Delay time 12us + alpha
- Frequency of matrix scan 5.45kHz (183us)
- Threshold Voltage 1.9V
Connect a 1000pF capacitor between C2 line and GND, Press R0C2, R1C2, R2C2, R3C2, R4C2 keys
- CH1: Row 0
- CH2: Row 1
- CH3: Col 2
- CH4: delay time
- Delay time 20us + alpha
- Frequency of matrix scan 4.48kHz (223us)
- Threshold Voltage 1.9V
Fast adaptive delay (show matrix_scan()
time, MATRIX_IO_DELAY = 0)
make MTEST=matrix_debug_scan,mdelay0,adaptive_delay_fast handwired/symmetric70_proto/proton_c/normal:default:flash
- CH1: Row 0
- CH2: Row 1
- CH3: Row 4
- CH4: matrix_scan()
- Execution time of matrix_scan() 75.6us
- Frequency of matrix scan 10.8kHz (92.2us)
Fast adaptive delay (show delay time, MATRIX_IO_DELAY = 0)
make MTEST=matrix_debug_delay,mdelay0,adaptive_delay_fast handwired/symmetric70_proto/proton_c/normal:default:flash
Press R0C1, R1C1 key
- CH1: Row 0
- CH2: Row 1
- CH3: Row 4
- CH4: delay time
- Delay time 1.6us
- Frequency of matrix scan 10.6kHz (94.4us)
Connect a 500pF capacitor between C2 line and GND, Press R0C2, R1C2, R2C2, R3C2, R4C2 keys
- CH1: Row 0
- CH2: Row 1
- CH3: Col 2
- CH4: delay time
- Delay time 13.2us
- Frequency of matrix scan 6.58kHz (152.6us)
- Threshold Voltage 1.9V