FreeRTOS学习笔记:FreeRTOS启动方式及流程

2023-05-16

在这里插入图片描述

FreeRTOS启动方式及流程

FreeRTOS有两种比较流行的启动方式。

1、方式一:在main函数中创建所有任务

具体说明:在main函数中将硬件初始化、RTOS系统初始化,创建所有的任务,再启动RTOS调度器(调度器会根据任务的优先级进行选择)开始多任务调度。

1.1、main函数

//主函数
int main(void)
{ 
  systemInit(); //Hardware initialization //硬件初始化
	
	    //Create the task //创建任务
	  xTaskCreate(CONTROL_task, "CONTROL_task", BALANCE_STK_SIZE, NULL, BALANCE_TASK_PRIO, NULL);	//Vehicle motion control task //运动控制任务
	  xTaskCreate(IMU_task, "IMU_task", MPU9250_STK_SIZE, NULL, MPU9250_TASK_PRIO, NULL);	//IMU data read task //IMU数据读取任务
    xTaskCreate(show_task,    "show_task",    SHOW_STK_SIZE,    NULL, SHOW_TASK_PRIO,    NULL); //The OLED display displays tasks //OLED显示屏显示任务
    xTaskCreate(led_task,     "led_task",     LED_STK_SIZE,     NULL, LED_TASK_PRIO,     NULL);	//LED light flashing task //警示灯闪烁任务
    xTaskCreate(pstwo_task,   "PSTWO_task",   PS2_STK_SIZE,     NULL, PS2_TASK_PRIO,     NULL);	//Read the PS2 controller task //遥控手柄任务
    xTaskCreate(data_task,    "DATA_task",    DATA_STK_SIZE,    NULL, DATA_TASK_PRIO,    NULL);	//Usartx3, Usartx1 and CAN send data task //UART/SPI/CAN发送数据任务			
	vTaskStartScheduler();  //Enables task scheduling //开启任务调度						
}

1.2、具体任务实现

void CONTROL_task(void *pvParameters)
{ 
}

void IMU_task(void *pvParameters)
{ 
}

void show_task(void *pvParameters)
{ 
}

void led_task(void *pvParameters)
{ 
}
......

2、方式二:在main函数中创建启动任务,在启动任务中创建应用任务。

具体说明:在main函数中将硬件初始化、RTOS系统初始化后,创建一个启动任务,再启动RTOS调度器;在启动任务中创建各种应用任务,当所有任务创建完成后,自动任务会将自己删除(即启动任务只执行一次后删除)。

2.1、main函数

//主函数
int main(void)
{ 
  systemInit(); //Hardware initialization //硬件初始化
	
	//Create the start task //创建开始任务
	xTaskCreate((TaskFunction_t )start_task,            //Task function   //任务函数
							(const char*    )"start_task",          //Task name       //任务名称
							(uint16_t       )START_STK_SIZE,        //Task stack size //任务堆栈大小
							(void*          )NULL,                  //Arguments passed to the task function //传递给任务函数的参数
							(UBaseType_t    )START_TASK_PRIO,       //Task priority   //任务优先级
							(TaskHandle_t*  )&StartTask_Handler);   //Task handle     //任务句柄    					
	vTaskStartScheduler();  //Enables task scheduling //开启任务调度						
}

2.2、开始任务任务函数

