From 4352c77c67ed66e54334972419fca1ace0cdacff Mon Sep 17 00:00:00 2001 From: Jean Alinei Date: Wed, 25 Jun 2025 15:56:42 +0200 Subject: [PATCH] docs: fix typos and ensure mkdocs syntax --- docs/environment_setup.md | 6 +++--- docs/first_example.md | 14 +++++++------- docs/powerAPI.md | 2 +- docs/shield_introduction.md | 6 +++--- docs/spin_dac.md | 4 ++-- docs/spin_dataAPI.md | 16 ++++++++-------- docs/spin_gpio.md | 2 +- docs/spin_pwm.md | 24 ++++++++++++------------ docs/task_introduction.md | 14 +++++++------- 9 files changed, 44 insertions(+), 44 deletions(-) diff --git a/docs/environment_setup.md b/docs/environment_setup.md index 2a98545c..dfd40c5f 100644 --- a/docs/environment_setup.md +++ b/docs/environment_setup.md @@ -7,7 +7,7 @@ It will use a “Blinky” (blinking LED) example which requires no other hardwa Before we start, make sure your machine meets all the requirements below. -!!! tips "Required software" +!!! tip "Required software" === "Windows" - **Git:** If you do not have git installed, get it here [git for Windows](https://gitforwindows.org) - **Python3:** If you do not have python3 installed, get it here [Python3 Installers](https://www.python.org/downloads/windows) @@ -109,7 +109,7 @@ to open PlatformIO in the Primary Side Bar. It should contain: ### Step 5 - Clone our Core repository -In PlatformIO's “Quick Access” view, select the “Miscelleanous / Clone Git Project” action. +In PlatformIO's “Quick Access” view, select the “Miscellaneous / Clone Git Project” action. This will open a field in which you should enter the following Git repository address: ``` @@ -238,7 +238,7 @@ Check the list below of possible issues - **Python3:** If you do not have python3 installed, get it here [Python3 Installers](https://www.python.org/downloads/windows) - **CMake:** If you do not have CMake installed, get it here [CMake Installer](https://cmake.org/download/) - Make sure that you have **administrator privileges** on the folder where you clone your repository. - - Check that you are working on a **path that is not liked to OneDrive** + - Check that you are working on a **path that is not linked to OneDrive** - Check that you **do not have any spaces in the path** of your project - Check that the **length of your project** path is smaller than 256 characters. - You should preferably have your project folder as close as possible to the root diff --git a/docs/first_example.md b/docs/first_example.md index 137470ca..5f2b46de 100644 --- a/docs/first_example.md +++ b/docs/first_example.md @@ -4,7 +4,7 @@ In this section we will show you how to use our example interface. ## Requirements -Before you start, please make sure you fullfil the requirements below. +Before you start, please make sure you fulfill the requirements below. !!! note "Requirements" - Have your [VSCode Environment](environment_setup.md#setup-your-work-environment) already setup @@ -53,7 +53,7 @@ Here are the steps to use it. There are multiple folders on the **USB tasks**. - - From **General to Msciellaneous** are tasks by default that we don not use + - From **General to Miscellaneous** are tasks by default that we do not use - OwnTech: are tasks that can be used for more advanced users. - Examples TWIST: are the examples dedicated to the TWIST board which we will see later. - **Examples SPIN:** groups all the examples related to the SPIN board. @@ -74,7 +74,7 @@ Here are the steps to use it. - Setting PWM phase shift: An example for shifting two PWM signals - DAC signal: An example for generating an analog signal from digital data - Software triggered ADC: An example to activate - - HRTIM triggered ADC: An example to active an ADC measuremente using a hardware trigger + - HRTIM triggered ADC: An example to activate an ADC measurement using a hardware trigger - Incremental encoder: An example on how to interface an incremental encoder to the SPIN board @@ -129,7 +129,7 @@ If the build is successful, connect your SPIN board and click on the flash icon. Once the upload is completed, the LED will stop blinking. - You can connect to the serial port by cliking on its icon. (1) + You can connect to the serial port by clicking on its icon. (1) {.annotate} 1. The serial icon looks like this: ![serial icon](images/icon-serial.png) @@ -141,9 +141,9 @@ If the build is successful, connect your SPIN board and click on the flash icon. If you click on the terminal and push the `d` key on your keyboard, the value will go `DOWN` and decrease to `0.250000`. -If you push the `u` key on your key board, the value will go `UP` and increase back to `0.300000`. +If you push the `u` key on your keyboard, the value will go `UP` and increase back to `0.300000`. -Congratulations! you have uploaded your fist example. Do not hesitate to explore more examples either via our interface or our [repository](https://github.com/owntech-foundation/examples). +Congratulations! you have uploaded your first example. Do not hesitate to explore more examples either via our interface or our [repository](https://github.com/owntech-foundation/examples). ??? success "List of contributors" Here is a short list of contributors to this page: @@ -164,4 +164,4 @@ Congratulations! you have uploaded your fist example. Do not hesitate to explore *[ADC]: Analog-to-Digital Converter *[DAC]: Digital-to-Analog Converter *[PWM]: Pulse Width Modulation -*[HRTIM]: High-Resolution Timer \ No newline at end of file +*[HRTIM]: High-Resolution Timer diff --git a/docs/powerAPI.md b/docs/powerAPI.md index 32f4ff93..c59403d8 100644 --- a/docs/powerAPI.md +++ b/docs/powerAPI.md @@ -76,4 +76,4 @@ [:octicons-arrow-right-24: Analog communication API](https://owntech-foundation.github.io/Documentation/powerAPI/classAnalogCommunication/) - \ No newline at end of file + diff --git a/docs/shield_introduction.md b/docs/shield_introduction.md index e4d4e801..581cc359 100644 --- a/docs/shield_introduction.md +++ b/docs/shield_introduction.md @@ -13,7 +13,7 @@ To work with Shield API, include the following file in your code: ![TWIST schema](images/TWIST_illustration.svg){ width=200 align=left } - **Versatile Control Modes**: The API supports both voltage and peak current control modes, allowing you to choose the best option for your specific application. - **Independent Leg Operation**: Each of the two legs can operate independently with different topologies, such as boost or buck, offering greater flexibility in power management. - - **Configure different paramaters** for power electronics (dead time, phase shift) + - **Configure different parameters** for power electronics (dead time, phase shift) - **Simplified ADC value retrieval** - Refer to [TWIST hardware specifications](https://github.com/owntech-foundation/TWIST) for more detail on TWIST board. @@ -58,7 +58,7 @@ To work with Shield API, include the following file in your code: 4\. Set the phase shift in degree [`shield.power.setPhaseShift(ALL, ps_degree)`](https://owntech-foundation.github.io/Documentation/1.0.0/powerAPI/classPowerAPI/#function-setphaseshift) - 5\. Enable the ADC acquisition for twist to get voltage and current measures [`shield.sensors.enableDefaultTwistSensors()`]#function-enabledefaulttwistsensors) + 5\. Enable the ADC acquisition for twist to get voltage and current measures [`shield.sensors.enableDefaultTwistSensors()`](#function-enabledefaulttwistsensors) 6\. Set the slope compensation to control the output current[`shield.power.setSlopeCompensation(ALL, 1.4, 1.0)`](https://owntech-foundation.github.io/Documentation/1.0.0/powerAPI/classPowerAPI/#function-setslopecompensation) 7\. Then start the converters [`shield.power.start(ALL)`](https://owntech-foundation.github.io/Documentation/1.0.0/powerAPI/classPowerAPI/#function-start) @@ -165,7 +165,7 @@ On the TWIST board, a voltage value of 1.024V on the ADC corresponds to a curren shield.power.start(ALL); ``` -#### 2 independant leg operations +#### 2 independent leg operations === " Connection " diff --git a/docs/spin_dac.md b/docs/spin_dac.md index 1cfb81dc..acaea0a0 100644 --- a/docs/spin_dac.md +++ b/docs/spin_dac.md @@ -26,10 +26,10 @@ Generate a 1.024V signal. ![dac value](images/dac_value.svg) !!! example - For a pratical example of the DAC see the example : + For a practical example of the DAC see the example : - [Signal generation](https://owntech-foundation.github.io/Documentation/examples/SPIN/DAC/signal_generation/) ## API Reference ::: doxy.powerAPI.class -name: DacHAL \ No newline at end of file +name: DacHAL diff --git a/docs/spin_dataAPI.md b/docs/spin_dataAPI.md index f89e56ac..3d9ffe64 100644 --- a/docs/spin_dataAPI.md +++ b/docs/spin_dataAPI.md @@ -55,10 +55,10 @@ At the end of all the hardware configuration (including other modules), the Data After the Data API has been started, it becomes possible to get data obtained from the enabled pins. Depending on the trigger source (see [detailed section below](#triggering-the-acquisition)), you'll have to trigger the acquisition then read the value, or directly read the value. -If software-trigged is used for an ADC (default configuration), the acquisition must first be triggered, then the value read. If the acquisition is configured to be periodic for ann ADC, directly read the value. +If software-triggered is used for an ADC (default configuration), the acquisition must first be triggered, then the value read. If the acquisition is configured to be periodic for an ADC, directly read the value. !!! note - === "Sofware-triggered acquisition" + === "Software-triggered acquisition" ``` spin.data.triggerAcquisition(ADC_2); // Trigger acquisitions of all pins linked to ADC 2 spin.data.getLatestValue(35); // Get value read on pin 35 @@ -131,7 +131,7 @@ These function act similarly, except for the conversion part: they are called wi Each ADC unit can measure multiple analog signal. This works by defining an acquisition sequence. !!! tip - By default the aquisition sequence is in continuous mode. It means than one trigger will trigger all the sequence of acquisition. + By default the acquisition sequence is in continuous mode. It means that one trigger will start the entire acquisition sequence. This can be changed using [Discontinuous Mode](#continuous-discontinuous-sequence) !!! example @@ -188,7 +188,7 @@ The data acquisition can be triggered by two sources: ```C++ spin.data.configureTriggerSource(ADC_2, TRIG_SOFTWARE); // ADC 2 configured in software mode - sing.data.triggerAcquisition(ADC_2); // Send an adc trigger to ADC2 to start conversion + spin.data.triggerAcquisition(ADC_2); // Send an ADC trigger to ADC2 to start conversion adc_value = data.getLatest(35); // Get the acquired data ``` @@ -206,7 +206,7 @@ Sometimes measurement have to be taken at a specific time, in interaction with t This kind of acquisition have a side benefit. It operates in the background and does not interfer with software. It means that periodical sampling will not interrupt code execution. -The trigger is the PWM peripheral, the ADC performs the conversion and place the result in an output buffer, the output buffer is directly placed in memory by a DMA. A rather complex software mechanics execute periodically and serve each measurement in a dedicated memory space. The periodical routine is executed at the beggining of the controlTask. +The trigger is the PWM peripheral: the ADC performs the conversion and places the result in an output buffer, which is directly stored in memory by a DMA. A rather complex software mechanism executes periodically and serves each measurement in a dedicated memory space. The periodical routine is executed at the beginning of the controlTask. !!! info Synchronous measurement require having a controlTask running. @@ -342,7 +342,7 @@ Trigger timing can be defined or changed dynamically. spin.pwm.setAdcTriggerPostScaler(PWMA, 4); ``` -=== "Without interuptions" +=== "Without interruptions" ![left_aligned_continuous_sampling](images/left_aligned_continuous_sampling.svg){ width=800 } ```c++ @@ -361,7 +361,7 @@ When using the control task (critical task) data are dispatched at the start, wh ![data dispatch](images/data_dispatch.svg) -Data dispatching is an internal mechanism of Data API, that transfers Data from the internal buffers controlled by the DMA to user-level buffers that can be retreived by the ``get***()`` functions. If dispatching is not done, the user will not be able to retrive values, and the ``get***()`` functions will return no value. +Data dispatching is an internal mechanism of Data API that transfers data from the internal buffers controlled by the DMA to user-level buffers that can be retrieved by the ``get***()`` functions. If dispatching is not done, the user will not be able to retrieve values, and the ``get***()`` functions will return no value. The dispatch is done automatically and the in most cases, the user does not have to worry about it. However, in some cases, the user may want to know when this is done. @@ -389,7 +389,7 @@ If you want specific ADC behavior (trigger sources, discontinuous mode, etc.), y After channels have been enabled, the conversion parameters can be set so that raw values can be automatically converted to the relevant unit. This is done using the `spin.data.setParameters()` function. -After channels have been enabled (and optionnally conversion parameters have been set), there are two ways of starting the API, depending on your use of other OwnTech APIs. If your code uses an [uninterruptible task](task_introduction.md), nothing more is required, the Data API will be started automatically when task is started. However, if you do not have an uninterruptible task in your code, you need to manually start the API by calling `spin.data.start()`. +After channels have been enabled (and optionally conversion parameters have been set), there are two ways of starting the API, depending on your use of other OwnTech APIs. If your code uses an [uninterruptible task](task_introduction.md), nothing more is required; the Data API will be started automatically when the task is started. However, if you do not have an uninterruptible task in your code, you need to manually start the API by calling `spin.data.start()`. !!! Note diff --git a/docs/spin_gpio.md b/docs/spin_gpio.md index 219428d4..1f44de84 100644 --- a/docs/spin_gpio.md +++ b/docs/spin_gpio.md @@ -38,4 +38,4 @@ ## API Reference ::: doxy.powerAPI.class -name: GpioHAL \ No newline at end of file +name: GpioHAL diff --git a/docs/spin_pwm.md b/docs/spin_pwm.md index 46964422..80212413 100644 --- a/docs/spin_pwm.md +++ b/docs/spin_pwm.md @@ -10,15 +10,15 @@ ![HRTIM pin](images/SPIN_1.1.0_main_hrtim.svg){ align=left } - Up to 5 pairs of PWMs possible (PWMA, PWC, PWMD, PWME, PWMF) - - Each PWM unit has a miminum resolution of 184ps. + - Each PWM unit has a minimum resolution of 184ps. !!! note The resolution of a PWM signal defines the maximum number of steps that can be present in a single PWM period. In other words, it determines how finely you can adjust the pulse width of the signal. A higher resolution means you can make smaller and more precise adjustments to the pulse width. - - Frequencies in the range of 650Hz to 1Ghz theorically possible. Tests were made from 2kHz up to 10MHz. + - Frequencies in the range of 650Hz to 1Ghz theoretically possible. Tests were made from 2kHz up to 10MHz. !!! warning Only 200Khz was tested with TWIST - Two different modulation mode possible : left aligned, and center aligned - - Two ADC linkable to two differents PWM unit for precise measurement instant + - Two ADC linkable to two different PWM units for precise measurement instants - Compatible for peak current control with the internal analog comparator - Positive and negative dead time set via software - Phase shift possible for interleaved operations @@ -39,15 +39,15 @@ === "Software triggered" 1\. Set the modulation type : [`spin.pwm.setModulation(PWMx, lft_aligned/upDwn)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-setmodulation) - 2. Set wich output (1 or 2) will be controlled by the duty cycle, the other will be complementary [`spin.pwm.setSwitchConvention(PWMx, PWMx1/PWMx2)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-setswitchconvention) + 2. Set which output (1 or 2) will be controlled by the duty cycle, the other will be complementary [`spin.pwm.setSwitchConvention(PWMx, PWMx1/PWMx2)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-setswitchconvention) 3. Set if the pwm is designed to be duty-cycle driven (voltage mode) or current driven (current mode) [`spin.pwm.setMode(PWMx, voltageMode/currentMode)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-setmode) 4. Initialize the pwm unit : [`spin.pwm.initUnit(PWMx)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-initunit) === "Hardware triggered" 1\. Set the modulation type : [`spin.pwm.setModulation(PWMx, lft_aligned/upDwn)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-setmodulation) - 2. Set ow which edge (up/down) to trigger adc conversion [`spin.pwm.setAdcEdgeTrigger(PWMx, edgeTrigUp/edgeTrigDwn)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-setadcedgetrigger) + 2. Set on which edge (up/down) to trigger ADC conversion [`spin.pwm.setAdcEdgeTrigger(PWMx, edgeTrigUp/edgeTrigDwn)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-setadcedgetrigger) 3. Set the division of the number of trigger in a fixed period [`spin.pwm.setAdcDecimation(PWMx, DecimValue)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-setadcdecimation) - 4. Set wich output (1 or 2) will be constrolled by the duty cycle, the other will be complementary [`spin.pwm.setSwitchConvention(PWMx, PWMx1/PWMx2)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-setswitchconvention) + 4. Set which output (1 or 2) will be controlled by the duty cycle, the other will be complementary [`spin.pwm.setSwitchConvention(PWMx, PWMx1/PWMx2)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-setswitchconvention) 5. Set if the pwm is designed to be duty-cycle driven (voltage mode) or current driven (current mode) [`spin.pwm.setMode(PWMx, voltageMode/currentMode)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-setmode) 6. Initialize the pwm unit : [`spin.pwm.initUnit(PWMx)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-initunit) @@ -57,15 +57,15 @@ === "Software triggered" 1. Set the rising/falling dead time. Can be changed before/after init : [`spin.pwm.setDeadTime(PWMx, rise, fall)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-setdeadtime) 2. Set an initial value for the duty cycle [`spin.pwm.setDutyCycle(0.5)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-setdutycycle) - 3. Start the PWM, either start both outout or just one [`spin.pwm.startDualOutput(PWMx)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-startdualoutput) / [`spin.pwm.startSingleOutput(PWMx, PWMx1/PWMx2)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-startsingleoutput) + 3. Start the PWM, either start both output or just one [`spin.pwm.startDualOutput(PWMx)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-startdualoutput) / [`spin.pwm.startSingleOutput(PWMx, PWMx1/PWMx2)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-startsingleoutput) 4. if ADC hardware triggered : [follow ADC init sequence](spin_dataAPI.md/#initialization-sequence) === "Hardware triggered" 1. Set the rising/falling dead time. Can be changed before/after init : [`spin.pwm.setDeadTime(PWMx, rise, fall)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-setdeadtime) - 2. Set wich ADC trigger to link to PWM unit [`spin.pwm.setAdcTrigger(PWMx, ADCtrig)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-setadcedgetrigger) + 2. Set which ADC trigger to link to the PWM unit [`spin.pwm.setAdcTrigger(PWMx, ADCtrig)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-setadcedgetrigger) 3. Enable the adc trigger [`spin.pwm.enableAdcTrigger`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-enableadctrigger) 4. Set an initial value for the duty cycle [`spin.pwm.setDutyCycle(0.5)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-setdutycycle) - 5. Start the PWM, either start both outout or just one [`spin.pwm.startDualOutput(PWMx)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-startdualoutput) / [`spin.pwm.startSingleOutput(PWMx, PWMx1/PWMx2)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-startsingleoutput) + 5. Start the PWM, either start both output or just one [`spin.pwm.startDualOutput(PWMx)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-startdualoutput) / [`spin.pwm.startSingleOutput(PWMx, PWMx1/PWMx2)`](https://owntech-foundation.github.io/Documentation/powerAPI/classPwmHAL/#function-startsingleoutput) 6. if ADC hardware triggered : [follow ADC init sequence](spin_dataAPI.md/#initialization-sequence) !!! example @@ -118,7 +118,7 @@ The duty cycle is a constant value compared to the carrier. ![Duty cycle](images/changing_duty_cycle.gif) -When the carrier is superior to the duty cycle, the logic output is at high level. On the contrary, when the carrier is inferior to the duty cycle the the output logic is low level. A PWM signal is thus a sqarewave signal with a frequency (the **switching frequency**) being fixed by the carrier. +When the carrier is superior to the duty cycle, the logic output is at high level. On the contrary, when the carrier is inferior to the duty cycle the output logic is low level. A PWM signal is thus a square wave signal with a frequency (the **switching frequency**) fixed by the carrier. Varying the duty cycle is how to vary the output of the PWM. @@ -238,14 +238,14 @@ Varying the duty cycle is how to vary the output of the PWM. spin.pwm.setDeadtime(PWMA, 400, 400); ``` -=== "Asymetric Dead Time leading edge" +=== "Asymmetric Dead Time leading edge" ![dead_time_asymetric_0208](images/dead_time_asymetric_0208.svg){ width=800 } ```c++ spin.pwm.setDeadtime(PWMA, 100, 400); ``` -=== "Asymetric Dead Time trailing edge" +=== "Asymmetric Dead Time trailing edge" ![dead_time_asymetric_0802](images/dead_time_asymetric_0802.svg){ width=800 } ```c++ diff --git a/docs/task_introduction.md b/docs/task_introduction.md index 0c3c0dec..b1849cb1 100644 --- a/docs/task_introduction.md +++ b/docs/task_introduction.md @@ -21,7 +21,7 @@ Having a periodical code execution is key to real time applications. It is easy The control task is synchronous, it means that it is called at fixed period. So we need some kind of timer calling the control, this timer is considered as the **source**. There are two sources : - The PWM carrier -- An independant timer +- An independent timer #### The PWM carrier @@ -29,7 +29,7 @@ The carrier has a period called the **switching period**, we can use it to call ![PWM control task](images/pwm_source_task.svg) -On the figure above, the switching period is 5µs (200Khz) and we call the control every 10 switching cycle so 50µs (20Khz). +On the figure above, the switching period is 5µs (200kHz) and we call the control every 10 switching cycles, so 50µs (20kHz). !!! warning There are limitations when using this method : @@ -47,10 +47,10 @@ A simple timer not related to the PWM can be used to compute the control task pe ![timer source](images/timer_source_task.svg) !!! tip - With an independant timer you can choose any value in µs as the control period, there is not the same limitation as the PWM source. + With an independent timer you can choose any value in µs as the control period; there is not the same limitation as the PWM source. !!! warning - The disavantage of such method is that since it is independant from the PWM you can't have synchronization between several control task modules. + The disadvantage of this method is that, since it is independent from the PWM, you cannot synchronize control tasks across multiple modules. ### Initialization sequence @@ -80,17 +80,17 @@ A simple timer not related to the PWM can be used to compute the control task pe ## Non time critical tasks -In the powerAPI, non time critical tasks are refered as background tasks. +In the powerAPI, non-time-critical tasks are referred to as background tasks. ### Priority between critical and non-critical task -The control task has priority over any other task. It will preempts any background task. The control task can not be preempted. That is why it is also refered as an uninteruptible task. +The control task has priority over any other task. It will preempt any background task. The control task cannot be preempted. That is why it is also referred to as an uninterruptible task. ![task priority](images/task_priority.svg) ### Pseudo periodicity of non-critical task -Non-critical tasks aren't synchronous, meaning they're not recurring at regular intervals. Instead, they operate in a pseudo-periodic manner: we can temporarily halt them for a specific duration, during which they remain inactive. Below, in the illustration we suspend the background task for a period of 500ms. After 500ms we can execute again the background task, but we need to end the control task to do that (the critical task is uninteruptible). +Non-critical tasks aren't synchronous, meaning they're not recurring at regular intervals. Instead, they operate in a pseudo-periodic manner: we can temporarily halt them for a specific duration, during which they remain inactive. Below, in the illustration we suspend the background task for a period of 500ms. After 500ms we can execute the background task again, but we need to end the control task to do that (the critical task is uninterruptible). ![](images/task_pseudo_periodic.svg)