FreeRTOS任务调度

开启任务调度器

vTaskStartScheduler(); 无参数, 无返回值. 作用是用于启动任务调度器,任务调度器启动后, FreeRTOS 便会开始进行任务调度 .

FreeRTOS任务调度_第1张图片

如果允许了静态创建任务, 则创建空闲任务和创建定时器任务都会变为需要程序员手动实现创建.

1.创建空闲任务(动态创建)

FreeRTOS任务调度_第2张图片

创建成功, xReturn = pdPass; 

 2.创建软件定时器任务

3.关闭中断 

4.初始化全局变量

由上到下依次是:

  1. 下一个任务阻塞超时时间 = 最大值(0xffffffff).  
  2. 调度器运行状态 = pdTRUE.
  3. 系统计数器, 每中断一次, 这个值加一, 为系统提供心跳节拍, 这里初始值为0.

5.统计任务的运行时间

这里并没有用到, 只是留了一个接口. 以后再学怎么实现.

6.调用函数xPortStartScheduler()

FreeRTOS任务调度_第3张图片

上面的是调试功能, 也是没有实现的, 也是只留了一个接口函数. 

FreeRTOS任务调度_第4张图片

 这个开启第一个任务函数执行结束之后是不会返回的, 直接进入第一个任务开始执行. 

FreeRTOS任务调度_第5张图片 第二步, 配置PendSV和SYSTICK中断优先级
​​​​​

第三步, 配置SysTick中断

FreeRTOS任务调度_第6张图片

portNVIC_SYSTICK_LOAD_REG: 就是系统滴答定时器的重装载值寄存器, 倒数到0的时候触发中断, 这里是72k个数. 

configSYSTICK_CLOCK_HZ就是配置的系统时钟, 这里是72Mhz.

configTICK_RATE_HZ: 中断一次产生的频率, 这里是1000hz.

portNVIC_SYSTICK_CTRL_REG: 就是系统滴答定时器的控制及状态寄存器.

 

启动第一个任务. 

启动第一个任务

prvStartFirstTask();函数, 在端口启动调度器函数中最后执行的.

FreeRTOS任务调度_第7张图片

FreeRTOS任务调度_第8张图片

SVC中断服务函数

FreeRTOS任务调度_第9张图片

FreeRTOS任务调度_第10张图片

你可能感兴趣的:(单片机,嵌入式硬件)