void SysTick_Handler(void)

{

#if (INCLUDE_xTaskGetSchedulerState == 1 )

if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)

{

#endif /* INCLUDE_xTaskGetSchedulerState */

xPortSysTickHandler();

#if (INCLUDE_xTaskGetSchedulerState == 1 )

}

#endif /* INCLUDE_xTaskGetSchedulerState */

}

创建任务

这里,我们创建一个单任务,任务使用的栈和任务控制块是在创建任务的时候FreeRTOS动态分配的。

任务必须是一个死循环,否则任务将通过LR返回,如果LR指向了非法的内存就会产生HardFault_Handler,而FreeRTOS指向一个死循环,那么任务返回之后就在死循环中执行,这样子的任务是不安全的,所以避免这种情况,任务一般都是死循环并且无返回值的。

并且每个任务循环主体中应该有阻塞任务的函数,否则就会饿死比它优先级更低的任务!!!

/* FreeRTOS头文件 */

#include “FreeRTOS.h”

#include “task.h”

/* 开发板硬件bsp头文件 */

#include “bsp_led.h”

static void AppTaskCreate(void);/* AppTask任务 */

/* 创建任务句柄 */

static TaskHandle_t AppTask_Handle = NULL;

int main(void)

{

BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */

/* 开发板硬件初始化 */

BSP_Init();

/* 创建AppTaskCreate任务 */

xReturn = xTaskCreate((TaskFunction_t )AppTask, /* 任务入口函数 */

(const char* )“AppTask”,/* 任务名字 */

(uint16_t )512, /* 任务栈大小 */

(void* )NULL,/* 任务入口函数参数 */

(UBaseType_t )1, /* 任务的优先级 */

(TaskHandle_t* )&AppTask_Handle);/* 任务控制块指针 */

/* 启动任务调度 */

if(pdPASS == xReturn)