FreeRTOS的启动流程

2023-05-16

目前的RTOS中有两种比较流行的启动方式

万事俱备  只欠东风:在main函数中将硬件初始化,rtos系统初始化,所有任务的创建都完成  再启动RTOS的调度器(在刚刚创建的的任务中选择一个优先级最高的) 开始多任务的调度

伪代码:

int main()
{
HardWare_Init();
RTOS_Init();

//创建任务1 但是任务1不会执行  因为调度器还没有开启
RTOS_TaskCreate(Task1);
RTOS_TaskCreate(Task2);
//启动RTOS 开始调度
RTOS_Start();

}

void Task1(void * arg)
{
while(1)
{
//任务实体 必须有阻塞的情况出现
}
}

void Task2(void * arg)
{
while(1)
{
//任务实体 必须有阻塞的情况出现
}
}

小心翼翼 十分谨慎:在main函数中将硬件和RTOS系统初始化好 然后创建一个启动任务后就启动调度器  在启动任务中创建各种应用任务   当所有的任务创建成功后  启动任务就把自己删除

伪代码:

int main()
{
HardWare_Init();
RTOD_init();
//创建一个任务
RTOS_TaskCreate(APPTaskCreate);
//启动RTOS 开始调度
RTOS_Start();

}


void AppTaskCreate(void *arg)
{
//创建任务1 然后执行
RTOS_TaskCreate(Task1);
//当任务1阻塞时 继续创建任务2 然后执行
RTOS_TaskCreate(Task2);

//任务创建完成  删除起始任务
RTOS_TaskDelete(AppTaskCreate);
}

void Task1(void *arg)
{
while(1)
{
}
}

void Task2(void * arg)
{
while(1)
{
}
}

启动流程:

在系统上电时第一个执行的是启动文件中由汇编编写的复位函数Reset_Handle  复位函数之后会调用C库函数__main ,主要作用是初始化系统的堆和栈   最后调用C中的main函数

  1. Rest_Handle
  2. __main
  3. main()

其中Ret_Handle函数的内容

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

创建任务 xTaskCreate()函数:

    在 main函数中  可以直接对FreeRTOS进行创建任务操作    因为FreeRTOS会自动帮我们做初始化的事情  如初始化堆内存    所以我们自己在main函数中自己直接初始化我们的板极外设  然后进行任务创建即可--xTaskCreate,FreeRTOS会帮我们进行一系列的初始化,帮我们初始化堆栈内存。

在创建任务时,我们需要开启调度器,因为创建任务是把任务添加到系统中,还没真正调度 并且空闲任务(FreeRTOS一旦启动就必须要保证系统中每时每科都有任务执行 并且空闲任务不能被挂起与删除 并且空闲任务的优先级是最低的  以便系统中其他任务能够随时抢占空闲任务的CPU使用权)也没实现  定时器任务也没实现  这些都是在开启任务调度函数vTaskStartSchedule中实现  处理完这些  系统才真正才是启动

vTaskStartSchedule()函数内容:

void vTaskStartSchedule(void)
{
   BaseType_t xReturn;
   //添加空闲任务
#if(configSUPPORT_STATIC_ALLOCATION==1)
   {
    StaticTask_t *pxIdleTaskTCBBuffer=NULL;
    StackType_t *pxIdleTaskStackBuffer=NULL;
    uint32_t ulIdleTaskStackSize;
    //空闲任务一般使用用户提供的RAM创建-获取  然后RAM的地址创建空闲任务  这是静态创建任务
    vApplicationGetIdleTaskMemory(&pxIdleTaskTCBBuffer,&pxIdleTaskStackBuffer,&ulIdleTaskStackSize);
   xIdleTaskHandle=xTaskCreateStatic(prvIdleTask,"IDLE",ulIdleTaskStackSize,(void *)NULL,(tskIDLE_PRIORITY|portPRIVILEGE_BIT),pxIdleTaskStackBuffer,pxIdleTaskTBBuffer);
  if (xIdleTaskHandle!=NULL){
      xReturn=pdPASS;
      else
     {
       xReturn=pdFALL;
      }
     }
   }

#else
//动态任务创建idle
{
//使用动态分配的RAM创建空闲任务
  xReturn=xTaskHandle(prvIdleTask,"IDLE",ConfigMINIMAL_STACK_SIZE,(void *)NULL,(taskIDLE_PRIORITY|portPRIVILEGE_BIT),&xIdleTaskHandle);
}
#endif


........
.......
.......
.....
}

创建定时器任务:

BaseType_t cTimerCreateTimerTask(void)
{
   BaseType_t xReturn =pdFAIL;
   //检查使用了哪些活动计时器的列表 以及用于与计数器服务通信的队列 已经初始化
   prvCheckForValidListAndQueue();
   //动态创建定时器任务
   xReturn=xTaskCreate(prvTimerTask,"tmr_svc",configTIMER_TASK_STCAK_DEPTH,NULL,
   ((UBaseType_t)configTIMER_TASK_PRIORITY)|portPRIVILEGE_BIT,&xTimerTaskHanlde);
   configASSERT(xReturn);
}

