| .. SPDX-License-Identifier: GPL-2.0+ |
| |
| Cyclic functions |
| ================ |
| |
| The cyclic function execution infrastruture provides a way to periodically |
| execute code, e.g. every 100ms. Examples for such functions might be LED |
| blinking etc. The functions that are hooked into this cyclic list should |
| be small timewise as otherwise the execution of the other code that relies |
| on a high frequent polling (e.g. UART rx char ready check) might be |
| delayed too much. To detect cyclic functions with a too long execution |
| time, the Kconfig option `CONFIG_CYCLIC_MAX_CPU_TIME_US` is introduced, |
| which configures the max allowed time for such a cyclic function. If it's |
| execution time exceeds this time, this cyclic function will get removed |
| from the cyclic list. |
| |
| Registering a cyclic function |
| ----------------------------- |
| |
| To register a cyclic function, use something like this:: |
| |
| static void cyclic_demo(void *ctx) |
| { |
| /* Just a small dummy delay here */ |
| udelay(10); |
| } |
| |
| int board_init(void) |
| { |
| struct cyclic_info *cyclic; |
| |
| /* Register demo cyclic function */ |
| cyclic = cyclic_register(cyclic_demo, 10 * 1000, "cyclic_demo", NULL); |
| if (!cyclic) |
| printf("Registering of cyclic_demo failed\n"); |
| |
| return 0; |
| } |
| |
| This will register the function `cyclic_demo()` to be periodically |
| executed all 10ms. |
| |
| How is this cyclic functionality integrated / executed? |
| -------------------------------------------------------- |
| |
| The cyclic infrastructure integrates the main function responsible for |
| calling all registered cyclic functions cyclic_run() into the common |
| WATCHDOG_RESET macro. This guarantees that cyclic_run() is executed |
| very often, which is necessary for the cyclic functions to get scheduled |
| and executed at their configured periods. |