在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FreeRTOS內(nèi)核控制詳解

CHANBAEK ? 來源:南山府嵌入式 ? 作者: 千秋 ? 2023-04-15 15:16 ? 次閱讀

1-任務(wù)產(chǎn)量

請(qǐng)求上下文切換到其他任務(wù)

task. h

taskYIELD() 用于請(qǐng)求切換上下文到另一個(gè)任務(wù)。 但是, 除非存在其他任務(wù),其優(yōu)先級(jí)等于或高于調(diào)用 taskYIELD() 的任務(wù)的優(yōu)先級(jí), 否則 RTOS 調(diào)度器將選擇 調(diào)用了 taskYIELD() 的任務(wù)并使其再次運(yùn)行。

如果 configUSE_PREEMPTION 設(shè)置 為 1,則 RTOS 調(diào)度器將始終運(yùn)行 能夠運(yùn)行的優(yōu)先級(jí)最高的任務(wù),因此調(diào)用 taskYIELD() 將永遠(yuǎn)無法 切換到一個(gè)優(yōu)先級(jí)更高的任務(wù)。

2-taskDISABLE_INTERRUPTS()

task. h

如果使用的移植支持 configMAX_SYSCALL_INTERRUPT_PRIORITY( 或 configMAX_API_CALL_INTERRUPT_PRIORITY)常量,那么 taskDISABLE_interrupts 將 禁用所有中斷,或在 configMAX_SYSCALL_INTRUPT_PROJECT 設(shè)置之前屏蔽(禁用)中斷。 檢查 taskDISABLE_INTERRUPTS 在使用的移植中的實(shí)現(xiàn)。

如果使用的移植不支持 configMAX_SYSCALL_INTERRUPT_PRIORITY 常量, 那么 taskDISABLE_INTERRUPTS() 將對(duì)所有可屏蔽的中斷進(jìn)行全局禁用。

通常情況下不會(huì)直接調(diào)用該宏,而是使用 taskENTER_CRITICAL() 和 taskEXIT_CRITICAL() 來替代。

3-taskENABLE_INTERRUPTS()

task. h
啟用微控制器中斷的宏。

通常情況下不會(huì)直接調(diào)用該宏,而是使用 taskENTER_CRITICAL() 和 taskEXIT_CRITICAL() 來替代。

4-taskENTER_CRITICAL()/taskEXIT_CRITICAL()

task. h

void taskENTER_CRITICAL( void );
void taskEXIT_CRITICAL( void );

通過調(diào)用 taskENTER_CRITICAL() 進(jìn)入臨界區(qū),隨后 通過調(diào)用 taskEXIT_CRITICAL() 退出臨界區(qū)。

宏 taskENTER_CRITICAL() 和 taskEXIT_CRITICAL() 提供了一個(gè)基本 臨界區(qū)實(shí)現(xiàn),只需禁用中斷即可使其全局運(yùn)作, 或在特定的中斷優(yōu)先級(jí)范圍內(nèi)運(yùn)作。

如果所使用的 FreeRTOS 移植未使用 configMAX_SYSCALL_INTERRUPT_PRIORITY 內(nèi)核配置常量(也稱為 configMAX_API_CALL_INTERRUPT_PRIORITY),則調(diào)用 taskENTER_CRITICAL() 將 全局禁用中斷。 如果所使用的 FreeRTOS 移植 使用了 configMAX_SYSCALL_INTERRUPT_PRIORITY 內(nèi)核配置常量, 則調(diào)用 taskENTER_CRITICAL() 會(huì)將中斷保留在 由已禁用的 configMAX_SYSCALL_INTERRUPT_PRIORITY 設(shè)置的中斷優(yōu)先級(jí)一下, 并啟用所有更高優(yōu)先級(jí)的中斷。

搶占式上下文切換僅在中斷內(nèi)發(fā)生, 在中斷被禁用時(shí)不會(huì)發(fā)生。 因此,可保證 調(diào)用 taskENTER_CRITICAL() 的任務(wù)維持在運(yùn)行狀態(tài),直到 退出臨界區(qū),除非任務(wù)明確試圖阻塞或讓出 (它不應(yīng)在臨界區(qū)的內(nèi)部進(jìn)行該操作)。

