|
FreeRTOS中文使用教程(附件里面還有英文版):
0.png (129.26 KB, 下載次數(shù): 119)
下載附件
2018-10-3 02:17 上傳
0.png (82.64 KB, 下載次數(shù): 118)
下載附件
2018-10-3 02:20 上傳
0.png (63.76 KB, 下載次數(shù): 105)
下載附件
2018-10-3 02:20 上傳
xQueueCreate() API 函數(shù)
隊(duì)列在使用前必須先被創(chuàng)建。
隊(duì)列由聲明為 xQueueHandle 的變量進(jìn)行引用。xQueueCreate()用于創(chuàng)建一個(gè)隊(duì)列,并返回一個(gè)xQueueHandle 句柄以便于對(duì)其創(chuàng)建的隊(duì)列進(jìn)行引用。
當(dāng)創(chuàng)建隊(duì)列時(shí),F(xiàn)reeRTOS從堆空間中分配內(nèi)存空間。分配的空間用于存儲(chǔ)隊(duì)列數(shù)據(jù)結(jié)構(gòu)本身以及隊(duì)列中包含的數(shù)據(jù)單元。如果內(nèi)存堆中沒(méi)有足夠的空間來(lái)創(chuàng)建隊(duì)列,xQueueCreate()將返回NULL。第五章會(huì)有關(guān)于內(nèi)存堆管理的更多信息。
6.3 其它常見(jiàn)錯(cuò)誤
問(wèn)題現(xiàn)象:在一個(gè) Demo應(yīng)用程序中增加了一個(gè)簡(jiǎn)單的任務(wù),導(dǎo)致應(yīng)用程序崩潰 任務(wù)創(chuàng)建時(shí)需要在內(nèi)存堆中分配空間。許多 Demo 應(yīng)用程序定義的堆空間大小只夠用于創(chuàng)建 Demo 任務(wù)——所以當(dāng)任務(wù)創(chuàng)建完成后,就沒(méi)有足夠的剩余空間來(lái)增加其它的任務(wù),隊(duì)列或信號(hào)量。
空閑任務(wù)是在 vTaskStartScheduler()調(diào)用中自動(dòng)創(chuàng)建的。如果由于內(nèi)存不足而無(wú)法創(chuàng)建空閑任務(wù),vTaskStartScheduler()會(huì)直接返回。在調(diào)用 vTaskStartScheduler()后加上一條空循環(huán)[for(;;)]可以使這種錯(cuò)誤更加容易調(diào)試。
如果要添加更多的任務(wù),可以增加內(nèi)存堆空間大小,或是刪掉一些已存在的 Demo任務(wù)。
問(wèn)題現(xiàn)象:在中斷中調(diào)用一個(gè) API 函數(shù),導(dǎo)致應(yīng)用程序崩潰
除了具有后綴為”FromISR”函數(shù)名的 API 函數(shù),千萬(wàn)不要在中斷服務(wù)例程中調(diào)用其它 API 函數(shù)。
問(wèn)題現(xiàn)象:有時(shí)候應(yīng)用程序會(huì)在中斷服務(wù)例程中崩潰
需要做的第一件事是檢查中斷是否導(dǎo)致了棧溢出。 在不同的移植平臺(tái)和不同的編譯器上,中斷的定義和使用方法是不盡相同的——所以,需要做的第二件事是檢查在中斷服務(wù)例程中使用的語(yǔ)法,宏和調(diào)用約定是否符合Demo程序的文檔描述,以及是否和Demp程序中提供的中斷服務(wù)例程范例相同。 如果應(yīng)用程序工作在 Cotex M3 上,需要確定給中斷指派優(yōu)先級(jí)時(shí),使用低優(yōu)先級(jí)號(hào)數(shù)值表示邏輯上的高優(yōu)先級(jí)中斷,因?yàn)檫@種方式不太直觀,所以很容易被忘記。一個(gè)比較常見(jiàn)的錯(cuò)誤就是,在優(yōu)先級(jí)高于configMAX_SYSCALL_INTERRUPT_PRIORITY的中斷中調(diào)用了 FreeRTOS API 函數(shù)。
問(wèn)題現(xiàn)象:在啟動(dòng)第一個(gè)任務(wù)時(shí),調(diào)度器就崩潰了
如果使用的是 ARM7,那么請(qǐng)確定調(diào)用 vTaskStartScheduler()時(shí)處理器處于管理模式(Supervisor mode)。最簡(jiǎn)單的方式就是在 main()之前的 C啟動(dòng)態(tài)碼中將處理器設(shè)置為管理模式。ARM7 的 Demo應(yīng)用程序就是這么做的。 如果處理器不在管理模式下,調(diào)度器是無(wú)法啟動(dòng)的。
問(wèn)題現(xiàn)象:臨界區(qū)無(wú)法正確嵌套
除了 taskENTER_CRITICA()和 taskEXIT_CRITICAL(),千萬(wàn)不要在其它地方修改控制器的中斷使能位或優(yōu)先級(jí)標(biāo)志。這兩個(gè)宏維護(hù)了一個(gè)嵌套深度計(jì)數(shù),所以只有當(dāng)所有的嵌套調(diào)用都退出后計(jì)數(shù)值才會(huì)為0,也才會(huì)使能中斷。
問(wèn)題現(xiàn)象:在調(diào)度器啟動(dòng)前應(yīng)用程序就崩潰了
如果一個(gè)中斷會(huì)產(chǎn)生上下文切換,則這個(gè)中斷不能在調(diào)度器啟動(dòng)之前使能。這同樣適用于那些需要讀寫隊(duì)列或信號(hào)量的中斷。在調(diào)度器啟動(dòng)之前,不能進(jìn)行上下文切換。 還有一些 API 函數(shù)不能在調(diào)度器啟動(dòng)之前調(diào)用。在調(diào)用 vTaskStartScheduler()之前,最好是限定只使用創(chuàng)建任務(wù),隊(duì)列和信號(hào)量的API 函數(shù)。
問(wèn)題現(xiàn)象:在調(diào)度器掛起時(shí)調(diào)用 API 函數(shù),導(dǎo)致應(yīng)用程序崩潰
調(diào)用 vTaskSuspendAll()使得調(diào)度器掛起,而喚醒調(diào)度器調(diào)用xTaskResumeAll()。 千萬(wàn)不要在調(diào)度器掛起時(shí)調(diào)用其它 API 函數(shù)。
問(wèn)題現(xiàn)象:函數(shù)原型 pxPortInitialiseStack()導(dǎo)致編譯失敗
每種移植都需要定義一個(gè)對(duì)應(yīng)的宏,以把正確的內(nèi)核頭文件加入到工程中。如果編譯函數(shù)原型 pxPortInitialiseStack()時(shí)出錯(cuò),這種現(xiàn)象基本上可以確定是因?yàn)闆](méi)有正確定義相應(yīng)的宏。請(qǐng)參見(jiàn)附錄 4以獲得更多信息。
可以基本相應(yīng)平臺(tái)的 Demo 工程建立新的應(yīng)用程序。這種方式就不用擔(dān)心沒(méi)有包含正確的文件,也不必?fù)?dān)心沒(méi)有正確地配置編譯器選項(xiàng)。
|
-
0.png
(144.76 KB, 下載次數(shù): 192)
下載附件
2018-10-3 02:18 上傳
-
0.png
(133.65 KB, 下載次數(shù): 185)
下載附件
2018-10-3 02:18 上傳
-
0.png
(10.38 KB, 下載次數(shù): 157)
下載附件
2018-10-3 02:19 上傳
-
-
2-FreeRTOS英文使用教程.pdf
2018-9-30 09:16 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
1.3 MB, 下載次數(shù): 77, 下載積分: 黑幣 -5
-
-
1-FreeRTOS中文使用教程.pdf
2018-9-30 09:16 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
2.9 MB, 下載次數(shù): 188, 下載積分: 黑幣 -5
評(píng)分
-
查看全部評(píng)分
|