关于异常:

FreeRTOS为了任务启动和任务切换使用了三个异常:SVC,PendSV,SysTick:

SVC:系统服务调用  用于任务启动  用户使用SVC发出对系统服务函数的呼叫请求   以这种方法调用它们来间接访问硬件  他会产生一个SVC异常

PendSV:用于完成任务切换,他可以像普通你的中断一样被挂起 最大的特性是如果当前有优先级比他高的中断正在运行  PendSV会延迟执行  知道高优先级的中断执行完成  这样就不会打断其他中断的运行

SysTick:用于产生系统节拍时钟,提供一个时间片  如果多个任务共享同一个优先级  每次SysTick中断  下一个任务将获得一个时间片

在main函数中只需要创建并启动一些任务和硬件初始化

int  main(void)
{
   BaseType_t xReturn =pdPASS;
   Init();
   xRetrun=xTaskCreate((TaskFunction_t)AppTaskCreate,(const char *)"AppTaskCreate",(uint16_t)512,(void *)NULL,(UBaseType_t )1,(TaskHandle_t *)&AppTaskCreate_Handle);
if(pdPASS==xReturn)
    vTaskStartSchedule();
else
   return -1;
  while(1);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS的启动流程 的相关文章

  • 小米6渲染图曝光 边框惊艳 国产曲面旗舰要发黑色版

    昨天咱们刚刚说过 小米6会有陶瓷版本 并且估计会在四月发布 今天 网友的渲染图又来了 没上车的赶紧上车 别忘了底部打卡 最近 对于小米6的传言很众多 xff0c 但不管怎么说 xff0c 骁龙835处理器 IMX400传感器以及高屏占比等都
  • 时间戳对齐的简单算法(原创)

    实际融合算法过程中常常出现时间戳对不齐的情况 为了解决此问题 xff0c 用了两个队列来解决时间戳匹配问题 时间戳对齐算法实现原理如下下图为插入状态 如图所示共有两个队列 xff0c 有七个状态 xff0c 通过对于轮速递推结果的动态保存
  • java中equals和==的区别(简单介绍)

    java中equals和 61 61 的区别 简单介绍 equals方法是java lang Object类的方法 有两种用法说明 一 对于字符串变量来说 xff0c 使用 61 61 和 equals 方法比较字符串时 xff0c 其比较
  • 如何上传到GitHub的main分支而不是master分支

    由于在2020年10月01日后 xff0c 在 GitHub 上创建的仓库都默认命名为 main 而非原本的 master 所以 有人看了我的 https blog csdn net m0 46419510 article details
  • Python中的Pandas、Matplotlib库详解

    文章目录 Pandas数据分析库Pandas的基本数据结构访问数据算术运算和对齐数据整理 Matplotlib绘图库Matplotlib简介几种常见的图形多图绘制使用Pandas绘图 Pandas数据分析库 1 xff09 Pandas是目
  • 卡尔曼滤波模型及Matlab模型建立

    目录 一 卡尔曼滤波 1 概念解析 xff1a 2 卡尔曼滤波的最优估计模型 3 实例 小车匀加速直线运动 4 Matlab建模 二 扩展卡尔曼滤波 xff08 EKF Extended KAlman Filter xff09 1 非线性系
  • 智能车 PID 调试

    智能车 PID 调试 文章目录 智能车 PID 调试学习目的开环控制与闭环控制开环控制闭环控制小结 PID 概述简介PID 公式 xff1a 舵机 PID分析算法 电机 PID分析算法调试口决 注意事项 学习目的 使电机速度和舵机转向更精准
  • ORBSLAM2系统学习(二)

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 目录 前言 一 ORBSLAM2简介 二 系统综述 系统框架 追踪线程Tracking 局部建图线程local mapping 回环检测l
  • QT-串口调试助手自动定时收发、十六进制转换

    这篇调试助手比较详细 xff1a 不仅有十六进制转换 串口自动识别还有自动发送等功能 程序链接 xff0d xff0d 欢迎关注哦 https download csdn net download m0 46436890 13793486
  • [记录]webpack打包引用了fluent-ffmpeg的js报错解决

    参考博客 xff1a Cannot resolve module fs npm 编译失败 xff1a Can t resolve child process
  • 2020年三非上岸北邮计算机院考研经验贴(励志)

    64 TOC 两次北邮考研经验 前言 xff1a 这是我两次考北邮的日常生活的点点滴滴 xff0c 我不是什么名校出身 xff0c 也不是什么学霸 xff0c 但是有梦想终归会成功的 xff0c 希望我的经历能够带给你们一些鼓励 xff0c
  • 23条养生小常识,赶紧看看吧,千万不要错过!

    一 情绪不畅容易生病 天气多变时 xff0c 人们情绪很容易受气候的影响而抑郁 xff0c 情绪变化也影响了食欲 xff0c 从而引发胃病 在胃病的预防上要重视精神与饮食的调摄 xff0c 一个人经常情绪不畅 xff0c 很容易被疾病侵袭
  • Windows上安装GPU版本TensorFlow的详细安装步骤

    1 检查并安装VS环境 安装GPU版本的TensorFlow xff0c 首先需要检查VS环境 xff0c 如果没有需要安装 xff0c 但是VS全部安装会占内存 xff0c 因此可以去Download Visual C 43 43 Red
  • ISE14.7逻辑综合与实现工作过程

    1 1 ISE14 7逻辑综合与实现工作过程 1 1 1 本节目录 1 本节目录 2 本节引言 3 FPGA简介 4 ISE14 7逻辑综合与实现工作过程 5 结束语 1 1 2 本节引言 不积跬步 无以至千里 不积小流 无以成江海 就是说
  • (4)FPGA开发工具介绍(第1天)

    4 FPGA开发工具介绍 第1天 1 文章目录 1 文章目录 2 FPGA初级课程介绍 3 FPGA初级课程架构 4 FPGA开发工具介绍 第1天 5 技术交流 6 参考资料 2 FPGA初级课程介绍 1 FPGA初级就业课程共100篇文章
  • (02)Shell脚本【可执行程序】

    02 Shell脚本 可执行程序 1 目录 1 1 Shell脚本简介 1 2 nbsp Shell脚本文件 1 3 nbsp Shell脚本作用 1 4 nbsp Shell运行环境 1 5 nbsp Shell脚本 可执行程序 1 6
  • AD20知识补充及四层板了解

    之前自己动手画过一个stm32c8t6最小系统的板子 xff0c 但由于当时学的比较仓促对AD的很多东西不了解 xff0c 如今想了解四层板子 xff0c 就从b站上把AD20从新建项目工程到最后画完板子整个完整的流程又重新学习了一遍 xf
  • 常用服务器和存储设备管理口默认IP用户名密码汇总(持续更新)

    一 服务器设备默认管理 1 宝德4卡服务器 默认用户名 xff1a ADMIN 密码 xff1a 11111111 2 超微服务器 默认用户名 xff1a ADMIN 密码 xff1a admin000 默认用户名 xff1a ADMIN
  • RS232,RS485原理与应用

    Uart存在的问题 1 没有一个统一连接器的标准 xff0c 且只规定了数据传输的顺序 xff08 只规定了两根线 xff09 2 只规定了高电平为1 xff0c 低电平为0 xff08 例 xff1a 51是5v xff0c stm32为
  • STM32的面试题

    一 STM32F1和F4的区别 1 内核不同 xff1a F1内核为cortex m3 xff0c F4为cortex m4 2 主频不同 xff1a F1主频72MHz xff0c F4168MHz xff08 主频就是CPU内核时钟频率

随机推荐

  • GCC【3】-Win10 + CMake + MinGW+搭建STM32 GCC开源开发环境

    文章目录 前言一 安装git bash二 安装MinGW MinGW w642 1 MinGW是什么 xff1f 2 2 MinGW gcc安装简图2 2 MinGW make安装简图 三 安装Make for Windows3 1 下载安
  • Zookeeper集群无法启动的原因分析

    Zookeeper集群无法启动的原因分析 xff1a centos7上搭建三台zookeeper xff0c 相关文件配置没有问题 问题描述 xff1a span class token punctuation span atguigu 6
  • 美女体验小米无人机4K版:直接解锁新手模式

    其实说实话 xff0c 这小米无人机4K版我们拿到手上已经挺长时间的了 但是奈何全北京禁飞 xff0c 所以一直没有机会飞飞看 xff0c 于是我们就在解禁之后的第一时间 xff0c 跑到了六环外为大家带来试飞 就让我们从开箱开始 xff0
  • intel realsense摄像头标定教程(win10环境)

    intel realsense摄像头标定教程 准备工具 Intel RealSense D400 Series Dynamic Calibration Toolsprint target fixed width pdf或者对应手机app I
  • TCP网络编程例子(C语言实现)

    说明 xff1a 之前在CSDN上找TCP编程时 xff0c 发现有各种版本 不同版本之间写法不一 xff0c 所以自己写了个C语言版本的 xff0c 记录下来 服务端代码 xff1a span class token comment TC
  • D435i相机的标定及VINS-Fusion config文件修改

    引言 当我们想使用D435i相机去跑VINS Fusion时 xff0c 如果不把标定过的相机信息写入config文件中就运行 xff0c 这样运动轨迹会抖动十分严重 xff0c 里程计很容易漂 接下来将介绍如何标定D435i相机 xff0
  • 【C语言】--- while(1)语句内的if(i--)的无限循环

    例子 span class token macro property span class token directive keyword include span span class token string lt stdio h gt
  • uC/OS-III移植后发现程序停在空闲任务出不来

    今天移植了一下UCOS III的源码到STM32F103RCT6的板子上 xff0c 然后发现在所有任务都初始化完成后 xff0c 使用OSTimeDlyHMSM函数进行延时后就再也跳不出空闲任务了 xff0c 当时还以为是在移植程序的时候
  • 对uC/OS-III时钟节拍运转机制的一点理解

    目录 如何产生时基信号系统时钟中断管理时基任务时基列表更新写在最后 我在初学uC OS III的时候 xff0c 时基产生后到底是如何去驱动操作系统运转的 xff0c 对于这个问题一直有很多疑问 xff0c 最后读了手册并且仔细推敲源码后终
  • Altium Designer 常见的问题和解决办法,常更!

    本人的Altium Designer 版本是18 1 8 问题1 xff1a AD左上角有一个坐标显示框 xff0c 今天按键盘不小心弄没了 xff0c 然后弄出来后发现又会随着鼠标移动跟着移动 xff0c 不再固定到左上角了 相关解释 x
  • 推荐一款串口调试助手(win10,无广告,功能齐全,操作简单)

    目录 1 安装2 打开软件3 测试功能4 使用脚本功能5 波形显示功能6 升级专业版 作为一个搞嵌入式软件的 xff0c 串口是我们经常需要使用的一个外设资源 xff0c 对应的我们在调试的时候就需要用到一些工具 xff0c 本人也用过目前
  • STM32L1单片机的ADC必须开启HSI才能工作

    之前玩过F1和F4的板子 xff0c 这段时间 xff0c 接个项目需要用低功耗 xff0c 所以就整了STM32L151单片机 xff0c 然后今天在写ADC的时候 xff0c 发现了一个问题 xff0c 就是STM32L151MCU必须
  • 深入理解Linux文件系统与日志文件,快来看!

    目录 一 inode与block1 1 inode和block概述1 2 inode的内容 1 11 3 inode的内容 1 21 4 inode的内容 1 31 5 inode的号码1 6 文件存储小结1 7 inode的大小1 8 i
  • AT 指令集详解

    AT 指令集详解 1 AT的历史与应用1 1 AT的历史1 2 AT的优点1 3 AT命令与ppp协议的关系 2 AT的命令格式3 DCE的状态切换与AT的命令拨号流程3 1 初始化DCE的Modem设备3 2 拨号连接3 3 数据传输及处
  • 幽暗的廊桥,热烈的遗梦:火了25年的中年“杰克苏”童话

    廊桥是一种有遮盖的桥梁 路人经过一段幽暗隐蔽的空间后 xff0c 已身在彼岸 廊桥遗梦 的作者罗伯特 詹姆斯 沃勒于2017年3月10日凌晨 xff0c 在美国德克萨斯州弗雷德里克斯堡的家中去世 xff0c 享年77岁 作者当年如有神助 x
  • STM32L152 实现电源电压采集 基于HAL库实现

    CudeMX中对相关ADC的配置 这里用ADC1的通道17 keil中 自己编写 ADC Getvalue的值的函数 在主函数中调用 在debug模式下 可以在watch窗口中看见相关值 单位为mv
  • 基本共射放大电路的动态分析以及放大电路Q点的稳定

    求解静态 xff1a 直流通路 xff1a VCC 61 Ubeq 43 Ibq Rb gt Ibq gt Ieq 2 动态分析 xff1a 交流通路 xff1a H参数等效 xff1a 在放大过程中 xff1a 动态的Ube秉承动态的Ib
  • FreeRTOS 创建任务

    用已经移植好的工程模板 创建一个简单的任务 xff08 电量LED灯 xff09 1 硬件初始化 需要用到开发板上的LED灯小江LED灯相关的函数初始化 xff0c 在main c中创建一个Init xff08 xff09 函数 xff0c
  • 差分放大电路及动态分析

    由温度引起的零点漂移成为温漂 xff0c 引入负反馈 加入Re电阻 从抑制温度漂移的角度来说 希望Re越大越好 但是会导致放大倍数变小 加一个镜像的电路可以让两边一起浮动 但是两个Re可以共用一个 于是改成下面的 形式 Re电阻现在的作用变
  • FreeRTOS的启动流程

    目前的RTOS中有两种比较流行的启动方式 万事俱备 只欠东风 xff1a 在main函数中将硬件初始化 xff0c rtos系统初始化 xff0c 所有任务的创建都完成 再启动RTOS的调度器 xff08 在刚刚创建的的任务中选择一个优先级