對(duì) taskENTER_CRITICAL() 和 taskEXIT_CRITICAL() 的調(diào)用旨在嵌套。 因此,只有在執(zhí)行了一次對(duì) taskEXIT_CRITICAL() 的調(diào)用, 用于所有先前的 taskENTER_CRITICAL() 調(diào)用之后, 才會(huì)退出臨界區(qū)。

臨界區(qū)必須保持非常短,否則將影響 中斷響應(yīng)時(shí)間。 每次 taskENTER_CRITICAL() 調(diào)用都必須緊密配合 taskEXIT_CRITICAL() 調(diào)用。

不得從臨界區(qū)調(diào)用 FreeRTOS API 函數(shù)。
taskENTER_CRITICAL() 和 taskEXIT_CRITICAL() 不得從中斷服務(wù)程序 (ISR) 調(diào)用

4.1用法示例:

/*臨界段的函數(shù)應(yīng)用. */
void vDemoFunction( void )
{
    /* 進(jìn)入臨界區(qū)。在本例中,這個(gè)函數(shù)本身是從一個(gè)臨界區(qū)中調(diào)用的,因此進(jìn)入這個(gè)臨界區(qū)將導(dǎo)致嵌套深度為2。*/
    taskENTER_CRITICAL();


    /* 執(zhí)行此處臨界區(qū)所保護(hù)的操作。*/


    /* 退出臨界區(qū)。在本例中,這個(gè)函數(shù)本身是從臨界區(qū)調(diào)用的,因此對(duì)taskEXIT_CRITICAL()的調(diào)用將使嵌套計(jì)數(shù)減少1,但不會(huì)導(dǎo)致啟用中斷。*/
    taskEXIT_CRITICAL();
}


/* 從臨界區(qū)中調(diào)用vDemoFunction()的任務(wù)。*/
void vTask1( void * pvParameters )
{
    for( ;; )
    {
        /* 在這里執(zhí)行一些功能。*/


        /* 調(diào)用taskENTER_CRITICAL()創(chuàng)建臨界區(qū)。*/
        taskENTER_CRITICAL();




        /* 執(zhí)行需要臨界區(qū)的代碼。*/




        /* 對(duì)taskENTER_CRITICAL()的調(diào)用可以嵌套,因此調(diào)用包含自己對(duì)taskENTER_CRITICAL()和taskEXIT_CRITICAL()調(diào)用的函數(shù)是安全的。*/
        vDemoFunction();


        /* 事件需要進(jìn)入臨界區(qū)的操作已經(jīng)完成,需要退出臨界區(qū)。在調(diào)用taskEXIT_CRITICAL()之后,嵌套深度將為零,因此中斷將被重新啟用。*/
        taskEXIT_CRITICAL();
    }
}

5-taskENTER_CRITICAL_FROM_ISR()/taskEXIT_CRITICAL_FROM_ISR()

task. h

UBaseType_t taskENTER_CRITICAL_FROM_ISR( 無效 );
void taskEXIT_CRITICAL_FROM_ISR( UBaseType_t uxSavedInterruptStatus );

taskENTER_CRITICAL() and taskEXIT_CRITICAL() 版本 可用于中斷服務(wù)程序 (ISR)。

在 ISR 中,通過調(diào)用 taskENTER_CRITICAL_FROM_ISR() 進(jìn)入臨界區(qū), 然后通過調(diào)用 taskEXIT_CRITICAL_FROM_ISR() 退出。

taskENTER_CRITICAL_FROM_ISR() 宏和 taskEXIT_CRITICAL_FROM_ISR() 宏提供了 基本臨界區(qū)的實(shí)現(xiàn),只需禁用中斷即可使其全局運(yùn)作, 可以是全局禁用,也可以是禁用到特定的中斷優(yōu)先級(jí)。

如果使用的 FreeRTOS 移植支持中斷嵌套,則調(diào)用 taskENTER_CRITICAL_FROM_ISR() 將在內(nèi)核配置常量 configMAX_SYSCALL_INTERRUPT_PRIORITY 設(shè)置的中斷優(yōu)先級(jí)或以下級(jí)別禁用中斷,并 啟用所有其他中斷優(yōu)先級(jí)。 如果使用的 FreeRTOS 移植不支持中斷嵌套,則 taskENTER_CRITICAL_FROM_ISR() 和 taskEXIT_CRITICAL_FROM_ISR() 將不起作用。

