1. 將啟動(dòng)匯編文件中的 替換
DCD vPortSVCHandler //內(nèi)核SVC中斷
DCD DebugMon_Handler
; DCD SVC_Handler
; DCD DebugMon_Handler
DCD xPortPendSVHandler //內(nèi)核PendSV中斷
DCD xPortSysTickHandler //內(nèi)核SysTick中斷
; DCD PendSV_Handler
; DCD SysTick_Handler
2. main函數(shù)中,在main函數(shù)的最后定義一個(gè)while(1);死循環(huán)。
先是創(chuàng)建任務(wù),然后是啟動(dòng)任務(wù)調(diào)度函數(shù)。
xTaskCreate( vIntegerGenerator, "IntGen", 200, NULL, 1, NULL);
xTaskCreate( vStringPrinter, "String", 200, NULL, 2, NULL);
vTaskStartScheduler();
3. 創(chuàng)建信號(hào)量時(shí),首先應(yīng)在main函數(shù)之前定義一下全局變量
xQueueHandle xIntegerQueue;
xQueueHandle xStringQueue;
4. 一些初始化的東西最好在main函數(shù)里面先初始化好,如GPIO的選擇、方向以及定時(shí)器的初始化。
如果定時(shí)器的初始化放在任務(wù)里面,有可能導(dǎo)致定時(shí)器無(wú)法正常工作。因?yàn)槿蝿?wù)在循環(huán)執(zhí)行,可能定時(shí)器還沒(méi)到定時(shí)時(shí)間,就又被重新初始化了。
5. 加庫(kù)文件stdio.h,執(zhí)行printf語(yǔ)句,可在IO終端里面查看。
6. 在任務(wù)函數(shù)里面,定義變量放在for循環(huán)外面,其他放在for循環(huán)里面。
如
static void vStringPrinter( void *pvParameters )
{
char *pcString;
for(;;)
{
xQueueReceive( xStringQueue, &pcString, portMAX_DELAY);
printf(pcString);
}
}
7. 如果任務(wù)遇到中斷,需要強(qiáng)制上下文切換。中斷里面用的上下文切換是taskYIELD();而不是vTaskSwitchContext 里面有了個(gè)PendSV中斷。