1. 将启动汇编文件中的 替换
DCD vPortSVCHandler //内核SVC中断
DCD DebugMon_Handler
; DCD SVC_Handler
; DCD DebugMon_Handler
DCD xPortPendSVHandler //内核PendSV中断
DCD xPortSysTickHandler //内核SysTick中断
; DCD PendSV_Handler
; DCD SysTick_Handler
2. main函数中,在main函数的最后定义一个while(1);死循环。
先是创建任务,然后是启动任务调度函数。
xTaskCreate( vIntegerGenerator, "IntGen", 200, NULL, 1, NULL);
xTaskCreate( vStringPrinter, "String", 200, NULL, 2, NULL);
vTaskStartScheduler();
3. 创建信号量时,首先应在main函数之前定义一下全局变量
xQueueHandle xIntegerQueue;
xQueueHandle xStringQueue;
4. 一些初始化的东西最好在main函数里面先初始化好,如GPIO的选择、方向以及定时器的初始化。
如果定时器的初始化放在任务里面,有可能导致定时器无法正常工作。因为任务在循环执行,可能定时器还没到定时时间,就又被重新初始化了。
5. 加库文件stdio.h,执行printf语句,可在IO终端里面查看。
6. 在任务函数里面,定义变量放在for循环外面,其他放在for循环里面。
如
static void vStringPrinter( void *pvParameters )
{
char *pcString;
for(;;)
{
xQueueReceive( xStringQueue, &pcString, portMAX_DELAY);
printf(pcString);
}
}
7. 如果任务遇到中断,需要强制上下文切换。中断里面用的上下文切换是taskYIELD();而不是vTaskSwitchContext 里面有了个PendSV中断。