調(diào)用 taskENTER_CRITICAL_FROM_ISR() 和 taskEXIT_CRITICAL_FROM_ISR() 旨在用于嵌套,但宏的使用方式的語義不同于 taskENTER_CRITICAL() 和 taskEXIT_CRITICAL() 等效項(xiàng)。

臨界區(qū)必須保持非常短,否則將影響 更高優(yōu)先級(jí)的中斷的響應(yīng)時(shí)間,會(huì)導(dǎo)致該中斷嵌套。 每次 taskENTER_CRITICAL_FROM_ISR() 調(diào)用都必須緊密配合 taskEXIT_CRITICAL_FROM_ISR() 調(diào)用一起使用。

不得從臨界區(qū)調(diào)用 FreeRTOS API 函數(shù)。

5.1參數(shù):

uxSavedInterruptStatus taskEXIT_CRITICAL_FROM_ISR() 將 uxSavedInterruptStatus 作為其 唯一參數(shù)。 作為 uxSavedInterruptStatus 參數(shù)使用的值 必須是從匹配的 taskENTER_CRITICAL_FROM_ISR() 調(diào)用返回的值。
taskENTER_CRITICAL_FROM_ISR() 不采用任何 參數(shù)。

5.2 退貨:

taskENTER_CRITICAL_FROM_ISR() 返回調(diào)用宏之前的中斷掩碼狀態(tài) 。 taskENTER_CRITICAL_FROM_ISR() 返回的值 必須作為 uxSavedInterruptStatus 參數(shù)用于匹配的 taskEXIT_CRITICAL_FROM_ISR() 調(diào)用。
taskEXIT_CRITICAL_FROM_ISR() 不返回值。

5.3 用法示例:

/* 從ISR調(diào)用的函數(shù)。*/
void vDemoFunction( void )
{
UBaseType_t uxSavedInterruptStatus;


    /* 進(jìn)入臨界區(qū)。在這個(gè)例子中,這個(gè)函數(shù)本身是從一個(gè)臨界區(qū)中調(diào)用的,所以進(jìn)入這個(gè)臨界區(qū)將導(dǎo)致嵌套深度為2。將taskENTER_CRITICAL_FROM_ISR()返回的值保存到本地堆棧變量中,以便將其傳遞給taskEXIT_CRITICAL_FROM_ISR()。*/
    uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();


    /* 執(zhí)行臨界區(qū)保護(hù)的操作。*/


    /* 退出臨界區(qū)。在這個(gè)例子中,這個(gè)函數(shù)本身是從臨界區(qū)調(diào)用的,所以中斷在uxSavedInterruptStatus中存儲(chǔ)值之前就已經(jīng)被禁用了,因此將uxSavedInterruptStatus傳遞給taskEXIT_CRITICAL_FROM_ISR()不會(huì)導(dǎo)致中斷被重新啟用。*/
    taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );
}


/* 從中斷服務(wù)例程中調(diào)用vDemoFunction()的任務(wù)。*/
void vDemoISR( void )
{
UBaseType_t uxSavedInterruptStatus;


    /* 調(diào)用taskENTER_CRITICAL_FROM_ISR()創(chuàng)建一個(gè)臨界區(qū),將返回值保存到本地堆棧變量中。*/
    uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();




    /* 執(zhí)行需要臨界區(qū)的代碼。*/




    /* 對(duì)taskENTER_CRITICAL_FROM_ISR()的調(diào)用可以嵌套,因此可以安全地調(diào)用


函數(shù),該函數(shù)包含對(duì)taskENTER_CRITICAL_FROM_ISR()和


taskEXIT_CRITICAL_FROM_ISR()。*/
    vDemoFunction();


    /* 事件需要進(jìn)入臨界區(qū)的操作已經(jīng)完成,需要退出臨界區(qū)。假設(shè)中斷在進(jìn)入這個(gè)ISR時(shí)被啟用,保存在uxSavedInterruptStatus中的值將導(dǎo)致中斷被重新啟用。*/
    taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );
}

6-vTaskStartScheduler

task. h
void vTaskStartScheduler( void );

