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)

  • UC3846控制芯片工作原理控制图 逆变焊机原理与用途
  • 数字万用表电阻档测试二极管正反向没有阻值(使用万用表测量二极管的正向电阻,为什么各档)
  • 学单片机需要学数电模电吗(学单片机要先学数电模电吗)
  • 电工怎么选择适合自己用的万用表(电工初学者买什么样的万用表好)
  • 单片机需要同时运行多个任务怎么办(单片机怎么同时执行多个任务)
  • 电机保护的方案取决于负载的机械特性
  • 绝缘电阻表正负搭接不复零位是怎么回事
  • 短路怎么用万用表查