//Start task task function //开始任务任务函数
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL(); //Enter the critical area //进入临界区
	
    //Create the task //创建任务
	  xTaskCreate(CONTROL_task, "CONTROL_task", BALANCE_STK_SIZE, NULL, BALANCE_TASK_PRIO, NULL);	//Vehicle motion control task //运动控制任务
	  xTaskCreate(IMU_task, "IMU_task", MPU9250_STK_SIZE, NULL, MPU9250_TASK_PRIO, NULL);	//IMU data read task //IMU数据读取任务
    xTaskCreate(show_task,    "show_task",    SHOW_STK_SIZE,    NULL, SHOW_TASK_PRIO,    NULL); //The OLED display displays tasks //OLED显示屏显示任务
    xTaskCreate(led_task,     "led_task",     LED_STK_SIZE,     NULL, LED_TASK_PRIO,     NULL);	//LED light flashing task //警示灯闪烁任务
    xTaskCreate(pstwo_task,   "PSTWO_task",   PS2_STK_SIZE,     NULL, PS2_TASK_PRIO,     NULL);	//Read the PS2 controller task //遥控手柄任务
    xTaskCreate(data_task,    "DATA_task",    DATA_STK_SIZE,    NULL, DATA_TASK_PRIO,    NULL);	//Usartx3, Usartx1 and CAN send data task //UART/SPI/CAN发送数据任务
	
    vTaskDelete(StartTask_Handler); //Delete the start task //删除开始任务

    taskEXIT_CRITICAL();            //Exit the critical section//退出临界区
}

2.3、应用任务

void CONTROL_task(void *pvParameters)//运动控制任务
{ 
}

void IMU_task(void *pvParameters)//IMU数据读取任务
{ 
}

void show_task(void *pvParameters)//OLED显示屏显示任务
{ 
}

void led_task(void *pvParameters)//警示灯闪烁任务
{ 
}
......

3、FreeRTOS系统启动流程

在这里插入图片描述

1、FreeRTOS系统上电后,首先会启动复位函数Reset_Handle,之后再调用C库函数__main,其目的主要是为了初始化系统的堆和栈,最后调用C中的main函数。

Reset_Handle的内容:

Ret_Handle  PROC
            EXPORT Ret_Handle
            IMPORT __mian
            IMPORT StstemInit
            LDR R0,=SystemInit
            BLX R0
            LDR R0,=__main
            BX R0

2、在main函数中,对硬件设备、系统进行初始化,再创建任务(①、创建所有任务,②、创建启动任务),启动任务调度器,任务调度器为FreeRTOS实时操作系统的核心,主要负责任务切换(通过分析各任务的优先级)。

3、使用任务调度器-vTaskStartScheduler()所完成的事情:①、创建空闲任务;②、创建定时器服务任务;③、关闭中断;④、将变量xSchedulerRunning 设置为pdTRUE,表示调度器开始运行;

4、使用调度函数xPortStartScheduler()来初始化跟调度器启动相关的硬件,如:设置PendSV的中断优先级,为最低优先级;设置滴答定时器的中断优先级,为最低优先级;初始化临界区嵌套计数器。

5、使用函数prvStartFirstTask()来启动第一个任务(prvStartFirstTask函数为汇编函数);主要用来使能中断、使用SVC异常来启动第一个任务。

6、使用vPortSVCHandler()函数从第一个任务的进程栈中出栈。

