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启动方式及流程 的相关文章

  • Linux文件/文件夹建立软硬链接

    建立软连接 xff1a sudo ln s home spike Downloads redis src redis server usr local bin redis server 源文件 链接到 目标文件 xff0c 这两个文件目录都
  • Linux中记录终端(Terminal)输出到文本文件四种方法

    Linux中记录终端 xff08 Terminal xff09 输出到文本文件 Linux中记录终端 xff08 Terminal xff09 输出到文本文件 一 xff0c 如何把命令运行的结果保存到文件当中 二 command gt f
  • C++ 标准库头文件汇集:

    C 43 43 标准库头文件汇集 xff1a C 43 43 标准库的接口由下列头文件的汇集定义 C 43 43 标准库头文件汇集 xff1a 概念库协程库工具库动态内存管理数值极限错误处理字符串库容器库迭代器库范围库算法库数值库本地化库输
  • C++开源库列表总结记录

    开源 C 43 43 库列表 前言包管理器库音频 音频指纹格式标签CD 性能测试 通信 并发 配置 XMLJSONYAMLTOMLHOCONCSS容器 密码学 数据库 嵌入语言绑定 嵌入式 实时 文件元数据 金融计算 游戏引擎架构 通用多媒
  • C++转义序列和操作符优先级

    C 43 43 转义序列和操作符优先级 1 转义序列 xff1a 2 C 43 43 运算符优先级注解 1 转义序列 xff1a 转义序列 描述 表示 简单转义序列 39 单引号 ASCII 编码中为字节 0x27 34 双引号 ASCII
  • PX4:Policy “CMP0097“ is not known to this version of CMake.

    make px4 fmu v3 时报的错 CMake版本的问题 由https blog csdn net zhizhengguan article details 118380965推测 xff0c 删除cmake policy也没事 ma
  • 安装Anaconda3后再安装ROS(用于PX4)

    记录一下安装anaconda后再安装ROS xff0c 方便未来找错误 出现no module wstool 仔细观察报错信息发现调用的库都在anaconda3 lib python3 7里面了 随后按照https www cnblogs
  • Offboard仿真时出现CMD: Unexpected command 176, result 0

    在用PX4 43 gazebo 43 ROS仿真offboard例程时 xff0c 如果出现以下问题 xff1a 运行以下命令 xff1a roslaunch mavros px4 launch fcu url span class tok
  • Offboard例程的python版本

    因为python的库很丰富 xff0c 有现成的解方程库 xff0c 比如sympy 自己写了一份python版本的自动起飞2m的程序 假设自定义的包名为offb xff0c 在offb下新建scripts文件夹 xff0c 将py文件放在
  • 子类与父类构造函数调用顺序

    子类与父类构造函数调用顺序 构造函数 当创建子类对象时 构造函数的调用顺序 xff1a 静态数据成员的构造函数 gt 父类的构造函数 gt 非静态的数据成员的构造函数 gt 自己的构造函数 注意 无论创建几个对象 该类的静态成员只构建一次
  • 0.1- 机械加工工艺-----切削加工基础

    1 钳工 xff1a 通过工人手持工具进行切削加工 机械加工 xff1a 采用不同的机床 xff08 如车床 铣 床 刨床 磨床 钻床等 xff09 对工 件进行切削加工 2 零件几何参数 xff1a 1 宏观几何参数 xff1a 包括 x
  • 判断当前机器的字节序是大端还是小端?

    字节序 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序 大端字节序 xff08 Big endian xff09 大端存储模式是指数据的高字节保存在内存的低地址中 xff0c 而数据的低字节保存在内存的高地址中 小端字
  • Qt简易计算器实现复数运算绘图等等

    太久没更新博客了前段时间弄了个计算器 实现了加减乘除复数 带记忆 绘图计算二维图形等功能 先简单讲解下我代码的分块 用图片描述虽然画的丑 实现效果图片 代码放心使用转载请通知 1 Ui 2 在Maindow 类实现计算 maindow h
  • 【tensorboard】可视化events.out.tfevents文件

    介绍 笔者训练Mask RCNN模型时 xff0c 在生成权重 xff08 h5 xff09 文件的同时会实时更新events out tfevents szfj文件 xff0c 通过tensorboard可视化events out tfe
  • 【tensorflow】缺少libcudart.so.11.0和libcudnn.so.8解决方法

    问题 xff1a 安装tensorflow gpu xff0c 在测试是否调用GPU时出现如下问题 xff1a Could not load dynamic library libcudart so 11 0 dlerror libcuda
  • 【Lane】 Ultra-Fast-Lane-Detection 复现

    引言 笔者Ultra Fast Lane Detection专栏链接 x1f517 导航 xff1a Lane Ultra Fast Lane Detection 复现 Lane Ultra Fast Lane Detection xff0
  • 【Lane】Ultra-Fast-Lane-Detection(1)自定义数据集训练

    引言 笔者Ultra Fast Lane Detection专栏链接 x1f517 导航 xff1a Lane Ultra Fast Lane Detection 复现 Lane Ultra Fast Lane Detection xff0
  • 【YOLO】yolov5目标识别+DeepSort目标追踪

    引言 利用yolov5训练的目标识别模型 xff0c 结合DeepSort实现目标追踪 源码下载 xff1a xff08 1 xff09 Yolov5 DeepSort Pytorch 该源码下载下来的yolov5文件夹是空的 xff0c
  • 【ZED】从零开始使用ZED相机(一):windows下的安装配置与测试

    引言 笔者通过在一台重装windows系统的笔记本上 xff0c 从安装开始一步步使用ZED xff0c 希望用一系列笔记的方式完成一个比较完善的ZED使用专栏 xff0c 笔者整理思路的同时 xff0c 也能给读者一定的参考 电脑配置说明
  • 【ZED】从零开始使用ZED相机(二):打开相机+捕获图像

    引言 关于ZED相机的安装和配置可以先参考 ZED 从零开始使用ZED相机 xff08 一 xff09 xff1a windows下的安装配置与测试 xff0c 接下来开始二次开发ZED相机 阅读ZED API文档 xff0c 选择自己使用

随机推荐