啟動(dòng) RTOS 調(diào)度器。 調(diào)用后,RTOS 內(nèi)核可以控制在何時(shí)執(zhí)行哪些任務(wù)。

空閑任務(wù)和可選的 定時(shí)器守護(hù)進(jìn)程任務(wù)會(huì)自動(dòng)創(chuàng)建(當(dāng) RTOS 調(diào)度器啟動(dòng)時(shí))。

vTaskStartScheduler() 僅在沒有足夠的 RTOS 堆 可用來創(chuàng)建空閑或定時(shí)器守護(hù)進(jìn)程任務(wù)時(shí)才會(huì)返回。

所有 RTOS 演示應(yīng)用程序項(xiàng)目都包含使用 vTaskStartScheduler() 的示例,通常 位于 main.c 的 main() 函數(shù)中。

6.1 用法示例:

void vAFunction( void )
{
     // Tasks can be created before or after starting the RTOS
     scheduler
     xTaskCreate( vTaskCode,
                  "NAME",
                  STACK_SIZE,
                  NULL,
                  tskIDLE_PRIORITY,
                  NULL );


     // Start the real time scheduler.
     vTaskStartScheduler();


     // Will not get here unless there is insufficient RAM.
 }

7-vTaskEndScheduler

task. h
void vTaskEndScheduler( void );

注意:這僅適用于 x86 Real Mode PC 移植。

停止 RTOS 內(nèi)核滴答。 所有已創(chuàng)建的任務(wù)將自動(dòng)刪除,多任務(wù)處理(搶占式或協(xié)作式)將停止。 然后從調(diào)用 vTaskStartScheduler() 的位置恢復(fù)執(zhí)行,就像 vTaskStartScheduler() 剛剛返回一樣。

有關(guān)使用 vTaskEndScheduler() 的示例,請(qǐng)參閱 demo/PC 目錄中的演示應(yīng)用程序文件 main.c。

vTaskEndScheduler() 需要在可移植層中定義一個(gè)退出函數(shù)(有關(guān) PC 移植,請(qǐng)參閱 port.c 中的 vPortEndScheduler())。 這將執(zhí)行硬件特定的操作,例如停止 RTOS 內(nèi)核滴答。

vTaskEndScheduler() 將釋放 RTOS 內(nèi)核分配的所有資源,但不會(huì)釋放應(yīng)用程序任務(wù)分配的資源。

7.1 示例用法:

void vTaskCode( void * pvParameters )
{
     for( ;; )
     {
         // Task code goes here.


         // At some point we want to end the real time kernel processing 
         // so call ...
         vTaskEndScheduler ();
     }
 }


 void vAFunction( void )
{
     // Create at least one task before starting the RTOS kernel.
     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );


     // Start the real time kernel with preemption.
     vTaskStartScheduler();


     // Will only get here when the vTaskCode () task has called 
     // vTaskEndScheduler ().  When we get here we are back to single task 
     // execution.
 }

8- vTask掛起全部

task. h
void vTaskSuspendAll( void );

掛起調(diào)度器。 掛起調(diào)度器會(huì)阻止上下文切換,但會(huì)讓中斷處于啟用狀態(tài)。 如果調(diào)度器被掛起時(shí),中斷請(qǐng)求切換上下文,那么請(qǐng)求將會(huì)被掛起。 而且只有在調(diào)度器恢復(fù)(取消掛起)時(shí)才會(huì)執(zhí)行。

在 vTaskSuspendAll() 之后調(diào)用 xTaskResumeAll() 會(huì)轉(zhuǎn)換調(diào)度器的狀態(tài),取消其阻塞狀態(tài)。

vTaskSuspendAll() 可以嵌套調(diào)用。 調(diào)用 xTaskResumeAll() 的次數(shù)必須與先前調(diào)用 vTaskSuspendAll() 的次數(shù)相同,然后調(diào)度器將取消掛起狀態(tài)并重新進(jìn)入活動(dòng)狀態(tài)。

xTaskResumeAll() 只能在正在執(zhí)行的任務(wù)中調(diào)用,因此不能在調(diào)度器處于初始化狀態(tài)時(shí)(啟動(dòng)計(jì)劃程序之前)調(diào)用。

不得在調(diào)度器掛起時(shí)調(diào)用其他 FreeRTOS API 函數(shù)。

