1
0
Fork 0

[Core] Use polled waiting on ChibiOS platforms that support it (#17607)

* Use polled waiting on platforms that support it

Due to context switching overhead waiting a very short amount of time on
a sleeping thread is often not accurate and in fact not usable for timing
critical usage i.e. in a driver. Thus we use polled waiting for ranges
in the us range on platforms that support it instead. The fallback is
the thread sleeping mechanism.

This includes:

* ARM platforms with CYCCNT register (ARMv7, ARMv8) this is
  incremented at CPU clock frequency
* GD32VF103 RISC-V port with CSR_MCYCLE register this is incremented at
  CPU clock frequency
* RP2040 ARMv6 port which uses the integrated timer peripheral which is
  incremented with a fixed 1MHz frequency

* Use wait_us() instead of chSysPolledDelayX

...as it is powered by busy waiting now.

* Add chibios waiting methods test bench
This commit is contained in:
Stefan Kerkmann 2022-07-11 15:17:05 +02:00 committed by GitHub
parent 57021d6358
commit 3f5dc47296
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 126 additions and 31 deletions

View file

@ -15,14 +15,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include "hal.h"
#include "timer.h"
#include "wait.h"
#include "debug.h"
#include "matrix.h"
#include "quantum.h"
/*
* col: { B11, B10, B2, B1, A7, B0 }
@ -38,9 +31,13 @@ __attribute__((weak)) void matrix_init_user(void) {}
__attribute__((weak)) void matrix_scan_user(void) {}
__attribute__((weak)) void matrix_init_kb(void) { matrix_init_user(); }
__attribute__((weak)) void matrix_init_kb(void) {
matrix_init_user();
}
__attribute__((weak)) void matrix_scan_kb(void) { matrix_scan_user(); }
__attribute__((weak)) void matrix_scan_kb(void) {
matrix_scan_user();
}
void matrix_init(void) {
dprintf("matrix init\n");
@ -146,9 +143,13 @@ uint8_t matrix_scan(void) {
return 1;
}
bool matrix_is_on(uint8_t row, uint8_t col) { return (matrix[row] & (1 << col)); }
bool matrix_is_on(uint8_t row, uint8_t col) {
return (matrix[row] & (1 << col));
}
matrix_row_t matrix_get_row(uint8_t row) { return matrix[row]; }
matrix_row_t matrix_get_row(uint8_t row) {
return matrix[row];
}
void matrix_print(void) {
dprintf("\nr/c 01234567\n");