当前位置: 首页 > news >正文

【嵌入式——FreeRTOS】启动任务调度器

【嵌入式——FreeRTOS】启动任务调度器

  • 开启任务调度器
  • vTaskStartScheduler()
  • xPortStartScheduler()
  • prvStartFirstTask()
  • 启动第一个任务

开启任务调度器

用于启动任务调度器,任务调度器启动后,FreeRTOS便会开始进行任务调度。

//启动任务,开启调度
vTaskStartScheduler();xTaskCreate((TaskFunction_t)start_thread,(const char *)"Initialize all task",(uint16_t)START_THREAD_STKSZ,(void *)NULL,(UBaseType_t)(START_THREAD_PRIO),(TaskHandle_t *)&start_tid);vTaskStartScheduler();

vTaskStartScheduler()

内部实现

  1. 创建空闲任务;
  2. 如果使能软件定时器,则创建定时器任务;
  3. 关闭中断,防止调度器开启之前或过程中受中断干扰,会在运行第一个任务时打开中断;
  4. 初始化全局变量,并将任务调度器的运行标志设置为已运行;
  5. 初始化任务运行时间统计功能的时基定时器;
  6. 调用函数xPortStartScheduler()。

xPortStartScheduler()

该函数用于完成启动任务调度器中与硬件架构相关的配置部分,以及启动第一个任务。
内部实现

  1. 检测用户在FreeRTOSConfig.h文件中对中断的相关配置是否有误;
  2. 配置PendSV和SysTick的中断优先级为最低优先级;
  3. 调用函数vPortSetupTimerInterrupt()配置SysTick;
  4. 初始化临界区嵌套计数器为0;
  5. 调用函数prvEnableVFP()使能FPU;
  6. 调用函数prvStartFirstTask()启动第一个任务。

prvStartFirstTask()

  1. 复位MSP初始值;
  2. 使能中断;
  3. 触发SVC中断
    1. 获取当前优先级最高的任务控制块pxCurrentTCB
    2. 将该任务的寄存器值出栈至CPU寄存器中
    3. 设置PSP
    4. 返回R14,执行第一个任务函数

启动第一个任务

prvStartFirstTask()用于初始化启动第一个任务前的环境,主要是重新设置MSP指针,并使能全局中断。

MSP指针:程序在运行过程中需要一定的栈空间来保存局部变量等一些信息,当有信息保存到栈中时,MCU会自动更新SP指针,ARM Cortex-M内核提供了两个栈空间;

主堆栈指针(MSP):由OS内核、异常服务例程以及所有需要特权访问的应用程序代码来使用;
进程堆栈指针(PSP):用于常规的应用程序代码(不处于异常服务例程中时)。
在FreeRTOS中,中断使用MSP,中断以外使用PSP。
使用时间片调度需要把宏configUSE_TIME_SLICING和configUSE_PREEMPTION置为1

http://www.lryc.cn/news/388318.html

相关文章:

  • EFCore_客户端评估与服务端评估
  • Java面试题--JVM大厂篇之深入了解G1 GC:高并发、响应时间敏感应用的最佳选择
  • SAP配置发布WebService接口并调用(超级详细)
  • 中英双语介绍美国首都:华盛顿哥伦比亚特区(Washington, D.C.)
  • java:aocache的单实例缓存(一)
  • pcap包常见拆分方法
  • C++中的类型转换操作符:static_cast reinterpret_cast const_cast dynamic_cast
  • MySQL-SQL优化Explain命令以及参数详解
  • 别只会重启了!进来告诉你AP无法上线怎么办
  • 数据恢复篇:如何在 Android 手机上恢复未保存/删除的 Word 文档
  • Python | Leetcode Python题解之第208题实现Trie(前缀树)
  • Ethernet是以太网通讯
  • 咖啡消费旺季到来 为何想转让的库迪联营商却越来越多
  • 神经网络原理
  • 安卓应用开发学习:获取经纬度及地理位置描述信息
  • 各类排序方法 手撕快排 回顾经典快排 优化版快排
  • 独一无二的设计模式——单例模式(Java实现)
  • 使用MoA(Mixture of Agents)混合智能体技术,结合多个开源大语言模型如Llama3、phi-3和Mistral,实现一个强大的AI智能体
  • 前端面试题_Css
  • AI在线免费视频工具3:声音生视频
  • final、const、readonly关键字在不同语言中代表着什么
  • HarmonyOS ArkUi Tabs+TabContent+List实现tab吸顶功能
  • Hugging Face Accelerate 两个后端的故事:FSDP 与 DeepSpeed
  • TextField是用于在用户界面中输入文本的控件。它广泛应用于表单、搜索框、评论区等需要用户输入文字的场景
  • MYSQL 四、mysql进阶 5(InnoDB数据存储结构)
  • Spring企业开发核心框架-下
  • X射线底片焊缝缺陷检测
  • 直播的js代码debug解析找到protobuf消息的定义
  • 详细学习es6扩展运算符
  • HEC-HMS水文模型教程