調(diào)度器掛起時(shí),禁止調(diào)用可能切換上下文的 API 函數(shù)(例如 vTaskDelayUntil()、xQueueSend() 等等) 。

8.1 用法示例:

/* A function that suspends then resumes the scheduler. */
void vDemoFunction( void )
{
    /* This function suspends the scheduler.  When it is called from vTask1 the 
    scheduler is already suspended, so this call creates a nesting depth of 2. */
    vTaskSuspendAll();

    /* Perform an action here. */

    /* As calls to vTaskSuspendAll() are nested, resuming the scheduler here will 
    not cause the scheduler to re-enter the active state. */
    xTaskResumeAll();
}


void vTask1( void * pvParameters )
{
    for( ;; )
    {
        /* Perform some actions here. */

        /* At some point the task wants to perform an operation during which it does 
        not want to get swapped out, or it wants to access data which is also 
        accessed from another task (but not from an interrupt).  It cannot use
        taskENTER_CRITICAL()/taskEXIT_CRITICAL() as the length of the operation may
        cause interrupts to be missed. */



        /* Prevent the scheduler from performing a context switch. */
        vTaskSuspendAll();



        /* Perform the operation here.  There is no need to use critical sections as 
        the task has all the processing time other than that utilized by interrupt 
        service routines.*/           


        /* Calls to vTaskSuspendAll() can be nested so it is safe to call a (non API) 
        function which also contains calls to vTaskSuspendAll().  API functions 
        should not be called while the scheduler is suspended. */
        vDemoFunction();



        /* The operation is complete.  Set the scheduler back into the Active 
        state. */
        if( xTaskResumeAll() == pdTRUE )
        {
            /* A context switch occurred within xTaskResumeAll(). */
        }
        else
        {
            /* A context switch did not occur within xTaskResumeAll(). */
        }
    }
}

9-x任務(wù)簡(jiǎn)歷全部

task. h
BaseType_t xTaskResumeAll( void );

恢復(fù)通過調(diào)用 vTaskSuspendAll() 掛起的調(diào)度器。

xTaskResumeAll() 僅恢復(fù)調(diào)度器, 不會(huì)取消掛起 之前通過調(diào)用 vTaskSuspend() 而掛起的任務(wù)。

9.1 退貨:

如果恢復(fù)調(diào)度器導(dǎo)致了上下文切換,則返回 pdTRUE,否則返回 pdFALSE。

9.2 用法示例:

void vTask1( void * pvParameters )
 {
     for( ;; )
     {
         /* Task code goes here. */


         /* ... */


         /* At some point the task wants to perform a long operation
         during which it does not want to get swapped out.  It cannot
         use taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length
         of the operation may cause interrupts to be missed -
         including the ticks.


         Prevent the RTOS kernel swapping out the task. */
         vTaskSuspendAll();


         /* Perform the operation here.  There is no need to use critical
         sections as we have all the microcontroller processing time.
         During this time interrupts will still operate and the real
         time RTOS kernel tick count will be maintained. */


         /* ... */


         /* The operation is complete.  Restart the RTOS kernel.  We want to force
         a context switch - but there is no point if resuming the scheduler
         caused a context switch already. */
         if( !xTaskResumeAll () )
         {
              taskYIELD ();
         }
     }
 }

10-vTaskStepTick

task. h
void vTaskStepTick( TickType_t xTicksToJump );

如果 RTOS 配置為使用無滴答空閑功能, 則只要空閑任務(wù)是唯一能夠執(zhí)行的任務(wù), 滴答中斷就會(huì)停止,并且微控制器會(huì)進(jìn)入低功耗狀態(tài)。 在退出低功率狀態(tài)時(shí), 必須校正滴答計(jì)數(shù)值, 以包含停止時(shí)所經(jīng)過的時(shí)間。

如果 FreeRTOS 移植包含默認(rèn) portSUPPRESS_TICKS_AND_SLEEP() 實(shí)現(xiàn), 則會(huì)在內(nèi)部使用 vTaskStepTick() 來確保 滴答計(jì)數(shù)值正確。 vTaskStepTick() 是一個(gè)公共 API 函數(shù), 可用于覆蓋默認(rèn)的 portSUPPRESS_TICKS_AND_SLEEP() 實(shí)現(xiàn), 如果正在使用的移植不提供默認(rèn)值, 則提供 portSUPPRESS_TICKS_AND_SLEEP()。

