2011-02-28 51 views
3

我在PIC32MX入門工具包上使用FreeRTOS端口用於PIC32單片機。只是在玩任務,但任務不是上下文切換。這裏是我的主配置設置:FreeRTOS任務不是上下文切換

#define configMAX_PRIORITIES ((unsigned portBASE_TYPE) 5) 
#define configKERNEL_INTERRUPT_PRIORITY   0x01 
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 0x03 
#define configTICK_RATE_HZ    ((portTickType) 100) 

現在我已經定義了兩個任務,其中閃爍兩個LED。兩者的優先級都是4(最高)。在正常操作下,LED應該每100次滴答閃爍一次。但是這並沒有發生。第二個LED閃爍100個滴答聲,控制權轉移到一般異常處理程序。爲什麼會發生?似乎沒有任何計劃。

+2

沒有看到你的任務代碼,誰能告訴?你的調試器告訴你什麼?當你點擊異常處理程序時,檢查調用堆棧以查看它是如何到達那裏以及從哪個任務(或調度程序)獲得的。 – Clifford 2011-02-28 19:42:28

+0

您正在使用專用於您的主板的端口/演示嗎?它曾經工作過嗎? – XTL 2011-11-18 11:20:19

回答

4

您是否有循環調度程序?你的任務是否睡了一段時間,或者只是屈服(或忙着等待)?

嵌入式操作系統中很常見的一個問題是調度程序經常不會嘗試公平地調度同一優先級的多個進程。也就是說,一旦A產生,如果A可運行,則A可能會立即再次計劃,即使B沒有任何年齡的CPU也是如此。如果你習慣於花費大量精力去做公平調度的桌面操作系統(或者至少對我來說),這是非常違反直覺的。

如果你正在運行到這一點,你要確保你的任務是這樣的:

for (;;) 
{ 
    led(on); sleep(delay); 
    led(off); sleep(delay); 
} 

...以確保任務實際上不再是眨眼之間運行的。

for (;;) 
{ 
    led(on); 
    led(off); 
} 

(此外,作爲一般規則,你想,如果你使用普通優先級,而不是高優先級的,除非你知道你真的需要它---如果它看起來像這樣它將無法工作系統任務可能會表現異常或崩潰)。

4

您確定兩個任務都已正確註冊並且調度程序已啓動嗎?

類似下面的代碼將做的工作:

xTaskCreate(yourFirstTask, "firstTask", STACK_SIZE, NULL, TASK_PRIORITY, NULL); 
xTaskCreate(yourSecondTask, "secondTask", STACK_SIZE, NULL, TASK_PRIORITY, NULL); 
vTaskStartScheduler(); 

您還可以添加應用程序記號掛鉤,看是否正確地發生蜱中斷或是否有與節拍定時器一個問題。

+1

務必檢查'xTaskCreate'的返回值,以確保任務創建不因任務棧空間缺乏足夠內存而失敗。 – semaj 2011-02-28 16:47:14

6

FreeRTOS操作系統是基於優先級搶佔式調度,相同優先級的任務,不產生處理器時間將是循環賽調度。依靠循環調度很少適用於實時任務,並且取決於配置的時間片,這可能會影響您的時間安排。時間切片甚至可能被禁用。

您的任務必須輸入阻止狀態正在等待某個事件(例如經過的時間)以允許彼此按預期運行。

這就是說,進入異常處理程序,而不是簡單的一個任務捱餓另一個或不與預期時刻運行是另一回事。爲此,您需要發佈其他信息,儘管您的第一種方法應該是部署調試器。

3

有,只是閃爍的LED FreeRTOS操作系統/演示/通用/最小/ flash.c源文件中的標準演示任務。在該文件中創建的任務都包含在標準的PIC32演示應用程序(它的目標Microchip的Explorer16板)。

在其非常簡單的形式,能夠觸發和LED每500ms看起來像這樣一個任務:

/* Standard task prototype, the parameter is not used in this case. */  
void vADummyTask(void *pvParameters) 
{ 
const portTickType xDelayTime = 500/portTICK_RATE_MS; 

    for(;;) 
    { 
     ToggleLED(); 
     vTaskDelay(xDelayTime); 
    }   
} 
5

絕對第一件事是檢查你的「滴答」中斷。通常,中斷未啓用,定時器設置不正確,在設置PIC32的#pragma中沒有正確配置時鐘,所有這些問題都會首先出現,因爲缺少「tick」。

這是不是任務切換的第一個原因:如果你沒有得到滴答中斷。這就是正常的先發制人任務切換髮生的地方。

假設您正在使用「現成演示」,在MPLAB中,在函數void vPortIncrementTick(void)(FreeRTOS \ Source \ portable \ MPLAB \ PIC32MX \ port.c中的第177行左右)中設置一個斷點並運行代碼。如果它在那裏有斷點,你的計時器計時器正在工作。