printf("请关注微信公众号:Kevin的学习站,阅读更多关于FreeRTOS和自动驾驶嵌入式相关的文章!")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS学习笔记:FreeRTOS启动方式及流程 的相关文章

  • 每天一个Lodash源码解析

    每天一个Lodash源码解析 chunk 方法介绍自我实现源码分析代码对比知识点补充浮点数转化为浮点数数组创建方法区别js中切割数组方法 slice 方法介绍自我实现源码分析代码对比知识点补充 96 96 gt gt gt 96 96 移位
  • conda的常用操作

    1 查看conda版本 2 更改安装第三方库的源 将国外的源改为清华镜像源 cmd窗口依次输入 xff1a conda config add channels https mirrors tuna tsinghua edu cn anaco
  • 云技术

    什么是 云 与云技术 xff1f 云技术是在分布式计算技术 网格计算基数基础上发展起来的一种计算技术 云技术基于资源虚拟化的方式 xff0c 为用户提供方便快捷的服务 xff0c 可以实现计算与存储的分布式与并行处理 云技术为其他信息技术
  • 什么是上转型对象及其基本特征

    5 12 什么是上转型对象及其基本特征 xff1f 上转型对象 子类对象赋值给父类变量 例如 xff1a package com wangxing test1 父类 public class Person public void testP
  • 【树莓派入门系列】4 树莓派安装测试torch与torchvision

    树莓派运行YOLOV5项目 安装测试torch amp torchvision 项目目录 点击跳转 0 首页 1 前期准备工作 2 配置树莓派系统 3 安装测试opencv 4 安装测试torch amp torchvision 5 测试y
  • javascript中in和includes的区别

    in的用法 遍历对象 span class token keyword let span names span class token operator 61 span span class token punctuation span n
  • centos安装java环境

    方式一 xff1a 安装java环境 1 先查看本地是否自带java环境 xff1a yum list installed grep java 2 卸载自带的java xff08 输入su xff0c 输入root超级管理员的密码 xff0
  • 计算机网络(五) 网络层(中)

    网络层 xff08 中 xff09 3 划分子网和构造超网3 1划分子网3 2使用子网时分组的转发3 3无分类编址CIDR xff08 构造超网 xff09 4 网际控制报文协议 xff08 ICMP xff09 4 1 ICMP报文的种类
  • 【软件工程学习】软件工程概论

    一 软件工程基础 软件是什么 xff1f xff08 1 xff09 软件独立于硬件 早期软件是作为计算机硬件的零件来开发的 xff0c 40年代中后期和50年代早期时 xff0c 为了利用计算机硬件进行研究 xff0c 使用针对专门的硬件
  • Hadoop (四) ——MapReduce 的原理+实现

    MapReduce简介 MapReduce是一种编程模型 xff0c 用于大规模数据集的并行运算 概念 34 Map xff08 映射 xff09 和 34 Reduce xff08 归约 xff09 xff0c 是它们的主要思想 xff0
  • 51单片机oled12864显示时间日期温度

    思路 xff1a 电源接入 第一行显示时间 第二行显示日期 xff0c 屏幕下面左边显示星期 xff0c 右边显示温度 xff0c 当k1按键第一次按下进入设置页面 xff0c 在设置页面 xff0c k1按键为确定 k2按键为循环选择 k
  • python post请求报错:{“error“:“invalid_request“,“error_description“:“Missing grant type“}

    request post请求报错信息 xff1a error invalid request error description Missing grant type 修改为 xff1a 把headers中的 Content Type 改为
  • Ubuntu下teamviewer的安装及使用

    1 到官网下载对应的安装包 xff0c 官网下载网址 xff1a https www teamviewer cn cn download linux coupon 61 CMP SEM CN 20 amp utm source 61 bai
  • 海南大学考研人,你真的马上就要上岸了

    临考前 xff0c 很多注意事项大家要提前了解 最近很多同学问到试卷拆封的问题 xff0c 今天 我们海大学长学姐们 就给大家详细地说一下考研试卷拆封的整个过程 考研并不是传统的发卷子 xff0c 而是 发信封 自己开封 xff0c 答题
  • (windows+xrdp+ubuntu16.04)远程服务器出错:“password failed error - problem connecting“

    这个问题貌似是2019年1月10日xrdp进行了系统自动更新后导致的 xff0c 有两个解决办法 xff1a 方法1 xff1a 对xrdp进行降级重新安装sudo apt get install xrdp 61 0 6 1 2 方法2 x
  • C# SharpGL-Material材质

    在上一节C SharpGL Light光源讲了我们身边的几个实际场景与OpenGL一些参数对应关系 xff0c 其中讲到了反射光的颜色 xff1a 4 反射的光颜色 xff1a 我们之所以能够看到不发光的物体 xff0c 是因为这些不发光的
  • 海南大学考研经验分享之(考研数学)

    提问 xff1a 2022考研数学会不会是史上最难的一年 答 xff1a 考研就是考数学 这句话对于考试科目中有数学的同学们来说 xff0c 是有一定道理的 每一年都是史上最难 xff0c 不管是不是史上最难的 xff0c 只要认真备考 x
  • 23年海南大学835上岸考研资料(历年真题)及笔记(耗时1年)

    23年 xff0c 海南大学835软件工程 上岸必备资料 xff08 历年真题 xff09 及笔记 xff08 耗时一年 xff09 xff01 首先挂一下22年考试qun图 xff0c qun里给大家每日分享考研英语和数学 xff0c 专
  • 海南大学信号与系统838考研经验(3)

    4 问 xff1a 信号与系统838复习参考书目是什么 xff1f 海大官网是没有明确的参考书籍 xff0c 往届的学长和学姐们都用吴大正 xff0c 手里有第4版的也可以 xff0c 现在是新版第5版 xff0c 当然更好一些 其次是郑君
  • 成都信息工程大学809考研【软件工程】资料笔记真题~

    软件工程考研学长学姐们考研时自己总结的笔记题库 xff0c 不断完善 xff0c 笔记资料齐全 xff0c 取其精华去其糟粕 xff0c 直接只一套到手即可 xff01 包括考前给大家编写的三套模拟押题卷 xff0c 欢迎对比 xff01