必須將 configUSE_TICKLESS_IDLE 配置常量設(shè)置為 1, vTaskStepTick() 才可用。

10.1 參數(shù):

xTicksToJump 自滴答中斷停止以來經(jīng)過的 RTOS 滴答數(shù) 。 為確保正常運(yùn)行, 該參數(shù)必須小于或 等于 portSUPPRESS_TICKS_AND_SLEEP() 參數(shù)。

10.2 用法示例:

該示例演示了對(duì)多個(gè)函數(shù)的調(diào)用。 僅 vTaskStepTick() 是 FreeRTOS API 的一部分。 其他函數(shù)特定于 所用硬件上可用的時(shí)鐘和節(jié)能模式,因此必須 由應(yīng)用程序編寫者提供。

/* First define the portSUPPRESS_TICKS_AND_SLEEP().  The parameter is the time,
in ticks, until the kernel next needs to execute. */
#define portSUPPRESS_TICKS_AND_SLEEP( xIdleTime ) vApplicationSleep( xIdleTime )


/* Define the function that is called by portSUPPRESS_TICKS_AND_SLEEP(). */
void vApplicationSleep( TickType_t xExpectedIdleTime )
{
unsigned long ulLowPowerTimeBeforeSleep, ulLowPowerTimeAfterSleep;


    /* Read the current time from a time source that will remain operational
    while the microcontroller is in a low power state. */
    ulLowPowerTimeBeforeSleep = ulGetExternalTime();


    /* Stop the timer that is generating the tick interrupt. */
    prvStopTickInterruptTimer();


    /* Configure an interrupt to bring the microcontroller out of its low power
    state at the time the kernel next needs to execute.  The interrupt must be
    generated from a source that is remains operational when the microcontroller
    is in a low power state. */
    vSetWakeTimeInterrupt( xExpectedIdleTime );


    /* Enter the low power state. */
    prvSleep();


    /* Determine how long the microcontroller was actually in a low power state
    for, which will be less than xExpectedIdleTime if the microcontroller was
    brought out of low power mode by an interrupt other than that configured by
    the vSetWakeTimeInterrupt() call.  Note that the scheduler is suspended
    before portSUPPRESS_TICKS_AND_SLEEP() is called, and resumed when
    portSUPPRESS_TICKS_AND_SLEEP() returns.  Therefore no other tasks will
    execute until this function completes. */
    ulLowPowerTimeAfterSleep = ulGetExternalTime();


    /* Correct the kernels tick count to account for the time the microcontroller
    spent in its low power state. */
    vTaskStepTick( ulLowPowerTimeAfterSleep - ulLowPowerTimeBeforeSleep );


    /* Restart the timer that is generating the tick interrupt. */
    prvStartTickInterruptTimer();
}

11- xTaskCatchUpTicks

task. h
BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp );

在應(yīng)用程序代碼長(zhǎng)時(shí)間禁用中斷后, 更正滴答計(jì)數(shù)值。 此函數(shù)與 vTaskStepTick() 類似, 但與 vTaskStepTick() 不同的是,此函數(shù)可以增加滴答計(jì)數(shù), 使其超過應(yīng)將任務(wù)從阻塞態(tài)中移除的時(shí)間。 這意味著 xTaskCatchUpTicks() 可從 阻塞態(tài)中移除任務(wù)。

11.1 參數(shù):

xTicksToCatchUp 由于中斷被禁用而錯(cuò)過的滴答中斷數(shù)。 此值不會(huì)自動(dòng)計(jì)算, 必須由應(yīng)用程序編寫者計(jì)算。

11.2 退貨:

如果增加滴答計(jì)數(shù),任務(wù)會(huì)解除阻塞態(tài)并執(zhí)行上下文切換, 則返回 pdTRUE。 否則返回 pdFALSE。

11.3 用法示例:

void vExampleFunction( void )
{
    unsigned long ulTimeBefore, ulTimeAfter;


    /* Read the current time before arbitrary processing takes place. */
    ulTimeBefore = ulGetExternalTime();


    /* Stop the timer that is generating the tick interrupt. */
    prvStopTickInterruptTimer();

    /* Perform some arbitrary processing. */
    arbitrary_processing();

    /* Read the current time for computing elapsed time since ticks 
    were disabled. */
    ulTimeAfter = ulGetExternalTime();


    if ( xTaskCatchUpTicks( ulTimeAfter - ulTimeBefore ) == pdTRUE ) 
    {
        /* Moving the tick count forward resulted in a context switch. */
    }

    /* Restart the timer that is generating the tick interrupt. */
    prvStartTickInterruptTimer();


}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1410

    瀏覽量

    41139
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    904

    瀏覽量

    42542
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3824

    瀏覽量

    82491
  • RTOS
    +關(guān)注

    關(guān)注

    24

    文章

    844

    瀏覽量

    120810
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    491

    瀏覽量

    63817
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Cortex-M內(nèi)核使用FreeRTOS特別注意事項(xiàng)

    本文來自CSDN博客FreeRTOS基礎(chǔ)篇,本篇主要分享Cortex-M內(nèi)核使用FreeRTOS特別注意事項(xiàng)。
    發(fā)表于 09-19 15:01 ?1120次閱讀
    Cortex-M<b class='flag-5'>內(nèi)核</b>使用<b class='flag-5'>FreeRTOS</b>特別注意事項(xiàng)

    ucosII內(nèi)核詳解

    ucosII內(nèi)核詳解
    發(fā)表于 08-16 20:11

    ucosII內(nèi)核詳解

    [url=]ucosII內(nèi)核詳解[/url]
    發(fā)表于 01-29 14:06

    FreeRTOS實(shí)時(shí)內(nèi)核使用指南-中文

    FreeRTOS實(shí)時(shí)內(nèi)核使用指南-中文版,Using the FreeRTOS Real Time Kernel - A Practical Guide的中文版本
    發(fā)表于 07-13 15:11 ?124次下載

    FreeRTOS基礎(chǔ)知識(shí)詳解pdf下載

    FreeRTOS基礎(chǔ)知識(shí)詳解
    發(fā)表于 03-29 14:36 ?45次下載

    STM32F103 FreeRTOS迷你實(shí)時(shí)操作系統(tǒng)內(nèi)核的開發(fā)手冊(cè)免費(fèi)下載

    本教程中關(guān)于FreeRTOS 的原理性知識(shí)均參考自FreeRTOS 官方手冊(cè):《FreeRTOS Reference Manual》和《Using the FreeRTOS Real
    發(fā)表于 05-16 08:00 ?67次下載
    STM32F103 <b class='flag-5'>FreeRTOS</b>迷你實(shí)時(shí)操作系統(tǒng)<b class='flag-5'>內(nèi)核</b>的開發(fā)手冊(cè)免費(fèi)下載

    內(nèi)核使用FreeRTOS的特別注意事項(xiàng)有哪些?

    在閱讀本文之前,有兩個(gè)定義在FreeRTOSConfig.h中的宏,你必須先明白它們是什么意思,《FreeRTOS內(nèi)核配置說明》一文中,講解了這兩個(gè)宏
    的頭像 發(fā)表于 02-01 10:21 ?2853次閱讀
    <b class='flag-5'>內(nèi)核</b>使用<b class='flag-5'>FreeRTOS</b>的特別注意事項(xiàng)有哪些?

    關(guān)于FreeRTOS內(nèi)核的配置說明

    FreeRTOS內(nèi)核是高度可定制的,使用配置文件FreeRTOSConfig.h進(jìn)行定制。每個(gè)FreeRTOS應(yīng)用都必須包含這個(gè)頭文件,用戶根據(jù)實(shí)際應(yīng)用來裁剪定制FreeRTOS
    的頭像 發(fā)表于 02-01 10:37 ?2895次閱讀

    從0到1學(xué)習(xí)FreeRTOSFreeRTOS 內(nèi)核應(yīng)用開發(fā):(一)移植FreeRTOS到STM32第一部分

    從0到1學(xué)習(xí)FreeRTOSFreeRTOS 內(nèi)核應(yīng)用開發(fā):(一)移植FreeRTOS到STM32第一部分
    發(fā)表于 12-04 12:51 ?22次下載
    從0到1學(xué)習(xí)<b class='flag-5'>FreeRTOS</b>:<b class='flag-5'>FreeRTOS</b> <b class='flag-5'>內(nèi)核</b>應(yīng)用開發(fā):(一)移植<b class='flag-5'>FreeRTOS</b>到STM32第一部分

    FreeRTOS系列第6篇---FreeRTOS內(nèi)核配置說明

    FreeRTOS內(nèi)核是高度可定制的,使用配置文件FreeRTOSConfig.h進(jìn)行定制。每個(gè)FreeRTOS應(yīng)用都必須包含這個(gè)頭文件,用戶根據(jù)實(shí)際應(yīng)用來裁剪...
    發(fā)表于 01-26 17:57 ?15次下載
    <b class='flag-5'>FreeRTOS</b>系列第6篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>內(nèi)核</b>配置說明

    FreeRTOS內(nèi)核實(shí)現(xiàn)與應(yīng)用開發(fā)實(shí)戰(zhàn)指南

    本書是首本系統(tǒng)講解 FreeRTOS 的中文書籍,共分為兩個(gè)部分,第一部分為“從 0 到 1教你寫 FreeRTOS 內(nèi)核”,即重點(diǎn)講解 FreeRTOS 的原理實(shí)現(xiàn),從 0 開始,不
    發(fā)表于 05-24 16:26 ?278次下載

    FreeRtos入門手冊(cè)中文版

    全中文FreeRtos詳解,學(xué)習(xí)入門精通。
    發(fā)表于 06-02 11:13 ?0次下載

    掌握FreeRTOS實(shí)時(shí)內(nèi)核

    FreeRTOS非常適合使用微控制器或小型微處理器。這種類型的應(yīng)用程序通常包括硬實(shí)時(shí)和軟實(shí)時(shí)要求。
    發(fā)表于 09-28 15:45 ?7次下載

    FreeRTOS的移植

    FreeRTOS包含Demo例程和內(nèi)核源碼(比較重要,我們就需要提取該目錄下的大部分文件)。 **Source**文件夾里面包含的是FreeRTOS內(nèi)核的源代碼,我們移植
    的頭像 發(fā)表于 02-14 09:34 ?1512次閱讀
    <b class='flag-5'>FreeRTOS</b>的移植

    ESP32模塊的FreeRTOS內(nèi)核分配

    Esp32 模塊中已經(jīng)提供了 FreeRTOS(實(shí)時(shí)操作系統(tǒng))固件。FreeRTOS有助于提高系統(tǒng)性能和管理模塊的資源。FreeRTOS允許用戶處理多項(xiàng)任務(wù),如測(cè)量傳感器讀數(shù),發(fā)出網(wǎng)絡(luò)請(qǐng)求,
    的頭像 發(fā)表于 05-18 16:25 ?2097次閱讀
    ESP32模塊的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>內(nèi)核</b>分配
    主站蜘蛛池模板: 免费看美女午夜大片 | 男人j进入女人免费视频 | 亚洲天堂网站在线 | 日干夜操 | 午夜视频欧美 | 中国又粗又大又爽的毛片 | 人人做人人澡人人人爽 | 欧美1024 | 欧美人与性另类 | 婷婷综合久久 | 奇米777狠狠 | 噜噜噜噜私人影院 | 亚洲天堂h | 啪啪免费网站视频观看 | 很黄很黄叫声床戏免费视频 | 一级特黄aaaaaa大片 | 五月天婷婷电影 | 天天爽天天狼久久久综合 | 国产一级做a爱免费观看 | 国产美女一级ba大片免色 | 色黄视频网站 | 欧美色频 | 男女性gif抽搐出入 男女性高爱潮免费的国产 男女性高爱麻豆 | 韩国精品视频 | 最近2018年中文字幕在线 | 嫩草影院入口一二三免费 | 免费欧美黄色片 | 在线五月婷婷 | 中文字幕一区2区3区 | 夜夜操天天干 | 午夜视频免费国产在线 | 老色批午夜免费视频网站 | 男人的天堂免费网站 | 日本三级带日本三级带黄首页 | 手机看片1024免费视频 | 天天射天天干 | 亚洲毛片网 | 韩国最新三级网站在线播放 | 国产伦精品一区二区三区网站 | 亚洲swag精品自拍一区 | 中国一级特黄特色真人毛片 |