日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FreeRtos 那点事

發(fā)布時(shí)間:2025/3/21 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FreeRtos 那点事 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
FreeRTOS(讀作"free-arr-toss")是一個(gè)嵌入式系統(tǒng)使用的開源實(shí)時(shí)操作系統(tǒng)。FreeRTOS被設(shè)計(jì)為“小巧,簡(jiǎn)單,和易用”,能支持許多不同硬件架構(gòu)以及交叉編譯器。
? ? FreeRTOS自2002年Richard Barry開始開發(fā)以來,一直都在積極開發(fā)中。至于我,我不是FreeRTOS的開發(fā)人員或貢獻(xiàn)者,我只不過是一個(gè)最終用戶和愛好者。因此,這章將著重與FreeRTOS架構(gòu)之“是什么”和“怎么做”,而相對(duì)本書其他章節(jié)來說,較少去講“為什么”。
? ? 就像所有操作系統(tǒng)一樣,FreeRTOS的主要工作是執(zhí)行任務(wù)。大部分FreeRTOS的代碼都涉及優(yōu)先權(quán)、調(diào)度以及執(zhí)行用戶自定義任務(wù)。但又與所有其他操作系統(tǒng)不同,FreeRTOS是一款運(yùn)行在嵌入式系統(tǒng)上的實(shí)時(shí)操作系統(tǒng)。
? ? 到本章結(jié)束,我希望你可以了解FreeRTOS的基本架構(gòu)。大部分FreeRTOS致力于執(zhí)行任務(wù),所以你可以很好地看到它究竟是如何做到的。

? ? 如果這是你首次去深入了解一個(gè)操作系統(tǒng),我還是希望你可以學(xué)習(xí)到最基本的操作系統(tǒng)是如何工作的。FreeRTOS是相對(duì)簡(jiǎn)單的,特別是相比Windows,Linux,或者OS X而言,不過所有操作系統(tǒng)都有著相同的概念和目標(biāo),所以不論學(xué)習(xí)哪個(gè)操作系統(tǒng)都是有啟發(fā)和有趣的。

3.1 ?什么是“嵌入式”和“實(shí)時(shí)”?
? ? “嵌入式”和“實(shí)時(shí)”對(duì)于不同的人來說代表不同的理解,所以讓我們像FreeRTOS用戶那樣來定義它們。
? ? 嵌入式系統(tǒng)就是一個(gè)專門設(shè)計(jì)用來做一些簡(jiǎn)單事情的計(jì)算機(jī)系統(tǒng),就像是電視遙控器,車載GPS,電子手表,或者起搏器這類。嵌入式系統(tǒng)比通用計(jì)算機(jī)系統(tǒng)顯著的區(qū)別在于更小和更慢,通常也更便宜。一個(gè)典型的低端嵌入式系統(tǒng)可能有一個(gè)運(yùn)行速度為25MHz的8位CPU,幾KB的內(nèi)存,和也許32KB的閃存。一個(gè)高端的嵌入式系統(tǒng)可能有一個(gè)運(yùn)行速度為750MHz的32位CPU,一個(gè)GB左右的內(nèi)存,和幾個(gè)GB的閃存。
? ? 實(shí)時(shí)系統(tǒng)是設(shè)計(jì)去完成一定時(shí)間內(nèi)的事,它們保證這些事是在應(yīng)該做的時(shí)候去做。
? ? 心臟起搏器是實(shí)時(shí)嵌入式系統(tǒng)的一個(gè)極好例子。起搏器必須在正確的時(shí)間收縮心肌,以挽救你的生命;它不能夠太忙而沒有及時(shí)響應(yīng)。心臟起搏器以及其他的實(shí)時(shí)嵌入式系統(tǒng)都必須精心設(shè)計(jì),以便在任何時(shí)刻都能及時(shí)執(zhí)行它們的任務(wù)。
3.2 ?架構(gòu)概述
? ? FreeRTOS是一個(gè)相對(duì)較小的應(yīng)用程序。最小化的FreeRTOS內(nèi)核僅包括3個(gè)(.c)文件和少數(shù)頭文件,總共不到9000行代碼,還包括了注釋和空行。一個(gè)典型的編譯后(二進(jìn)制)代碼映像小于10KB。
? ? FreeRTOS的代碼可以分解為三個(gè)主要區(qū)塊:任務(wù),通訊,和硬件接口。
? ? ●任務(wù):大約有一半的FreeRTOS的核心代碼用來處理多數(shù)操作系統(tǒng)首要關(guān)注的問題:任務(wù)。任務(wù)是給定優(yōu)先級(jí)的用戶定義的C函數(shù)。task.c和task.h完成了所有有關(guān)創(chuàng)建,調(diào)度,和維護(hù)任務(wù)的繁重工作。
? ? ●通訊:任務(wù)很重要,不過任務(wù)間可以互相通訊則更為重要!它給我們帶來FreeRTOS的第二項(xiàng)任務(wù):通訊。大約40%的FreeRTOS核心代碼是用來處理通訊的。queue.c和queue.h是負(fù)責(zé)處理FreeRTOS的通訊的。任務(wù)和中斷使用隊(duì)列互相發(fā)送數(shù)據(jù),并且使用信號(hào)燈和互斥來發(fā)送臨界資源的使用情況。
? ? ●硬件接口:接近9000行的代碼拼湊起基本的FreeRTOS,是硬件無關(guān)的;相同的代碼都能夠運(yùn)行,不論FreeRTOS是運(yùn)行在不起眼的8051,還是最新、最炫的ARM內(nèi)核上。大約有6%的FreeRTOS的核心代碼,在硬件無關(guān)的FreeRTOS內(nèi)核與硬件相關(guān)的代碼間扮演著墊片的角色。我們將在下個(gè)部分討論硬件相關(guān)的代碼。

硬件注意事項(xiàng)
? ? 硬件無關(guān)的FreeRTOS層在硬件相關(guān)層之上。硬件相關(guān)層聲明了你選擇什么樣的芯片架構(gòu)。

? ? 圖3.1顯示了FreeRTOS的各層。


? ??FreeRTOS包含所有你需要用來啟動(dòng)很運(yùn)行系統(tǒng)的硬件無關(guān)以及硬件相關(guān)的代碼。它支持許多編譯器(CodeWarrior,GCC,IAR等)也支持許多處理器架構(gòu)(ARM7,ARM Cortex-M3,PICs各系列,Silicon Labs 8051, x86等)。請(qǐng)參閱FreeRTOS網(wǎng)站,可以看到處理器和編譯器支持列表。 ?

? ? FreeRTOS是高可配置設(shè)計(jì)。FreeRTOS可以被編譯成為適合單CPU,極簡(jiǎn)RTOS,只之支持少數(shù)任務(wù)的操作系統(tǒng),也可以被編譯成為適合多核功能強(qiáng)大的結(jié)合了TCP/IP,文件系統(tǒng),和USB的怪獸。

? ? 配置選項(xiàng)可以通過設(shè)置不同的#defines,在FreeRTOSConfig.h文件里選擇。時(shí)鐘速度,堆大小,互斥,和API子集,連同其他許多選項(xiàng),都可以在這個(gè)文件中配置。這里是幾個(gè)例子,設(shè)置了任務(wù)優(yōu)先級(jí)的最大數(shù)量,CPU的頻率,系統(tǒng)節(jié)拍器的頻率,最小的堆棧大小和總的堆大小:

[cpp]?view plaincopy
  • #define?configMAX_PRIORITIES??????(?(?unsigned?portBASE_TYPE?)?5?)??
  • #define?configCPU_CLOCK_HZ????????(?12000000UL?)??
  • #define?configTICK_RATE_HZ????????(?(?portTickType?)?1000?)??
  • #define?configMINIMAL_STACK_SIZE??(?(?unsigned?short?)?100?)??
  • #define?configTOTAL_HEAP_SIZE?????(?(?size_t?)?(?4?*?1024?)?)??
  • ? ? 對(duì)于不同的交叉編譯器和CPU架構(gòu),硬件相關(guān)代碼分布在多個(gè)文件中。舉例來說,如果你使用ARM Cortex-M3芯片,IAR編譯器工作,那么硬件相關(guān)的代碼就存在FreeRTOS/Source/portable/IAR/ARM_CM3/目錄下。portmacro.h文件聲明了所有硬件特定功能,port.c和portasm.s 包含了所有實(shí)際硬件相關(guān)的代碼。硬件無關(guān)的頭文件portable.h在編譯的時(shí)候用#include's引入正確的portmacro.h文件。FreeRTOS使用#define'd調(diào)用在portmacro.h中聲明的硬件特定功能。
    ? ? 讓我們來看一個(gè)例子,FreeRTOS是如何調(diào)用一個(gè)硬件相關(guān)功能的。硬件無關(guān)的文件tasks.c常常需要插入一個(gè)代碼的臨界區(qū),以防止搶占。在不同架構(gòu)上,插入一個(gè)臨界區(qū)的表現(xiàn)也不同,并且硬件無關(guān)的task.c不需要了解硬件相關(guān)的細(xì)節(jié)。所以task.c調(diào)用全局宏指令portENTER_CRITICAL(), 樂得忽略它實(shí)際上是如何做到的。假設(shè)我們使用IAR編譯器在ARM Crotex-M3芯片上編譯生成FreeRTOS,使用那個(gè)定義了portENTER_CRITICAL()的文件/Source/portable/IAR/ARM_CM3/portmacro.h,如下所示:
    [cpp]?view plaincopy
  • #define?portENTER_CRITICAL()???vPortEnterCritical()??
  • ??? vPortEnterCritical()實(shí)際上是在FreeRTOS/Source/portable/IAR/ARM_CM3/port.c中定義的。這個(gè)port.c文件是一個(gè)硬件相關(guān)的文件,同時(shí)包含了對(duì)IAR編譯器和Cortex-M3芯片認(rèn)識(shí)的代碼文件。vPortEnterCritical()函數(shù)利用這些硬件特定的知識(shí)進(jìn)入臨界區(qū),又返回到與硬件無關(guān)的task.c中。
    ? ? protmacro.h文件也定義了一個(gè)數(shù)據(jù)類型的基本架構(gòu)。這個(gè)數(shù)據(jù)類型中包括了基本整型變量,指針,以及系統(tǒng)時(shí)鐘節(jié)拍器的數(shù)據(jù)類型,在ARM Cortex-M3 chips上使用IAR編譯器時(shí),就采用如下定義:
    [cpp]?view plaincopy
  • #define?portBASE_TYPE??long??????????????//?Basic?integer?variable?type??
  • #define?portSTACK_TYPE?unsigned?long?????//?Pointers?to?memory?locations??
  • typedef?unsigned?portLONG?portTickType;??//?The?system?timer?tick?type??
  • ??? 這樣使用數(shù)據(jù)類型的方法,和函數(shù)透過小層的#defines,看上去略微有點(diǎn)復(fù)雜,不過它允許了FreeRTOS能夠被重新編譯在一個(gè)完全不同的系統(tǒng)架構(gòu)上,僅僅只需要通過修改這些硬件相關(guān)的文件。同時(shí),如果你想要讓FreeRTOS運(yùn)行在一個(gè)當(dāng)前尚未被支持的架構(gòu)上,你只僅僅需要去實(shí)現(xiàn)硬件相關(guān)的功能,這要比在FreeRTOS上去實(shí)現(xiàn)硬件無關(guān)的部分,要少得多。
    ? ? 就如同我們已經(jīng)見到的,FreeRTOS用C的預(yù)處理宏#define來實(shí)現(xiàn)硬件相關(guān)的功能。FreeRTOS也同樣用#define來應(yīng)對(duì)大量的硬件無關(guān)的代碼。對(duì)于非嵌入式應(yīng)用程序這樣頻繁使用#define是一個(gè)嚴(yán)重的錯(cuò)誤,不過在許多小型嵌入式系統(tǒng)中這點(diǎn)開銷比起“實(shí)時(shí)”所提供的功能來說就微不足道了。

    3.3. 調(diào)度任務(wù):快速概述
    ? ? 任務(wù)優(yōu)先級(jí)和就緒列表

    ? ? 所有任務(wù)都有一個(gè)用戶指定優(yōu)先級(jí),從0(最低優(yōu)先級(jí))到 configMAX_PRIORITIES-1的編譯時(shí)間值(最高優(yōu)先級(jí))。例如,如果configMAX_PRIORITIES設(shè)置為5,當(dāng)FreeRTOS使用5個(gè)優(yōu)先等級(jí)時(shí):0(最低優(yōu)先級(jí)),1,2,3,和4(最高優(yōu)先級(jí))。
    ? ? FreeRTOS使用一個(gè)“就緒列表”來跟蹤所有已經(jīng)準(zhǔn)備好運(yùn)行的任務(wù)。它像一個(gè)任務(wù)列表數(shù)組來實(shí)現(xiàn)就緒列表,如下所示:

    [cpp]?view plaincopy
  • static?xList?pxReadyTasksLists[?configMAX_PRIORITIES?];??/*?Prioritised?ready?tasks.??*/??
  • ? ? pxReadyTasksLists[0]是所有準(zhǔn)備好的優(yōu)先級(jí)為0的任務(wù)列表,pxReadyTasksLists[1]是所有準(zhǔn)備好的優(yōu)先級(jí)為1的任務(wù)列表,以此類推,直到pxReadyTasksLists[configMAX_PRIORITIES-1]。
    ? ??系統(tǒng)節(jié)拍器(時(shí)鐘)
    ? ? FreeRTOS系統(tǒng)的心跳就是被稱為系統(tǒng)節(jié)拍器(時(shí)鐘)。FreeRTOS配置這個(gè)系統(tǒng)生成一個(gè)定期的節(jié)拍(時(shí)鐘)中斷。用戶可以配置的節(jié)拍中斷頻率,通常是在毫秒范圍。vTaskSwitchContext()函數(shù)在每次的節(jié)拍中斷釋放的時(shí)候被調(diào)用。vTaskSwitchContext()選擇優(yōu)先級(jí)最高的就緒任務(wù)并將它賦予pxCurrentTCB變量,如下所示:
    [cpp]?view plaincopy
  • /*?Find?the?highest-priority?queue?that?contains?ready?tasks.?*/??
  • while(?listLIST_IS_EMPTY(?&(?pxReadyTasksLists[?uxTopReadyPriority?]?)?)?)??
  • {??
  • ????configASSERT(?uxTopReadyPriority?);??
  • ????--uxTopReadyPriority;??
  • }??
  • /*?listGET_OWNER_OF_NEXT_ENTRY?walks?through?the?list,?so?the?tasks?of?the?same??
  • priority?get?an?equal?share?of?the?processor?time.?*/??
  • ??? listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopReadyPriority ] ) );
    ? ?在當(dāng)型循環(huán)(while loop)開始之前,uxTopReadyPriority就被確保大于或等于優(yōu)先級(jí)最高的就緒任務(wù)。while()循環(huán)從優(yōu)先級(jí)uxTopReadyPriority開始,循環(huán)走下去從pxReadyTasksLists[]數(shù)組里找到就緒任務(wù)優(yōu)先級(jí)最高的那個(gè)。接著listGET_OWNER_OF_NEXT_ENTRY()就搶占那個(gè)就緒列表中優(yōu)先級(jí)最高的下一個(gè)就緒任務(wù)。
    ? ? 現(xiàn)在pxCurrentTCB指向了優(yōu)先級(jí)最高的任務(wù),并且當(dāng)vTaskSwitchContext()返回硬件相關(guān)代碼時(shí)開始運(yùn)行那個(gè)任務(wù)。
    ? ? 那九行代碼是FreeRTOS的絕對(duì)核心。其余FreeRTOS的8900+行代碼都是用來確保那九行代碼,全都是用來保持優(yōu)先級(jí)最高任務(wù)的運(yùn)行的。

    ? ? 圖3.2是一個(gè)大致的就緒列表看起來像什么的圖。這個(gè)例子有三個(gè)優(yōu)先級(jí),有一個(gè)優(yōu)先級(jí)為0的任務(wù),沒有優(yōu)先級(jí)為1的任務(wù),和三個(gè)優(yōu)先級(jí)為2的任務(wù)。這張圖是準(zhǔn)確的,但不完整的;它的少掉一些細(xì)節(jié),我們稍后將補(bǔ)充。


    ? ? 圖3.2:FreeRTOS的就緒列表的基本視圖
    ? ? 現(xiàn)在我們有了大致概述的方式,讓我們?nèi)ド罹克募?xì)節(jié)。我們將著眼于三個(gè)主要FreeRTOS的數(shù)據(jù)結(jié)構(gòu):任務(wù),列表和隊(duì)列。

    3.4. 任務(wù)
    ? ? 所有操作系統(tǒng)的主要工作是運(yùn)行和協(xié)調(diào)用戶任務(wù)。像多數(shù)操作系統(tǒng)一樣,FreeRTOS中的基本工作單元是任務(wù)。FreeRTOS的使用任務(wù)控制塊(TCB)來表示每個(gè)任務(wù)。
    ??? 任務(wù)控制塊(TCB)
    ? ? TCB的在tasks.c定義是這樣的:

    [cpp]?view plaincopy
  • typedef?struct?tskTaskControlBlock??
  • {??
  • ??volatile?portSTACK_TYPE?*pxTopOfStack;??????????????????/*?Points?to?the?location?of?
  • ?????????????????????????????????????????????????????????????the?last?item?placed?on??
  • ?????????????????????????????????????????????????????????????the?tasks?stack.??THIS??
  • ?????????????????????????????????????????????????????????????MUST?BE?THE?FIRST?MEMBER??
  • ?????????????????????????????????????????????????????????????OF?THE?STRUCT.?*/??
  • ??
  • ??
  • ??xListItem????xGenericListItem;??????????????????????????/*?List?item?used?to?place??
  • ?????????????????????????????????????????????????????????????the?TCB?in?ready?and??
  • ?????????????????????????????????????????????????????????????blocked?queues.?*/??
  • ??xListItem????xEventListItem;????????????????????????????/*?List?item?used?to?place??
  • ?????????????????????????????????????????????????????????????the?TCB?in?event?lists.*/??
  • ??unsigned?portBASE_TYPE?uxPriority;??????????????????????/*?The?priority?of?the?task?
  • ?????????????????????????????????????????????????????????????where?0?is?the?lowest??
  • ?????????????????????????????????????????????????????????????priority.?*/??
  • ??portSTACK_TYPE?*pxStack;????????????????????????????????/*?Points?to?the?start?of??
  • ?????????????????????????????????????????????????????????????the?stack.?*/??
  • ??signed?char????pcTaskName[?configMAX_TASK_NAME_LEN?];???/*?Descriptive?name?given??
  • ?????????????????????????????????????????????????????????????to?the?task?when?created.?
  • ?????????????????????????????????????????????????????????????Facilitates?debugging??
  • ?????????????????????????????????????????????????????????????only.?*/??
  • ??
  • ??
  • ??#if?(?portSTACK_GROWTH?>?0?)??
  • ????portSTACK_TYPE?*pxEndOfStack;?????????????????????????/*?Used?for?stack?overflow??
  • ?????????????????????????????????????????????????????????????checking?on?architectures?
  • ?????????????????????????????????????????????????????????????where?the?stack?grows?up?
  • ?????????????????????????????????????????????????????????????from?low?memory.?*/??
  • ??#endif??
  • ??
  • ??
  • ??#if?(?configUSE_MUTEXES?==?1?)??
  • ????unsigned?portBASE_TYPE?uxBasePriority;????????????????/*?The?priority?last??
  • ?????????????????????????????????????????????????????????????assigned?to?the?task?-??
  • ?????????????????????????????????????????????????????????????used?by?the?priority??
  • ?????????????????????????????????????????????????????????????inheritance?mechanism.?*/??
  • ??#endif??
  • ??
  • ??
  • }?tskTCB;??
  • ? ? TCB在pxStack里存儲(chǔ)堆棧的起始地址,以及在pxTopOfStack里存儲(chǔ)當(dāng)前堆棧的頂部。如果堆棧“向上”增長(zhǎng)到更高的地址,它還在pxEndOfStack存儲(chǔ)堆棧的結(jié)束的指針來檢查堆棧溢出。如果堆棧“向下”增長(zhǎng)到更低的地址,那么通過比較當(dāng)前堆棧的頂部與pxStack中的堆內(nèi)存起始位置來檢查溢出。
    ? ? TCB在uxPriority和uxBasePriority中存儲(chǔ)任務(wù)的初始優(yōu)先級(jí)。一個(gè)任務(wù)在它創(chuàng)建的時(shí)候被賦予優(yōu)先級(jí),同時(shí)任務(wù)的優(yōu)先級(jí)是可以被改變的。如果FreeRTOS實(shí)現(xiàn)了優(yōu)先級(jí)繼承,那么當(dāng)任務(wù)臨時(shí)提升到“繼承的”優(yōu)先級(jí)時(shí),它使用uxBasePriority去記住原來的優(yōu)先級(jí)。(優(yōu)先級(jí)繼承,請(qǐng)參見下面關(guān)于互斥的討論。)
    ? ? 每個(gè)任務(wù)有兩個(gè)清單項(xiàng)目給FreeRTOS操作系統(tǒng)的各種調(diào)度列表使用。當(dāng)一個(gè)任務(wù)被插入到FreeRTOS的一個(gè)列表中,不會(huì)直接向TCB插入一個(gè)指針。取而代之的是,它向TCB的xGenericListItem或xEventListItem插入一個(gè)指針。這些xListItem變量,比起若是僅僅獲得一個(gè)指向TCB的指針來說,讓FreeRTOS的列表變得更加靈活。
    ? ? 任務(wù)可以在以下四種狀態(tài)之一:運(yùn)行,準(zhǔn)備運(yùn)行,掛起或阻塞。你可能希望每個(gè)任務(wù)都有一個(gè)變量來告訴FreeRTOS它正處于什么狀態(tài),但事實(shí)上并非如此。相反,FreeRTOS通過把任務(wù)放入相應(yīng)的列表:就緒列表,掛起列表等,隱式地跟蹤任務(wù)狀態(tài)。隨著任務(wù)的變化,從一個(gè)狀態(tài)到另一個(gè),FreeRTOS的只是簡(jiǎn)單的將它從一個(gè)列表移動(dòng)到另一個(gè)。
    ??? 任務(wù)設(shè)置
    ? ? 我們已經(jīng)觸及如何利用pxReadyTasksLists數(shù)組來選擇和調(diào)度一個(gè)任務(wù)的;現(xiàn)在讓我們來看一看一個(gè)任務(wù)最初是如何被創(chuàng)建的。當(dāng)xTaskCreate()函數(shù)被調(diào)用的時(shí)候,一個(gè)任務(wù)被創(chuàng)建。FreeRTOS為一個(gè)任務(wù)新分配一個(gè)TCB對(duì)象,來記錄它的名稱,優(yōu)先級(jí),和其他細(xì)節(jié),接著分配用戶請(qǐng)求的總的堆棧(假設(shè)有足夠使用的內(nèi)存)和在TCB的pxStack成員中記錄堆內(nèi)存的開始。
    ? ? 堆棧被初始化看起來就像一個(gè)已經(jīng)在運(yùn)行的新任務(wù)被上下文切換所中斷。這就是任務(wù)調(diào)度處理最新創(chuàng)建的任務(wù)的方法,同樣也是處理運(yùn)行了一段時(shí)間的任務(wù)的方法;任務(wù)調(diào)度在不需要任何特殊(case)代碼的情況下去處理新的任務(wù)。
    ? ? 任務(wù)的堆棧建立看起來像是它通過上下文切換來被中斷,這個(gè)方法是取決于FreeRTOS正在運(yùn)行的架構(gòu),但這個(gè)ARM Cortex-M3處理器的實(shí)現(xiàn)是一個(gè)很好的例子:
    [cpp]?view plaincopy
  • unsigned?int?*pxPortInitialiseStack(?unsigned?int?*pxTopOfStack,???
  • ?????????????????????????????????????pdTASK_CODE?pxCode,??
  • ?????????????????????????????????????void?*pvParameters?)??
  • {??
  • ??/*?Simulate?the?stack?frame?as?it?would?be?created?by?a?context?switch?interrupt.?*/??
  • ??pxTopOfStack--;?/*?Offset?added?to?account?for?the?way?the?MCU?uses?the?stack?on??
  • ?????????????????????entry/exit?of?interrupts.?*/??
  • ??*pxTopOfStack?=?portINITIAL_XPSR;??/*?xPSR?*/??
  • ??pxTopOfStack--;??
  • ??*pxTopOfStack?=?(?portSTACK_TYPE?)?pxCode;??/*?PC?*/??
  • ??pxTopOfStack--;??
  • ??*pxTopOfStack?=?0;??/*?LR?*/??
  • ??pxTopOfStack?-=?5;??/*?R12,?R3,?R2?and?R1.?*/??
  • ??*pxTopOfStack?=?(?portSTACK_TYPE?)?pvParameters;??/*?R0?*/??
  • ??pxTopOfStack?-=?8;??/*?R11,?R10,?R9,?R8,?R7,?R6,?R5?and?R4.?*/??
  • ??
  • ??return?pxTopOfStack;??
  • }??
  • ? ? 當(dāng)一個(gè)任務(wù)被中斷的時(shí)候,ARM Cortex-M3處理器就壓寄存器入堆棧。pxPortInitialiseStack()修改堆棧使之看來像是即便任務(wù)實(shí)際上還未開始運(yùn)行,寄存器就已經(jīng)被壓入了。已知的值被存儲(chǔ)到堆棧,賦給ARM寄存器xPSR,PC,LR,和R0。剩余的寄存器R1-R12獲得由棧頂指針遞減分配給它們的寄存器空間,但沒有具體的數(shù)據(jù)存儲(chǔ)在這些寄存器堆棧內(nèi)。ARM架構(gòu)告訴我們那些寄存器在復(fù)位的時(shí)候未被定義,所以一個(gè)(非弱智的)程序?qū)⒉灰蕾囉谝阎闹怠?br /> ? ? 堆棧準(zhǔn)備好后,任務(wù)幾乎是同時(shí)準(zhǔn)備運(yùn)行。首先,FreeRTOS禁用中斷:我們將開始使用就緒列表和其他任務(wù)調(diào)度的數(shù)據(jù)結(jié)構(gòu),同時(shí)我們不希望它們被其他人背著我們私底下修改。
    ? ? 如果這是被創(chuàng)建的第一個(gè)任務(wù),FreeRTOS將初始化調(diào)度的任務(wù)列表。FreeRTOS操作系統(tǒng)的調(diào)度有一個(gè)就緒列表的數(shù)組,pxReadyTasksLists [],為每一個(gè)可能的優(yōu)先級(jí)提供一個(gè)就緒列表。FreeRTOS也有一些其他的列表用來跟蹤任務(wù)的掛起,終止和延時(shí)。現(xiàn)在這些也都是初始化的。
    ? ? 任何第一次初始化完成后,新的任務(wù)以它指定的優(yōu)先級(jí)被加入就緒列表。中斷被重新啟用,同時(shí)新任務(wù)的創(chuàng)建完成。
    3.5. 列表
    ? ? 任務(wù)之后,最常用的FreeRTOS數(shù)據(jù)結(jié)構(gòu)是列表。FreeRTOS使用列表結(jié)構(gòu)來跟蹤調(diào)度任務(wù),并執(zhí)行隊(duì)列。



    ? ? 這個(gè)FreeRTOS的列表是一個(gè)有著幾個(gè)有趣的補(bǔ)充的標(biāo)準(zhǔn)循環(huán)雙鏈表。下面就是列表元素:

    [cpp]?view plaincopy
  • struct?xLIST_ITEM??
  • {??
  • ??portTickType?xItemValue;???????????????????/*?The?value?being?listed.??In?most?cases?
  • ????????????????????????????????????????????????this?is?used?to?sort?the?list?in??
  • ????????????????????????????????????????????????descending?order.?*/??
  • ??volatile?struct?xLIST_ITEM?*?pxNext;???????/*?Pointer?to?the?next?xListItem?in?the??
  • ????????????????????????????????????????????????list.??*/??
  • ??volatile?struct?xLIST_ITEM?*?pxPrevious;???/*?Pointer?to?the?previous?xListItem?in??
  • ????????????????????????????????????????????????the?list.?*/??
  • ??void?*?pvOwner;????????????????????????????/*?Pointer?to?the?object?(normally?a?TCB)?
  • ????????????????????????????????????????????????that?contains?the?list?item.??There?is?
  • ????????????????????????????????????????????????therefore?a?two-way?link?between?the??
  • ????????????????????????????????????????????????object?containing?the?list?item?and??
  • ????????????????????????????????????????????????the?list?item?itself.?*/??
  • ??void?*?pvContainer;????????????????????????/*?Pointer?to?the?list?in?which?this?list?
  • ????????????????????????????????????????????????item?is?placed?(if?any).?*/??
  • };??
  • ? ? 每個(gè)元素持有一個(gè)數(shù)字,xItemValue,這通常是一個(gè)被跟蹤的任務(wù)優(yōu)先級(jí)或者是一個(gè)調(diào)度事件的計(jì)時(shí)器值。列表保存從高到低的優(yōu)先級(jí)指令,這意味著最高的優(yōu)先級(jí)xItemValue(最大數(shù))在列表的最前端,而最低的優(yōu)先級(jí)xItemValue(最小數(shù))在列表的末尾。
    pxNext和pxPrevious指針是標(biāo)準(zhǔn)鏈表指針。pvOwner 列表元素所有者的指針。這通常是任務(wù)的TCB對(duì)象的指針。pvOwner被用來在vTaskSwitchContext()中加快任務(wù)切換:當(dāng)最高優(yōu)先級(jí)任務(wù)元素在pxReadyTasksLists[]中被發(fā)現(xiàn),這個(gè)列表元素的pvOwner指針直接連接到需要任務(wù)調(diào)度的TCB。

    ? ? pvContainer指向自己所在的這個(gè)列表。若列表項(xiàng)處于一個(gè)特定列表它被用作快速終止。任意列表元素可以被置于一個(gè)列表,如下所定義:

    [cpp]?view plaincopy
  • typedef?struct?xLIST??
  • {??
  • ??volatile?unsigned?portBASE_TYPE?uxNumberOfItems;??
  • ??volatile?xListItem?*?pxIndex;???????????/*?Used?to?walk?through?the?list.??Points?to?
  • ?????????????????????????????????????????????the?last?item?returned?by?a?call?to??
  • ?????????????????????????????????????????????pvListGetOwnerOfNextEntry?().?*/??
  • ??volatile?xMiniListItem?xListEnd;????????/*?List?item?that?contains?the?maximum??
  • ?????????????????????????????????????????????possible?item?value,?meaning?it?is?always?
  • ?????????????????????????????????????????????at?the?end?of?the?list?and?is?therefore??
  • ?????????????????????????????????????????????used?as?a?marker.?*/??
  • }?xList;??
  • ? ? 列表的大小任何時(shí)候都是被存儲(chǔ)在uxNumberOfItems中,用于快速列表大小操作。所有的列表都被初始化為容納一個(gè)元素:xListEnd元素。xListEnd.xItemValue是一個(gè)定點(diǎn)值,當(dāng)portTickType是16位數(shù)時(shí),它等于xItemValue變量的最大值:0xffff,portTickType是32位數(shù)時(shí)為0xffffffff。其他的列表元素也可以使用相同的值;插入算法保證了xListEnd總是列表項(xiàng)中最后一個(gè)值。
    自列表從高到低排序后,xListEnd被用作列表開始的記號(hào)。并且,自循環(huán)開始,xListEnd也被用作列表結(jié)束的記號(hào)。
    ? ? 你也許可以用一個(gè)單獨(dú)的for()循環(huán)或者是函數(shù)調(diào)用來訪問大多數(shù)“傳統(tǒng)的”列表,去做所有的工作,就像這樣:

    [cpp]?view plaincopy
  • for?(listPtr?=?listStart;?listPtr?!=?NULL;?listPtr?=?listPtr->next)?{??
  • ??//?Do?something?with?listPtr?here...??
  • }??
  • ? ? 并且返回pxIndex。(當(dāng)然它也會(huì)正確檢測(cè)列尾環(huán)繞。)這種,當(dāng)執(zhí)行遍歷的時(shí)候使用pxIndex,由列表自己負(fù)責(zé)跟蹤“在哪里”的方法,使FreeRTOS可以休息而不用關(guān)心這方面的事。

    圖3.4:系統(tǒng)節(jié)拍計(jì)時(shí)器下的FreeRTOS就緒列表全貌
    FreeRTOS經(jīng)常需要通過多個(gè)for()和while()循環(huán),也包括函數(shù)調(diào)用來訪問列表,因此它使用操縱pxIndex指針的列表函數(shù)來遍歷這個(gè)列表。這個(gè)列表函數(shù)listGET_OWNER_OF_NEXT_ENTRY()執(zhí)行pxIndex = pxIndex->pxNext;pxReadyTasksLists[]列出了在vTaskSwitchContext()中已經(jīng)操縱完成的內(nèi)容,是如何使用pxIndex的一個(gè)很好的例子。讓我們假設(shè)我們僅有一個(gè)優(yōu)先級(jí),優(yōu)先級(jí)0,并且有三個(gè)任務(wù)在此優(yōu)先級(jí)上。這與我們之前看到的基本就緒列表圖相似,但這一次我們將包括所有的數(shù)據(jù)結(jié)構(gòu)和字段。
    就如你在圖3.3中所見,pxCurrentTCB顯示我們當(dāng)前正在運(yùn)行任務(wù)B。下一個(gè)時(shí)刻,vTaskSwitchContext()運(yùn)行,它調(diào)用listGET_OWNER_OF_NEXT_ENTRY()載入下一個(gè)任務(wù)來運(yùn)行。如圖3.4所示,這個(gè)函數(shù)使用pxIndex->pxNext找出下一個(gè)任務(wù)是任務(wù)C,并且pxIndex指向任務(wù)C的列表元素,同時(shí)pxCurrentTCB指向任務(wù)C的TCB。
    ? ? 請(qǐng)注意,每個(gè)struct xlistitem對(duì)象實(shí)際上都是來自相關(guān)TCB的xGenericListItem對(duì)象。
    3.6. 隊(duì)列
    ? ? FreeRTOS允許任務(wù)使用隊(duì)列來互相間通信和同步。中斷服務(wù)程序(ISRs)同樣使用隊(duì)列來通信和同步。
    ? ? 基本隊(duì)列數(shù)據(jù)結(jié)構(gòu)如下:
    [cpp]?view plaincopy
  • typedef?struct?QueueDefinition??
  • {??
  • ??signed?char?*pcHead;??????????????????????/*?Points?to?the?beginning?of?the?queue??
  • ???????????????????????????????????????????????storage?area.?*/??
  • ??signed?char?*pcTail;??????????????????????/*?Points?to?the?byte?at?the?end?of?the??
  • ???????????????????????????????????????????????queue?storage?area.?One?more?byte?is??
  • ???????????????????????????????????????????????allocated?than?necessary?to?store?the??
  • ?????????????????????????????????????????????queue?items;?this?is?used?as?a?marker.?*/??
  • ??signed?char?*pcWriteTo;???????????????????/*?Points?to?the?free?next?place?in?the??
  • ???????????????????????????????????????????????storage?area.?*/??
  • ??signed?char?*pcReadFrom;??????????????????/*?Points?to?the?last?place?that?a?queued??
  • ???????????????????????????????????????????????item?was?read?from.?*/??
  • ??
  • ??
  • ??xList?xTasksWaitingToSend;????????????????/*?List?of?tasks?that?are?blocked?waiting??
  • ???????????????????????????????????????????????to?post?onto?this?queue.??Stored?in??
  • ???????????????????????????????????????????????priority?order.?*/??
  • ??xList?xTasksWaitingToReceive;?????????????/*?List?of?tasks?that?are?blocked?waiting??
  • ???????????????????????????????????????????????to?read?from?this?queue.?Stored?in??
  • ???????????????????????????????????????????????priority?order.?*/??
  • ??
  • ??
  • ??volatile?unsigned?portBASE_TYPE?uxMessagesWaiting;??/*?The?number?of?items?currently?
  • ?????????????????????????????????????????????????????????in?the?queue.?*/??
  • ??unsigned?portBASE_TYPE?uxLength;????????????????????/*?The?length?of?the?queue??
  • ?????????????????????????????????????????????????????????defined?as?the?number?of??
  • ?????????????????????????????????????????????????????????items?it?will?hold,?not?the??
  • ?????????????????????????????????????????????????????????number?of?bytes.?*/??
  • ??unsigned?portBASE_TYPE?uxItemSize;??????????????????/*?The?size?of?each?items?that??
  • ?????????????????????????????????????????????????????????the?queue?will?hold.?*/??
  • ??
  • ??
  • }?xQUEUE;??
  • ? ? 這是一個(gè)頗為標(biāo)準(zhǔn)的隊(duì)列,不但包括了頭部和尾部指針,而且指針指向我們剛剛讀過或者寫過的位置。
    ? ? 當(dāng)剛剛創(chuàng)建一個(gè)隊(duì)列,用戶指定了隊(duì)列的長(zhǎng)度和需要隊(duì)列跟蹤的項(xiàng)目大小。pcHead和pcTail被用來跟蹤隊(duì)列的內(nèi)部存儲(chǔ)器。加入一個(gè)項(xiàng)目到隊(duì)列就對(duì)隊(duì)列內(nèi)部存儲(chǔ)器進(jìn)行一次深拷貝。
    ? ? FreeRTOS用深拷貝替代在項(xiàng)目中存放一個(gè)指針是因?yàn)橛锌赡茼?xiàng)目插入的生命周期要比隊(duì)列的生命周期短。例如,試想一個(gè)簡(jiǎn)單的整數(shù)隊(duì)列使用局部變量,跨幾個(gè)函數(shù)調(diào)用的插入和刪除。如果這個(gè)隊(duì)列在局部變量里存儲(chǔ)這些整數(shù)的指針,當(dāng)整數(shù)的局部變量離開作用域時(shí)指針將會(huì)失效,同時(shí)局部變量的存儲(chǔ)空間將被新的數(shù)值使用。
    ? ? 什么需要用戶選擇使用隊(duì)列。若內(nèi)容很少,用戶可以把復(fù)制的內(nèi)容進(jìn)行排列,就像上圖中簡(jiǎn)單整數(shù)的例子,或者,若內(nèi)容很多,用戶可以排列內(nèi)容的指針。請(qǐng)注意,在這兩種情況下FreeRTOS都是在做深拷貝:如果用戶選擇排列復(fù)制的內(nèi)容,那么這個(gè)隊(duì)列存儲(chǔ)了每項(xiàng)內(nèi)容的一份深拷貝;如果用戶選擇了排列指針,隊(duì)列存儲(chǔ)了指針的一份深拷貝。當(dāng)然,用戶在隊(duì)列里存儲(chǔ)了指針,那么用戶有責(zé)任管理與內(nèi)存相關(guān)的指針。隊(duì)列并不關(guān)心你存儲(chǔ)了什么樣的數(shù)據(jù),它只需要知道數(shù)據(jù)的大小。
    ? ? FreeRTOS支持阻塞和非阻塞隊(duì)列的插入和移除。非阻塞隊(duì)列操作會(huì)立即返回"隊(duì)列的插入是否完成?"或者 "隊(duì)列的移除是否完成?"的狀態(tài)。阻塞操作則根據(jù)特定的超時(shí)。一個(gè)任務(wù)可以無限期地阻塞或者在有限時(shí)間里阻塞。
    ? ? 一個(gè)阻塞任務(wù)——叫它任務(wù)A——將保持阻塞只要它的插入/移除操作沒有完成,并且它的超時(shí)(如果存在)沒有過期。如果一個(gè)中斷或者另一個(gè)任務(wù)編輯了這個(gè)隊(duì)列以便任務(wù)A的操作能夠完成,任務(wù)A將被解除阻塞。如果此時(shí)任務(wù)A的隊(duì)列操作仍然是允許的,那么它實(shí)際上會(huì)執(zhí)行操作,于是任務(wù)A會(huì)完成它的隊(duì)列操作,并且返回“成功”的狀態(tài)。不過,任務(wù)A正在執(zhí)行的那個(gè)時(shí)間,有可能同時(shí)有一個(gè)高優(yōu)先級(jí)任務(wù)或者中斷也在同一個(gè)隊(duì)列上執(zhí)行另一個(gè)操作,這會(huì)阻止任務(wù)A正在執(zhí)行的操作。在這種情況下任務(wù)A將檢查它的超時(shí),同時(shí),如果它未超時(shí)就恢復(fù)阻塞,否則就返回隊(duì)列操作“失敗”的狀態(tài)。
    ? ? 特別需要注意的是,當(dāng)任務(wù)被阻塞在一個(gè)隊(duì)列時(shí),系統(tǒng)保持運(yùn)行所帶來的風(fēng)險(xiǎn);以及當(dāng)任務(wù)被阻塞在一個(gè)隊(duì)列時(shí),有其他任務(wù)或中斷在繼續(xù)運(yùn)行。這種阻塞任務(wù)的方法能不浪費(fèi)CPU周期,使其他任務(wù)和中斷可以有效地使用CPU周期。
    ? ? FreeRTOS使用xTasksWaitingToSend列表來保持對(duì)正阻塞在插入隊(duì)列里的任務(wù)的跟蹤。每當(dāng)有一個(gè)元素被移出隊(duì)列,xTasksWaitingToSend列表就會(huì)被檢查。如果有個(gè)任務(wù)在那個(gè)列表中等待,那個(gè)是未阻塞任務(wù)。同樣的,xTasksWaitingToReceive保持對(duì)那些正阻塞在移除隊(duì)列里的任務(wù)的跟蹤。每當(dāng)有一個(gè)新元素被插入到隊(duì)列,xTasksWaitingToReceive列表就會(huì)被檢查。如果有個(gè)任務(wù)在那個(gè)列表中等待,那個(gè)是未阻塞任務(wù)。
    ??? 信號(hào)燈和互斥
    ? ? FreeRTOS使用它的隊(duì)列與任務(wù)通信,也在任務(wù)間通信。FreeRTOS也使用它的隊(duì)列來實(shí)現(xiàn)信號(hào)燈與互斥。
    ??? 有什么區(qū)別?
    ? ? 信號(hào)燈與互斥聽上去像一回事,但它們不是。FreeRTOS同樣地實(shí)現(xiàn)了它們,但本來它們以不同的方式被使用。它們是如何不同地被使用?嵌入式系統(tǒng)宗師Michael Barr說這是在他文章中寫得最好的,“信號(hào)燈與互斥揭秘”:
    ? ? The correct use of a semaphore is for signaling from one task to another. A mutex is meant to be taken and released, always in that order, by each task that uses the shared resource it protects. By contrast, tasks that use semaphores either signal ["send" in FreeRTOS terms] or wait ["receive" in FreeRTOS terms] - not both.
    ? ? 正確使用的一個(gè)信號(hào)是從一個(gè)任務(wù)向另一個(gè)發(fā)信號(hào)。從每個(gè)使用被保護(hù)共享資源的任務(wù)來看,總是認(rèn)為,一個(gè)互斥意味著獲得和釋放。相比之下,使用信號(hào)燈的任務(wù)不是發(fā)信號(hào)[在FreeRTOS里“發(fā)送”]就是在等信號(hào)[在FreeRTOS里“接收”]——不能同時(shí)。
    ? ? 互斥被用來保護(hù)共享資源。一個(gè)使用共享資源的任務(wù)獲得互斥,接著釋放互斥。當(dāng)有另一個(gè)任務(wù)占據(jù)互斥時(shí),沒有一個(gè)任務(wù)可以獲得這個(gè)互斥。這就是保證,在同一時(shí)刻僅有一個(gè)任務(wù)可以使用共享資源。
    ? ? 一個(gè)任務(wù)向另一個(gè)任務(wù)發(fā)信號(hào)時(shí)使用信號(hào)燈。以下引用Barr的文章:
    ? ? For example, Task 1 may contain code to post (i.e., signal or increment) a particular semaphore when the "power" button is pressed and Task 2, which wakes the display, pends on that same semaphore. In this scenario, one task is the producer of the event signal; the other the consumer.
    ? ? 舉例來說,任務(wù)一可能包含當(dāng)“電源”按鈕被按下時(shí),發(fā)布(即,發(fā)信號(hào)或增加信號(hào)量)一個(gè)特定的信號(hào)燈的代碼,并且喚醒顯示屏的任務(wù)二,取決于同一個(gè)信號(hào)燈。在這種情況下,一個(gè)任務(wù)是發(fā)信號(hào)事件的制造者;另一個(gè)是消費(fèi)者。
    ? ? 如果你是在信號(hào)燈和互斥有任何疑問,請(qǐng)查閱Michael的文章。
    ? ??實(shí)現(xiàn)
    ? ? FreeRTOS像隊(duì)列一樣來實(shí)現(xiàn)一個(gè)N元素的信號(hào)燈,這樣就可以控制N個(gè)項(xiàng)。它沒有去存儲(chǔ)隊(duì)列每項(xiàng)的任何實(shí)際數(shù)據(jù);信號(hào)燈只關(guān)心有多少在隊(duì)列的uxMessagesWaiting字段中被跟蹤的隊(duì)列記錄,目前正被占用。當(dāng)FreeRTOS的頭文件semphr.h調(diào)用它的時(shí)候,它正在做“純同步”。因此這個(gè)隊(duì)列有一個(gè)零字節(jié)的項(xiàng) (uxItemSize == 0)。每個(gè)信號(hào)燈uxMessagesWaiting字段遞增或遞減;沒有項(xiàng)或數(shù)據(jù)的復(fù)制是需要的。
    ? ? 同信號(hào)燈一樣,互斥也被實(shí)現(xiàn)為一個(gè)隊(duì)列,不過有幾個(gè)xQUEUE結(jié)構(gòu)字段被用#defines重載:
    /* Effectively make a union out of the xQUEUE structure. */
    #define uxQueueType ? ? ? ? ? pcHead
    #define pxMutexHolder ? ? ? ? pcTail
    ? ? 當(dāng)互斥沒有在隊(duì)列中存儲(chǔ)任何數(shù)據(jù)時(shí),它不需要任何內(nèi)部存儲(chǔ)器,同樣pcHead和pcTail字段也不需要。FreeRTOS設(shè)置uxQueueType字段(實(shí)際上的pcHead字段)為0來表明,這個(gè)隊(duì)列正在被一個(gè)互斥使用。FreeRTOS使用重載的pcTail字段來實(shí)現(xiàn)互斥的優(yōu)先級(jí)繼承。
    ? ? 萬一你不熟悉優(yōu)先級(jí)繼承,我將再次引用Michael Barr的話來定義它,這次是來自他的文章,“優(yōu)先級(jí)倒置”:
    [Priority inheritance] mandates that a lower-priority task inherit the priority of any higher-priority task pending on a resource they share. This priority change should take place as soon as the high-priority task begins to pend; it should end when the resource is released.
    ? ? [優(yōu)先級(jí)繼承]要求低優(yōu)先級(jí)任務(wù)繼承任何高優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí),取決于它們共享的資源。這個(gè)優(yōu)先級(jí)的改變應(yīng)當(dāng)在高優(yōu)先級(jí)任務(wù)一開始掛起時(shí)就發(fā)生;資源被釋放時(shí)就結(jié)束。
    ? ? FreeRTOS使用pxMutexHolder字段(實(shí)際上是#define重載的pcTail字段)來實(shí)現(xiàn)優(yōu)先級(jí)繼承。FreeRTOS記錄在pxMutexHolder字段里包含一個(gè)互斥的任務(wù)。當(dāng)一個(gè)高優(yōu)先級(jí)任務(wù)正在等待一個(gè)由低優(yōu)先級(jí)任務(wù)取得的互斥,FreeRTOS“更新”低優(yōu)先級(jí)任務(wù)到高優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí),直至這個(gè)互斥再次可用。
    ??? 3.7. 結(jié)論
    ? ? 我們完成了對(duì)FreeRTOS架構(gòu)的一覽。希望你現(xiàn)在對(duì)于FreeRTOS的任務(wù)是如何執(zhí)行以及通信有一個(gè)好的感覺。如果之前你從未了解過操作系統(tǒng)的內(nèi)在,我希望現(xiàn)在你對(duì)于它們是如何工作的有一個(gè)基本的思路。
    ? ? 顯然,本章沒有覆蓋FreeRTOS架構(gòu)的全部。值得注意的是,我沒有提到的內(nèi)存分配,中斷服務(wù),調(diào)試,或MPU支持。本章也沒有討論如何設(shè)置或使用FreeRTOS。Richard Barry已經(jīng)寫了一本極好的書,使用FreeRTOS實(shí)時(shí)內(nèi)核:實(shí)用指南,這本書就是講這些內(nèi)容的;如果你要使用FreeRTOS的話,我強(qiáng)烈推薦它。
    ? ? 3.8. 致謝
    ? ? 我想感謝Richard Barry創(chuàng)造和維護(hù)了FreeRTOS,并選擇將它開源。在寫這一章的時(shí)候Richard給予了極大的幫助,提供了關(guān)于FreeRTOS的歷史以及非常有價(jià)值的技術(shù)回顧。
    ? ? 也感謝Amy Brown和Greg Wilson共同拉動(dòng)這整個(gè)AOSA的事情。
    ? ? 最后也是最(最多),感謝我的妻子Sarah共同承擔(dān)了我對(duì)本章的研究和寫作。幸運(yùn)的是,她在嫁給我的時(shí)候就知道我是一名極客。



    0
    0

    參考知識(shí)庫

    Linux知識(shí)庫

    11927關(guān)注|3974收錄

    操作系統(tǒng)知識(shí)庫

    5974關(guān)注|2210收錄

    嵌入式開發(fā)知識(shí)庫

    4912關(guān)注|2734收錄

    算法與數(shù)據(jù)結(jié)構(gòu)知識(shí)庫

    16149關(guān)注|2320收錄

    大型網(wǎng)站架構(gòu)知識(shí)庫

    8708關(guān)注|708收錄

    猜你在找
    自己動(dòng)手從0到1寫嵌入式操作系統(tǒng)
    嵌入式ARM體系結(jié)構(gòu)及Bootloader開發(fā)
    ARM裸機(jī)程序開發(fā)入門
    ARM那些你得知道的事兒-1.1.ARM裸機(jī)第一部分視頻課程
    嵌入式工程師養(yǎng)成計(jì)劃之——嵌入式軟件工程師完全學(xué)習(xí)指南
    FreeRTOS的任務(wù)調(diào)度算法優(yōu)化實(shí)現(xiàn)
    FreeRTOS之配置詳解裁剪FreeRTOSConfigh
    FreeRTOS代碼剖析之1內(nèi)存管理Heap_1c
    FreeRTOS時(shí)鐘配置Cortex-M3
    深入理解FreeRTOS的任務(wù)機(jī)制和消息隊(duì)列+附完整項(xiàng)目代碼
    關(guān)閉

    總結(jié)

    以上是生活随笔為你收集整理的FreeRtos 那点事的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    国产精品视频不卡 | 亚洲码国产日韩欧美高潮在线播放 | 欧美一区二区在线刺激视频 | 91九色porn在线资源 | 在线观看黄色av | 激情五月在线 | 欧美性大胆 | 亚洲手机av| 综合久久婷婷 | 国产精品久久久久永久免费 | 日日夜夜操av | 久久久久北条麻妃免费看 | 亚洲精品字幕在线观看 | 亚州国产视频 | 婷婷激情在线观看 | www.久久久| 在线免费观看黄色小说 | 久久久精品福利视频 | 国产精品99免视看9 国产精品毛片一区视频 | a电影免费看 | 国产精品大片在线观看 | 国产在线 一区二区三区 | 欧美日韩久 | 成人av在线观 | 毛片永久新网址首页 | 色av网站| a天堂免费 | 欧美精品国产综合久久 | 操久久免费视频 | 国产免费叼嘿网站免费 | 色av色av色av | 亚洲精品国偷拍自产在线观看 | 国产亚洲欧美在线视频 | 人人揉人人揉人人揉人人揉97 | 久草视频中文在线 | 久久久久久久久久久网站 | 亚洲欧美视频在线观看 | 中文字幕的| 久久久久亚洲精品成人网小说 | 国产永久免费观看 | www视频在线播放 | 激情网色 | 国产成人专区 | 丁香色综合 | 亚州激情视频 | 国产电影黄色av | 蜜臀久久99精品久久久久久网站 | 国产精品美女久久 | 国产精品私人影院 | 亚洲一区精品二人人爽久久 | 欧美精品一区二区在线播放 | 99久久精品国产亚洲 | 亚洲精品一区二区久 | 欧美性久久久 | 成人黄大片| 免费在线观看视频a | 一级黄色片在线观看 | 久青草国产在线 | 精品国产成人av | 在线观看一级视频 | 丁香婷婷激情网 | 久久国产精品99久久人人澡 | 日本午夜在线亚洲.国产 | 天天天天干| 久久综合狠狠综合久久狠狠色综合 | 国产亚洲精品美女久久 | 香蕉免费| 欧美日产在线观看 | 丁香九月婷婷 | 伊人中文字幕在线 | 国产视频一区二区在线观看 | 美女网站黄在线观看 | 久久久精品国产一区二区 | 久久欧洲视频 | 五月婷丁香 | 午夜精品久久久久久久99无限制 | 久久草草热国产精品直播 | 一区二区三区在线观看 | 91资源在线视频 | 国产成人精品一区二区三区免费 | 麻豆国产精品一区二区三区 | 91高清完整版在线观看 | 久久精品九色 | 91久久久久久国产精品 | 日韩视频一区二区在线观看 | 成年人在线免费看视频 | 在线观看日韩中文字幕 | 国产精品免费不卡 | 天天操比| 婷婷在线看 | 欧美一级片在线观看视频 | 色综合久久精品 | 在线a视频免费观看 | 一区二区三区免费 | 日韩激情小视频 | 国产精品一区二区三区在线看 | 国产免费三级在线观看 | 麻豆传媒视频在线免费观看 | 久久久久国产精品午夜一区 | 在线亚洲人成电影网站色www | 免费看的国产视频网站 | 午夜精品电影一区二区在线 | 色全色在线资源网 | 免费福利在线播放 | 99人久久精品视频最新地址 | 精品亚洲二区 | 亚洲永久国产精品 | 国产精品福利午夜在线观看 | 欧美日本不卡高清 | 亚洲精品国产精品国自产观看 | 欧美日韩中字 | 97在线观看免费 | 亚洲乱亚洲乱妇 | 国产另类xxxxhd高清 | 国产日韩欧美综合在线 | 日韩精品一区二区三区视频播放 | 国产精品网站 | 日本丶国产丶欧美色综合 | 91成人区| 999一区二区三区 | 精品国产美女在线 | 国产精品亚洲片在线播放 | 久久综合色8888 | 精品国产乱码久久久久久1区二区 | 国产香蕉视频在线观看 | 成人小电影在线看 | 蜜臀精品久久久久久蜜臀 | 亚洲免费在线观看视频 | 九九视频在线 | 天天色欧美 | 天天干天天玩天天操 | 久久久精品日本 | 97国产精品亚洲精品 | 免费十分钟| 成人v | 天天做天天爽 | 操操色 | av大全在线观看 | 成年人免费电影 | 久久福利国产 | 日韩高清av在线 | 插综合网| 婷婷播播网| 麻豆av一区二区三区在线观看 | 国产成人av一区二区三区在线观看 | 国产专区一 | 成人教育av | 日韩精品在线一区 | 天天操天天添天天吹 | 色噜噜狠狠狠狠色综合 | 精品久久久成人 | 毛片网站在线观看 | 久久精品中文 | 91热| 91人人视频在线观看 | 在线免费黄色 | 色七七亚洲影院 | 国产精品久久久久久久久久妇女 | 视频一区二区三区视频 | av成人在线观看 | 日韩高清不卡在线 | 五月天婷婷在线观看视频 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 久久综合五月天 | 久久精品中文视频 | 久久久久亚洲最大xxxx | 97日日碰人人模人人澡分享吧 | 2021av在线| 日日爽天天操 | 最新高清无码专区 | 97超碰超碰| 亚洲国产片色 | 狠狠操精品 | 日日夜夜精品视频天天综合网 | 狠狠的干 | 丁香婷婷久久久综合精品国产 | 丁香久久婷婷 | 日韩av在线不卡 | 久久不见久久见免费影院 | 狠狠做深爱婷婷综合一区 | 国内精品亚洲 | 国产精品免费看久久久8精臀av | 92国产精品久久久久首页 | 久久大香线蕉app | 国产最新在线观看 | 国产中文字幕在线观看 | 波多野结衣视频一区二区三区 | 毛片网站在线 | 九九精品无码 | 97综合在线 | 亚洲欧美婷婷六月色综合 | 九九视频免费 | 久久精品一二三 | 91看片一区二区三区 | 永久免费观看视频 | 97免费在线观看视频 | 色视频网页 | 国产精在线 | 视频在线99| 黄色免费观看网址 | 天天视频亚洲 | 国产精品久久久久久久久久久久午 | 在线不卡a | 日日夜夜精品免费观看 | 91在线精品播放 | 97色婷婷 | 亚洲精品久久久蜜桃直播 | 日韩在线免费高清视频 | 丁香六月五月婷婷 | 中文字幕av免费在线观看 | 久久av伊人 | 五月天电影免费在线观看一区 | 国产香蕉久久精品综合网 | 免费在线日韩 | 日韩欧美高清一区二区 | 伊人天堂网 | 97国产在线视频 | 国产亚洲精品久久 | 国产热re99久久6国产精品 | 久久久国产精品免费 | 国产一区二区三区在线 | 91久久国产精品 | 中文字幕高清av | 天天操天天干天天操天天干 | 日韩精品免费在线观看视频 | 国产一区二区三区免费在线观看 | 亚洲欧美激情插 | 亚洲网站在线 | 91精品国产99久久久久久红楼 | 成人久久18免费 | 精品成人网 | 精品国产一二三 | 久久久久影视 | 天天爱av导航 | 日韩视频一区二区 | 最近日韩中文字幕中文 | 亚洲va欧洲va国产va不卡 | 国产又黄又爽又猛视频日本 | 婷婷激情综合 | 亚洲综合五月 | 亚洲精品乱码久久久久久9色 | 最新99热| 久久精品草 | 日韩免费观看av | 麻豆91网站 | 999国内精品永久免费视频 | 久草在线免费电影 | 欧美网站黄色 | 免费a v网站| 国产韩国精品一区二区三区 | 成年人在线免费看片 | 亚洲激情电影在线 | 天堂激情网 | 三级在线视频播放 | 亚洲人av免费网站 | 狠狠躁日日躁狂躁夜夜躁av | 久久午夜国产精品 | 美女视频黄免费 | 黄色大片免费网站 | 亚洲成人免费 | 久久国产精品免费一区二区三区 | 日韩成人精品在线观看 | 久久免费视频在线观看30 | 国产精品免费麻豆入口 | 国产精品ⅴa有声小说 | 国产高清专区 | 成人v| 欧美aa一级 | 午夜 在线 | 综合伊人av | 西西人体www444 | 狠狠色丁香婷婷综合久小说久 | 四虎国产视频 | 视色网站 | 日韩久久激情 | 久久蜜臀av| 久久久国内精品 | 国产精品九九久久久久久久 | 亚洲精品美女久久久 | 我要色综合天天 | 国产视频一区在线免费观看 | 日本99精品 | 91夫妻视频 | 69精品人人人人 | 国产黄色一级大片 | 最近最新最好看中文视频 | 欧美国产日韩在线观看 | 激情欧美一区二区三区 | 夜夜躁日日躁狠狠久久88av | 丰满少妇在线观看网站 | 天天做综合网 | 日韩三级av | 999热视频| 成人欧美日韩国产 | 国产成人av电影在线观看 | 亚洲国产伊人 | 日韩免费高清在线 | 十八岁以下禁止观看的1000个网站 | 日韩免费三区 | 日韩一二区在线观看 | 天天操天天艹 | 中文在线 | 久久综合久久综合久久 | 91丨九色丨国产丨porny精品 | 日本三级香港三级人妇99 | 18做爰免费视频网站 | 精品视频免费久久久看 | 日韩深夜在线观看 | 欧美激情视频免费看 | 精品不卡av | 波多野结衣精品视频 | 日韩国产高清在线 | 久久久国产精华液 | 国产精品久久久久久高潮 | 免费观看高清 | 伊人手机在线 | 天天干夜夜爽 | 久久九九精品久久 | 久久久久久久99精品免费观看 | 亚洲一区美女视频在线观看免费 | 日韩在线观看视频在线 | 国产成人av一区二区三区在线观看 | 天天干天天射天天爽 | 日韩欧美精品在线视频 | 国产成人一区二区三区免费看 | 日韩在线高清视频 | 国产91av视频在线观看 | 中文字幕制服丝袜av久久 | 国产精品久久一区二区无卡 | 婷婷精品在线视频 | 婷婷免费在线视频 | 激情五月婷婷 | 四虎国产精品成人免费影视 | 韩国在线视频一区 | 欧美天天综合网 | 欧美日韩调教 | 在线观看午夜 | 国产福利网站 | 探花视频网站 | 久久综合九色九九 | 91精品电影 | 日韩在线观看网址 | 日本h视频在线观看 | 久草精品免费 | 国产成人在线免费观看 | 国产精华国产精品 | www夜夜操 | 国模一二三区 | 麻豆传媒视频在线免费观看 | 国产精品自产拍在线观看桃花 | 中文av网 | 狠狠色香婷婷久久亚洲精品 | 精品国产一区二区三区蜜臀 | 成人蜜桃网| 国产成人精品一区二区三区免费 | 亚洲成人黄色网址 | 成人午夜电影免费在线观看 | 夜夜操综合网 | 欧美黄色成人 | 99精品在线免费在线观看 | 天天操人 | 精品久久91 | 黄色三级免费 | 精品伦理一区二区三区 | 久久精品在线免费观看 | 视频一区二区三区视频 | 在线观看视频免费大全 | 日韩免费小视频 | 日本中文字幕在线播放 | 日韩欧美精品一区 | 成人免费xxx在线观看 | 亚洲国产伊人 | 日韩特级黄色片 | 亚洲黄色片| 视频国产在线观看18 | 久久欧美在线电影 | 久久精品导航 | 97在线观视频免费观看 | 日本精品久久久一区二区三区 | a亚洲视频| 日韩中文幕 | 日本在线观看一区二区 | 少妇bbbb搡bbbb桶 | 国产精品12 | 日韩在线电影一区二区 | 五月综合激情 | 日日夜夜免费精品视频 | 三级大片网站 | 很污的网站 | 久久夜夜爽 | 国产一区二区三精品久久久无广告 | 久久69av| 人人爽人人做 | 午夜三级在线 | 欧美人zozo | 精品国产成人av | 夜夜干天天操 | 中文字幕久久精品亚洲乱码 | 91激情视频在线播放 | 欧美日韩高清免费 | 欧美激情精品一区 | 中文字幕亚洲五码 | 国产成人久久精品 | 国产91欧美 | 日本三级大片 | 香蕉视频网站在线观看 | 91在线免费公开视频 | 国产黄色成人av | 久久www免费视频 | 久久国产视频网 | 九九99| 在线视频 影院 | 欧美午夜a | 日日夜夜操av | .精品久久久麻豆国产精品 亚洲va欧美 | 日本在线观看中文字幕 | 日韩精品欧美一区 | av网址aaa | 成片人卡1卡2卡3手机免费看 | 草久在线播放 | 久久免费av电影 | 久久久久国产成人精品亚洲午夜 | 中文字幕在线观看视频一区 | 午夜私人影院 | 日韩一区二区免费在线观看 | 天堂av免费观看 | 国产黄色片一级 | 亚洲在线 | 一区二区久久久久 | 色先锋av资源中文字幕 | 国产精品久久久久久久久大全 | 在线观看视频在线观看 | 日韩黄色免费看 | 国产精品人人做人人爽人人添 | 色综合久久中文综合久久牛 | 亚洲精选视频在线 | 国产精品999久久久 久产久精国产品 | 美国av大片 | 亚洲第一香蕉视频 | 91.精品高清在线观看 | 久久视频中文字幕 | 青青草华人在线视频 | 国产精品久久久久久久久蜜臀 | 干干夜夜 | 91人人揉日日捏人人看 | 在线免费三级 | 日韩91在线 | 国产精品永久在线 | 国产在线观看你懂得 | 国产精品久久久久久久久久直播 | 91污在线 | 久草久草久草久草 | 天天干,天天射,天天操,天天摸 | 成人a级大片 | 美女黄频视频大全 | 激情欧美在线观看 | 国产一级免费观看视频 | 国产精品久久久久久久久软件 | 亚洲男女精品 | 四虎4hu永久免费 | 在线国产能看的 | 国产伦精品一区二区三区… | 在线天堂亚洲 | 国产精品18久久久久久首页狼 | 国产99久久精品一区二区永久免费 | 国产拍在线 | av中文字幕在线播放 | 成年人免费看片网站 | 国产手机在线观看 | 亚洲黄色免费网站 | 天天曰天天爽 | 日韩最新av | 色综合五月 | 久久久国产网站 | 99久久久久久国产精品 | 三级黄色片在线观看 | 91精品国产麻豆 | 五月婷婷影院 | 日韩精品一区二区免费视频 | 国产精品毛片一区二区 | 久草剧场 | 精品亚洲一区二区三区 | 久久影视中文字幕 | 一区二区三高清 | 91.dizhi永久地址最新 | 欧美久久久久久久久久久久 | 五月综合激情婷婷 | 在线看片一区 | 久久免费电影网 | 国产亚洲精品久久19p | 国产xxxx做受性欧美88 | 亚洲精品永久免费视频 | 久久免费视频在线观看 | 国产无遮挡又黄又爽在线观看 | 国产成人一二片 | 午夜少妇 | 日韩在线观看你懂的 | 亚洲一区精品二人人爽久久 | 国产精品99在线播放 | 国产在线黄色 | 国产欧美高清 | 亚洲 欧美 综合 在线 精品 | 粉嫩av一区二区三区四区五区 | 在线观看韩日电影免费 | ww亚洲ww亚在线观看 | 在线视频 国产 日韩 | 五月婷婷在线综合 | 久日视频| 97精品欧美91久久久久久 | 国产精品手机视频 | 国产一级免费观看 | 久久综合狠狠狠色97 | 伊人导航 | 久久久久久中文字幕 | 中文字幕在线播放第一页 | 四虎永久精品在线 | 亚洲精品免费在线观看 | 久久久久久久亚洲精品 | 91成人免费在线视频 | 免费看片在线观看 | 国精产品永久999 | 欧美网站黄色 | 天天做综合网 | 国产精品久久久久久久久久久久午夜 | 网站在线观看你们懂的 | 日本中文字幕久久 | 国产精品一级在线 | 91黄色在线看 | 国语自产偷拍精品视频偷 | 在线观看视频一区二区三区 | jizz欧美性9| 国产精品一区二区在线观看免费 | 大片网站久久 | www免费看 | 波多野结衣在线视频免费观看 | 99热在线看 | 国产拍在线 | 日韩欧美在线观看一区二区三区 | 成人久久精品视频 | 亚洲精品国产第一综合99久久 | 中文字幕在线不卡国产视频 | 久草视频一区 | 免费看的国产视频网站 | av一本久道久久波多野结衣 | 久久久亚洲国产精品麻豆综合天堂 | 欧美成人性战久久 | 色视频 在线 | 午夜 在线 | 激情五月av| 在线观看亚洲精品视频 | 黄色软件在线看 | 亚洲欧美国产日韩在线观看 | 亚洲一级影院 | 国产一区二区三区黄 | 天天操天天摸天天干 | 国产成人免费在线观看 | 91精品日韩 | 97视频在线观看网址 | 日韩视频 一区 | 国产三级午夜理伦三级 | 在线观看黄av | 国产成人99av超碰超爽 | 久热香蕉视频 | 国产精品久久久久毛片大屁完整版 | 99久久999久久久精玫瑰 | 国产精品va在线 | 婷婷久久一区二区三区 | 国产又黄又爽又猛视频日本 | 久久综合久久综合这里只有精品 | 99综合视频 | 久久久久久久久亚洲精品 | 亚洲精品免费在线观看 | 亚洲日日日 | 精品91在线 | 国产精品欧美精品 | 天天做日日爱夜夜爽 | 亚洲国产成人av网 | 国产精品美女在线观看 | 91热这里只有精品 | 国内揄拍国内精品 | 国产精品一区二区av影院萌芽 | 99久久精品免费看国产免费软件 | 伊人成人精品 | 久久免费公开视频 | 99久久一区| 天堂久色| 天堂av在线免费观看 | 欧美性极品xxxx做受 | 久久少妇免费视频 | 国产精华国产精品 | 国产中文欧美日韩在线 | 天天操天天干天天操天天干 | 69视频在线播放 | 色综合天天视频在线观看 | 天天舔夜夜操 | 亚洲 欧美变态 另类 综合 | 一级黄色电影网站 | 福利一区在线 | 亚洲综合成人在线 | 五月天国产 | 中文av一区二区 | 久久精品国产亚洲精品 | 首页av在线 | 在线看国产日韩 | 五月婷婷激情综合网 | 久久99亚洲精品久久 | 国产精品一二三 | 观看免费av | 91粉色视频| www.99在线观看 | 国产99久久久国产精品免费二区 | 日韩一区二区三免费高清在线观看 | 在线激情小视频 | www.com黄 | 亚洲午夜久久久综合37日本 | 国产一级黄色免费看 | 中文字幕一区二区三区四区在线视频 | 97电影网手机版 | 欧美大片在线观看一区 | 亚洲精品99久久久久中文字幕 | 日韩av免费大片 | 激情久久五月天 | 国产美女在线观看 | 久久69精品 | 日批网站免费观看 | 国产成人61精品免费看片 | 日韩欧美99 | 国产精品1区2区3区 久久免费视频7 | av丝袜在线 | 国产专区在线 | 久久综合精品国产一区二区三区 | 久草在线99| 国产99久久九九精品免费 | 欧美精品一区在线 | 国产一区二区日本 | 六月丁香伊人 | 99久久久久久久久 | 国产欧美在线一区 | 91成年人在线观看 | 久久久久欠精品国产毛片国产毛生 | 久久精品免费看 | 日韩三级久久 | 久久久久高清毛片一级 | 久热电影 | 欧美激情精品久久 | 天天综合狠狠精品 | 国产精品欧美精品 | 在线观看黄色小视频 | 亚洲成人免费在线观看 | 色资源在线观看 | 国语精品免费视频 | 一区二区不卡视频在线观看 | 干天天 | 日av免费| 亚洲最新在线视频 | 久久永久视频 | 欧美俄罗斯性视频 | 91在线观看视频网站 | 337p日本欧洲亚洲大胆裸体艺术 | 狠狠狠狠狠干 | 亚洲天堂社区 | 日韩精品免费在线观看 | 免费在线观看不卡av | 久热av在线 | 黄色在线观看免费 | 国产在线观看你懂得 | 天天爽夜夜爽精品视频婷婷 | 国产成人a v电影 | 成人黄大片视频在线观看 | 色一级片| 黄色在线观看网站 | 日韩午夜在线 | 久久久久亚洲国产 | 激情婷婷在线 | 国产精品视频专区 | 国产精品欧美日韩在线观看 | 精品久久一 | 日本久久片 | 狠狠狠狠狠狠操 | 国产精品久久久久久久久久免费 | 高清不卡免费视频 | 亚洲免费精品视频 | 国产精品 国产精品 | 亚洲精品国久久99热 | 最新av网址在线观看 | 久草视频在线免费看 | 国产一级视屏 | 玖玖在线精品 | 精品一二三区 | 久久免费在线观看视频 | 91九色视频| 免费福利片2019潦草影视午夜 | 2024国产精品视频 | 久久久18 | 色婷婷狠狠干 | 91大神免费视频 | 日本一区二区三区视频在线播放 | 国产精品白丝jk白祙 | 久久人人精 | 欧美精品久久人人躁人人爽 | 欧美成人亚洲 | 色播激情五月 | 在线观看成人福利 | 国产一区在线视频观看 | 在线观看aaa | 五月婷婷在线综合 | 亚洲在线不卡 | 国产九色在线播放九色 | 亚洲国产精品久久久久久 | 国产夫妻性生活自拍 | 日韩精品不卡 | 国产小视频福利在线 | www成人精品 | 国产精品久久久久久久免费大片 | 日本黄色一级电影 | 久久精品爱视频 | 国产成人精品一区二区三区福利 | 九九热视频在线 | 久久免费在线观看 | 国产精品久久久久久久久久久免费看 | 成人黄视频| 超黄视频网站 | www.久久视频 | 操操操操网| 日韩av中文字幕在线免费观看 | 国产黄在线 | 免费污片 | 久久国产精品视频 | 中文字幕精品视频 | 国产在线精品福利 | 国产综合在线视频 | 午夜久久久久久久久久影院 | wwwwww国产 | 狠狠五月天 | 成人羞羞视频在线观看免费 | 免费在线黄色av | 在线免费观看麻豆视频 | 久久一区二区三区超碰国产精品 | 国产在线观看免费 | 91免费网| 91热在线| 欧美日本三级 | a在线一区 | 久久久官网| 国产玖玖精品视频 | 久草在线免费在线观看 | 丁香五婷 | 精品一区二三区 | 久久99精品波多结衣一区 | 99精品国产福利在线观看免费 | 久久九九影视 | 日韩免费中文字幕 | 国产日韩欧美在线 | 色av资源网 | 五月婷婷综合网 | 久久艹久久 | 99视频导航 | 精品中文字幕在线观看 | 在线黄频 | 这里只有精品视频在线观看 | 综合色中文 | 中文字幕在线观看视频免费 | 午夜av免费 | 久久免费精彩视频 | 久久精品国产一区二区三区 | 国产字幕在线播放 | 欧美成人日韩 | 99久久婷婷国产 | 国内免费的中文字幕 | 日韩高清av在线 | 国产精品欧美激情在线观看 | 亚洲精品视频免费看 | 97狠狠操| 999在线精品 | 久要激情网 | 美女免费电影 | 久草视频在线免费播放 | 日韩a在线 | 麻豆传媒视频在线免费观看 | 亚洲在线观看av | 啪啪激情网| 日韩在线免费电影 | 成人高清av在线 | 免费看日韩片 | 日日碰狠狠添天天爽超碰97久久 | 天天躁日日躁狠狠 | 国产成人精品久久二区二区 | 国产亚洲欧美一区 | 欧美aa级| 91av在| 欧洲亚洲激情 | 久久人人爽人人爽人人片 | 最新高清无码专区 | 超碰97免费观看 | 国产成人一区二区三区影院在线 | 在线免费视频你懂的 | 中文字幕永久免费 | 麻豆视频成人 | 亚洲一区二区黄色 | 久久综合给合久久狠狠色 | 午夜av日韩 | 国产成人免费在线 | 久久精品xxx | 青青河边草免费视频 | 欧美一级高清片 | 欧美午夜精品久久久久久孕妇 | 国产一级视频免费看 | 日韩美女黄色片 | 97电院网手机版 | 丁香av在线 | 久久国产精品区 | 日本黄色免费大片 | 日本久久免费电影 | 精品国产成人 | 国产精品久久久久久久免费大片 | 久久久久亚洲精品国产 | 有码中文字幕在线观看 | 丁香 久久 综合 | 99色在线播放 | 成人xxxx | 精品成人免费 | 久久久久久久久久久影视 | 麻豆一二三精选视频 | 91网址在线看 | 福利视频一区二区 | 精品二区视频 | 三级av免费 | 日本性xxxxx 亚洲精品午夜久久久 | 亚洲性少妇性猛交wwww乱大交 | 九九免费精品视频在线观看 | 五月天亚洲综合 | 久久精品黄| 免费男女羞羞的视频网站中文字幕 | 在线观看视频亚洲 | 亚洲一区尤物 | 久久精品视频播放 | 激情婷婷色 | 91在线porny国产在线看 | 激情久久综合网 | 99久久久国产精品免费观看 | 久久久久久久久久久高潮一区二区 | 欧美日韩一区二区三区在线观看视频 | 97超碰在线久草超碰在线观看 | 国产美女主播精品一区二区三区 | 亚洲国产人午在线一二区 | 五月天,com | 视频二区在线 | 91一区二区三区久久久久国产乱 | 岛国片在线 | 黄色免费在线视频 | 国产精品久久久久久一区二区 | 亚洲精品国产精品乱码在线观看 | 欧美性做爰猛烈叫床潮 | 天天夜夜狠狠操 | 日韩一级片观看 | 人人爽人人爽人人爽人人爽 | 精品一二区 | 黄色影院在线观看 | 999久久国精品免费观看网站 | 在线播放国产精品 | 亚洲欧洲国产日韩精品 | 丁香激情综合久久伊人久久 | 成人观看视频 | 日本精油按摩3 | 九九三级毛片 | 亚洲伊人av | 国产最新91 | 久久久精品综合 | 久久人人爽爽人人爽人人片av | 三级黄色在线 | 久久久久99999| 免费观看视频的网站 | 亚洲国产成人精品电影在线观看 | 天堂网一区二区三区 | 亚洲综合在线观看视频 | 亚洲一级性 | av东方在线| 九九久久影院 | 毛片永久新网址首页 | 欧美a级片免费看 | 久久精品成人 | 成人在线观看免费 | 日本中文字幕一二区观 | 狠狠色狠狠色综合系列 | 国产精品婷婷午夜在线观看 | 香蕉久久久久久久 | av免费网站观看 | 波多野结衣视频一区 | 国产视频导航 | 免费国产黄线在线观看视频 | 婷婷色站 | 日本精品va在线观看 | www99久久 | 久草在线国产 | 2020天天干夜夜爽 | 亚洲精品久久久久久久不卡四虎 | 亚洲精品美女在线观看 | 一本一本久久a久久精品综合妖精 | 91精品网站 | 午夜精品影院 | 五月丁香| av黄色影院 | 久久精品国产亚洲精品 | 久久久黄视频 | 国产在线视频不卡 | 成人免费视频播放 | 日韩免费一级电影 | 国产乱码精品一区二区三区介绍 | 国产视频色 | av成人在线网站 | 不卡的av| 日韩av线观看 | 久久精品99国产精品亚洲最刺激 | 日韩欧美一区视频 | a午夜在线| 深爱开心激情 | 视频在线日韩 | 久久免费的精品国产v∧ | 黄色毛片在线 | 亚洲欧美偷拍另类 | 成人午夜免费剧场 | 国产精品毛片久久久久久久久久99999999 | 中文字幕韩在线第一页 | 97视频免费在线看 | 草久久久久 | 在线黄色毛片 | 午夜久久美女 | 成人一级在线观看 | 91精品国产麻豆国产自产影视 | 狠狠狠色丁香婷婷综合激情 | 五月天天色 | 日韩av电影中文字幕 | 国产打女人屁股调教97 | 91亚洲国产成人 | 亚洲mv大片欧洲mv大片免费 | 伊人久久av | 婷婷丁香激情网 | 久久人视频 | 久久久久久久久久久久久影院 | 久久激情五月婷婷 | 国产精品一区二区中文字幕 | 天天综合成人网 | 亚洲综合成人专区片 | 亚洲色图27p | 国产成人亚洲在线观看 | av中文字幕电影 | 97精品国产91久久久久久久 | 欧美性网站 | 日韩一区正在播放 | 黄色天堂在线观看 | 天天干天天操天天搞 | 欧美俄罗斯性视频 | 国产精品一区二区三区免费看 | 九九热在线免费观看 | 天天射一射 | 九九免费在线看完整版 | 国产黄色在线网站 | 国产 欧美 日产久久 | 免费看的国产视频网站 | 国产日韩中文字幕在线 | 亚洲经典视频在线观看 | 国产高清在线不卡 | 狠狠色丁香婷婷综合橹88 | 国产精品丝袜久久久久久久不卡 | 色先锋av资源中文字幕 | 色老板在线视频 | 午夜国产一区二区三区四区 | 99热这里只有精品国产首页 | 中文字幕在线播放视频 | 亚洲精品xx | 久久久久国产精品视频 | 久草精品在线 | 欧美另类一二三四区 | 成人av在线影视 | 超碰av在线免费观看 | 91女子私密保健养生少妇 | 日韩欧美一区二区三区免费观看 | 四虎永久免费 | 国产成人精品一区二区在线 | av在线免费在线观看 | 在线观看你懂的网址 | a级国产乱理论片在线观看 伊人宗合网 | 毛片的网址| 黄色一二级片 | 国产又黄又爽又猛视频日本 | 成人免费网站视频 | 国产精品女同一区二区三区久久夜 | 在线观看一级视频 | 免费看污污视频的网站 | 在线视频久| av中文字幕电影 | 欧美精品久久久久久久久久白贞 | 最近免费中文字幕大全高清10 | 中文字幕日韩免费视频 | 日韩视频a| 99这里只有久久精品视频 | 国产一区二区三区视频在线 | 日韩中文字幕免费在线播放 |