随机推荐

  • 【24考研数学找研友】

    24数学考研 听说今年数学考研好难呀 xff0c 有没有同学一起考研一起复习的 大家一起看图交流一下
  • 【24北京交通大学901软件工程考研】

    有没有考北京交通大学901软工的同学 xff0c 一起组个队呀 xff0c 相互监督 xff5e 每日打卡学习
  • 【2024海南大学835软件工程考研笔记】

  • python中的装饰器(基础装饰器)

    文章目录 一 前置知识 高阶函数 xff0c 闭包1 高阶函数2 闭包 二 函数装饰器1 什么是装饰器 xff08 原理 xff09 xff1f 2 装饰器的实现3 何时执行装饰器4 wraps方法 三 类装饰器 一 前置知识 高阶函数 x
  • python中的装饰器二(带参数的装饰器)

    文章目录 前言 一 被装饰函数带参数二 被装饰函数有返回值三 装饰器带参数四 多个装饰器 前言 看大佬们写的代码看的我是眼花缭乱 xff0c 不知所云啊 真是感叹 xff0c 自己还看都看不懂 xff0c 人家就能写出来了 xff0c 人与
  • STlink、Jlink驱动一直安装失败的解决办法

    STlink Jlink驱动一直安装失败的解决办法 STlink驱动安装失败问题详情 Jlink驱动安装的问题也类似 xff0c 总是有一项安装失败 xff01 xff01 xff01 在经过各种尝试完毕之后 xff0c 怀疑是系统的问题
  • 数据可视化--实验四:地理数据可视化

    声明 xff1a 本文CSDN作者原创投稿文章 xff0c 未经许可禁止任何形式的转载 xff0c 原文链接 文章目录 概要实验过程Pyecharts实验结果 概要 学院 xff1a 计算机科学与技术学院实验日期 xff1a 2020 10
  • 课设-基于51单片机的智能小车(循迹+避障+APP控制)

    51单片机课设 智能小车 一 课设任务二 硬件设计及相关传感器模块1 车模2 51单片机3 红外循迹模块4 电机及驱动5 蓝牙模块6 硬件搭建 三 程序代码1 main c文件2 motor c文件 四 我的大学 造车 史 注 xff1a
  • 课设-基于51单片机+超声波模块的避障小车(源码+原理图+Protel仿真)

    基于51单片机 43 超声波模块的避障小车 xff08 源码 43 原理图 43 Protel仿真 xff09 一 功能二 模块2 1 电机驱动模块2 2 超声波模块 三 程序代码四 PCB原理图 一 功能 设计一辆利用超声波传感器来实现避
  • 路径规划(一):使用Matlab快速绘制栅格地图

    目录 一 Matlab快速绘制栅格地图1 几种常用的地图形式 xff1a 1 1 尺度地图 xff1a 1 2 拓扑地图 xff1a 1 3 语义地图 xff1a 2 栅格地图用于路径规划的优势 xff1a 3 matlab绘制栅格地图的核
  • 2、无人驾驶--路径规划算法:Dijkstra

    目录 2 Dijkstra2 1 算法简介2 2 算法思路具体流程 xff1a 2 3 算法具体实现2 3 1 程序详解 2 Dijkstra 声明 xff1a 本文是学习古月居 基于栅格地图的机器人路径规划算法指南 黎万洪 后写的笔记 x
  • 毕设--基于51单片机的温度报警器设计

    目录 1 简介2 设计要求与方案论证2 1 设计要求2 2 系统基本方案选择和论证2 2 1 单片机芯片的选择方案和论证2 2 2 温度传感器设计方案论证 2 3 电路设计最终方案决定 3 硬件设计介绍3 1 STC89C51介绍3 1 1
  • 基于51单片机的篮球比赛计时器

    目录 基于51单片机的篮球比赛计时器1 PCB原理图2 仿真图3 毕设要求 xff1a 4 总体方案设计5 程序源码6 资源下载 基于51单片机的篮球比赛计时器 注 xff1a 本毕设资源可在微信公众号 xff1a Kevin的学习站 中获
  • 毕设--基于51单片机数字电压表的设计

    目录 基于51单片机数字电压表的设计1 PCB原理图2 Proteus 仿真图3 设计目标3 1 基本功能3 2 主要技术参数 4 总设计框图5 硬件设计分析5 1 电源的设计5 2 单片机最小系统5 3 模数转换 6 软件设计的组成7 元
  • 基于51单片机的智能温控风扇(程序+仿真+原理图)

    目录 基于51单片机的智能温控风扇1 主要功能2 实验结果3 仿真工程4 原理图5 程序源码6 资源获取 基于51单片机的智能温控风扇 1 主要功能 基于51单片机的智能温控风扇 xff0c 通过DS180温度传感器采集温度 xff0c 并
  • 基于51单片机的八路竞赛抢答器设计

    目录 基于51单片机的八路抢答器设计1 主要功能2 仿真图3 测试图4 程序源码5 资源获取 基于51单片机的八路抢答器设计 1 主要功能 利用STC89C52单片机及外围接口实现的抢答系统 xff1b 在抢答过程中 xff0c 只有启动抢
  • 赛灵思-Zynq UltraScale+ MPSoC学习笔记汇总

    Zynq UltraScale 43 MPSoC学习目录 xff1a 1 赛灵思 Zynq UltraScale 43 MPSoCs xff1a 产品简介 2 赛灵思 Zynq UltraScale 43 MPSoC学习笔记 xff1a P
  • 数据可视化--实验五:高维非空间数据可视化

    声明 xff1a 本文CSDN作者原创投稿文章 xff0c 未经许可禁止任何形式的转载 xff0c 原文链接 文章目录 概要实验过程Pyecharts实验结果平行坐标系room1 6房间人员时长饼图 概要 学院 xff1a 计算机科学与技术
  • 7、AUTOSAR MCAL入门-实战:I/O驱动组

    7 AUTOSAR MCAL入门 实战 xff1a I O驱动组 在第三节中有介绍AUTOSAR 把MCAL 抽象分为4个驱动组 xff0c 分别为 xff1a 微控制器驱动组 xff0c 存储器驱动组 xff0c 通信驱动组 输入 输出驱
  • FreeRTOS学习笔记:FreeRTOS启动方式及流程

    FreeRTOS启动方式及流程 FreeRTOS有两种比较流行的启动方式 1 方式一 xff1a 在main函数中创建所有任务 具体说明 xff1a 在main函数中将硬件初始化 RTOS系统初始化 xff0c 创建所有的任务 xff0c