[CMSIS-RTOS2]rtos 基本概念

2023-05-16

特点:

利于采用更加面向对象的设计方法。

多任务处理

相较于过程化的C, 需要考虑的是任务线程设计及线程间的数据流。

有助于项目管理、代码重用和软件测试

rtos需要额外的内存,中断响应变慢。

基本元素:

任务调度器: 支持round-robin、抢占式的多任务调度。

时间管理:

内存管理:mem pool

线程间通信:event group、semaphore、mutex、message

线程:

----------------------------------------------------------------

任务调度:

调度器使用SysTick timer来生成周期性中断。

调度器为每个线程分配一个时间片。每个线程轮流执行。

线程具有优先级属性,高优先级抢占低优先级。只有高优先级线程进入等待状态,低优先级线程才能被调度到。

调度时,需要将当前线程变量状态保存到线程stack中。所有当前线程的runtime信息保存在tread control block。

tread control block 包含线程的状态信息。

线程的三个状态  running、 ready、 wait

----------------------------------------------------------------

rtos的启动:

main函数中调用osKernelInitialize()来setup tros。

在这之前,不能调用任何rtos function。

osKernelInitialize完成后,可以创建线程和其他对象。

之后调用osKernelStart,任务调度器开始进行任务调度。

可以在启动rtos前进行各外设和硬件的初始化。

------------------------------------------------------------------

线程属性:

osThreadId : 线程id

osThreadAttr_t: 线程参数

thread_id = osThreadNew(threadFunc, threadAttr);

或 thread_id = osThreadNew(threadFunc, param, threadAttr);

线程可以在任意线程内创建。不能在isr中创建。不能在os init前创建。

线程函数: void threadFunc(void * argument)

线程状态:

osThreadInactive  创建后未运行

osThreadReady  : ready for run

osThreadRunning : running

osThreadBlocked :  delayed, wait for an event or suspended. 

osThreadTerminated : 终止的, 但是资源未释放。适用于joinable 线程。

osThreadError :线程不存在,不能被调度

osThreadReserved 保留

-----------------------------------------------------------------

线程优先级:

osPriorityNone     No priority (not initialized).

osPriorityIdle       Reserved for Idle thread.

osPriorityLow      Priority: low.

osPriorityLow1    Priority: low + 1.

。。。。。。

osPriorityLow7     Priority: low + 7.

osPriorityBelowNormal    Priority: below normal.

osPriorityBelowNormal1    Priority: below normal + 1.

。。。。。。

osPriorityBelowNormal7    Priority: below normal + 7.

osPriorityNormal       Priority: normal.

osPriorityNormal1      Priority: normal + 1.

。。。。。。

osPriorityNormal7    Priority: normal + 7.

osPriorityAboveNormal     Priority: above normal.

osPriorityAboveNormal1    Priority: above normal + 1.

。。。。。

osPriorityAboveNormal7     Priority: above normal + 7.

osPriorityHigh      Priority: high.

osPriorityHigh1     Priority: high + 1.

。。。。。。

osPriorityHigh7     Priority: high + 7.

osPriorityRealtime      Priority: realtime.

osPriorityRealtime1     Priority: realtime + 1.

。。。。。。

osPriorityRealtime7      Priority: realtime + 7.

osPriorityISR      Reserved for ISR deferred thread. 最高优先级。 用户线程不能使用。

osPriorityError    System cannot determine priority or illegal priority.

osPriorityReserved     Prevents enum down-size compiler optimization.

---------------------------------------------------------------------

线程 接口:

 

const char * osThreadGetName(osThreadId_t thread_id)

osThreadId_t osThreadGetId(void )

osThreadState_t osThreadGetStat(osThreadId_t thread_id)

osThreadSetPriority

osThreadGetPriority

osThreadYield  将运行权限转给同级别ready线程,如果没有则继续执行。

osThreadSuspend  ,立刻挂起到block state, 直到调用osThreadResume 恢复执行。

osThreadResume    将线程状态置回ready 状态。

osThreadDetach    将线程属性置成osThreadDetached.  调用后线程不能被osThreadJoin join。 当detached线程终止,所有资源被释放。对已经detach的线程执行osThreadDetach,这个操作为undefined。 

osThreadJoin      等待一个线程结束。 这个线程必须是joinable的。默认情况下线程创建后为osThreadDetached状态?。

join和detach的区别: join被调用后, 调用的线程会被block,直到线程的执行完成。join返回后,线程对象可以被销毁。

当detach调用后,线程对象可以被销毁,同时os执行的线程可以继续。想要知道线程何时结束需要其他机制。https://blog.csdn.net/xibeichengf/article/details/71173543

osThreadExit 终止调用的线程。

osThreadTerminate  将线程id指定的线程从active list中移除。线程被终止并运行其他线程,如果没有其他线程可执行,则线程不被终止,返回osThreadError. Joinable 线程不会被销毁,而是返回osThreadTerminated 直到调用osThreadJoin。

osThreadGetStackSize

osThreadGetStackSpace  返回未使用的stack space。

osThreadGetCount  返回active threads 数量。

osThreadEnumerate 说明文档描述不清。有疑问。

-----------------------------------------------------------------------------------------

multiple instances:同一段线程代码可以创建多个线程实例。 例如用于控制uart的线程,可以通过传递param来决定哪个线程控制哪个uart。

----------------------------------------------------------------------------------------

joinable thread: 线程可以被创建为joinable thread, 在运行时消耗一块内存,完成工作后terminate,释放内存。joinable thread 在创建时,设置attr_bits = osThreadJoinable

--------------------------------------------------------------------------------------

时间管理:

osDelay : 令调用线程进入WAIT_DELAY状态。延时结束时,线程被置为ready状态,

osDelayUntil(ticks)  absolute delay, 延时到指定tick。 与之相关的timer函数有:

osKernelGetTickCount(void)

osKernelGetTickFreq(void)

osKernelGetSysTimerCount(void)

 osKernelGetSysTimerFreq(void)

虚拟Timer:

osTimerId_t osTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr)
const char * osTimerGetName (osTimerId_t timer_id)
osStatus_t osTimerStart (osTimerId_t timer_id, uint32_t ticks)
osStatus_t osTimerStop (osTimerId_t timer_id)
uint32_t osTimerIsRunning (osTimerId_t timer_id)
osStatus_t osTimerDelete (osTimerId_t timer_id)

例子:

one_shot_id = osTimerNew(one_shot_Callback, osTimerOnce, (void *)0, NULL);

periodic_id = osTimerNew(periodic_Callback, osTimerPeriodic, (void *)5, NULL);

osTimerStart(one_shot_id, 500U);

osTimerStart(periodic_id, 1500U);

osTimerDelete(one_shot_id);

osTimerDelete(periodic_id);

 

Idle Thread:

系统内无其他线程运行时运行的默认线程,拥有最低优先级。 可以在其中放一些功能,比如让系统进入低功耗模式。 等SysTick timer中断唤醒系统,任务调度器运行处于ready的线程,如果没有ready线程则再次进入idle线程进入低功耗模式。

--------------------------------------------------------------------------------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

[CMSIS-RTOS2]rtos 基本概念 的相关文章

  • python两个 list 获取交集,并集,差集的方法

    1 获取两个list 的交集 方法一 a 61 2 3 4 5 b 61 2 5 8 tmp 61 val for val in a if val in b 列表推导式求的两个列表的交集 print tmp 2 5 方法二 print li
  • 报错:EL1007E: Property or field 'name' cannot be found on null

    SpringBoot集成thymeleaf做开发遇到的错误 Caused by org springframework expression spel SpelEvaluationException EL1007E Property or
  • Docker-1.0>>>>>>初阶学习

    文章目录 Docker学习总结一 Docker的安装 xff1a 二 Docker常用命令1 帮助命令 xff1a 2 镜像命令 xff1a 3 容器命令 xff1a 三 镜像详解四 容器数据卷 xff08 持久化 xff0c 数据共享 x
  • 报错:iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5000

    Docker启动容器报错 docker Error response from daemon driver failed programming external connectivity on endpoint myrabbit 详细信息
  • 报错:yum install 安装时报yum doesn't have enough cached data to continue

    yum install 安装时报错 One of the configured repositories failed 未知 and yum doesn t have enough cached data to continue At th
  • Logback和Log4j详解

    文章目录 日志框架前言 一 日志简介1 什么是日志 xff1f 2 日志的用途 xff1f 二 常用的日志框架1 日志门面2 logback xff08 更快的执行速度使其成为主流 xff09 2 1 引入依赖2 2 编写xml文件2 3
  • cpu占用过高解决方案实践

    今天在查看项目服务器的时候 xff0c 发现cpu一直占用99 多 xff0c 于是就有了这篇文章 1 找到占用cpu高的进程 通过top命令来查看cpu占用高的进程有哪些 xff0c 如图 xff1a top 这里的pid代表的就是进程i
  • Java Stream流常用功能示例

    Steam流是Java8的新特性 xff0c 今个工作中经常用的功能写法 按条件过滤 collect span class token punctuation span span class token function stream sp
  • Mysql-->Binlog的查看

    一 使用Navicat查看binlog信息 1 查看binlog的信息 span class token keyword show span variables span class token operator like span spa
  • Linux开发环境配置---Java、Maven、Git和Nodejs

    Linux开发环境配置 1 Java环境 span class token comment 1 下载Java软件包 xff0c orcal或者openjdk都可以 xff0c 并上传到linux服务器 span span class tok
  • Linux下安装及简单使用nmap

    nmap是一款非常实用的扫描工具 xff0c 适用于linux windows mac三大主流平台 小编使用centos编译安装nmap 7 01版本 下载包 xff1a wget http nmap span class hljs pre
  • VNC server简单配置vnc

    linux 下VNC的配置 下面的命令可以结合远程shell 来进行 进程查找 xff1a ps ef grep i vnc 系统中一共有两个vnc xff1a 一个是系统管理自带的路径为 xff1a system gt perferenc
  • 元学习

    元学习是要学会任务中的特征表示 xff0c 从而在新任务上泛化 元学习主要解决的是学会如何学习的问题 元学习主要包括 xff1a zero shot One shot Few shot learning 元学习的主要方法包括 xff1a 基
  • windows media Foundation

    转自 xff1a https docs microsoft com en us windows desktop medfound microsoft media foundation sdk Microsoft Media Foundati
  • vscode nodemon打断点

    span class token number 1 span xff0c 修改 span class token keyword package span span class token punctuation span json spa
  • putty远程连接centos7的问题(time out)

    我在使用putty远程连接centos7时 xff0c 碰见了time out以及connection refused 的问题 现在总结一下 xff0c 以免之后再被绊倒 一 xff0c time out 问题分析 xff1a 我遇到的ti
  • Marvell 98DX3236系列交换机Uboot及内核文件烧写

    1 开发环境 开发板硬件相关 1 交换机开发板型号 RD XC3 24G4XG B 2 交换机CPU型号 98DX3236 3 交换机PHY芯片型号 88E1680 开发板软件相关 1 CPLD LC4032V 程序 ac3 24p jed
  • k8s学习笔记-部署Flannel网络

    主机列表 本次实验选择5台主机 xff0c 3台作为master主机 xff0c 2台作为node节点 节点ipOS版本hostname f安装软件192 168 0 1RHEL7 4k8s master01docker etcd flan
  • ROS教程四——编写Publisher和Subscriber节点(C++篇)

    本教程介绍如何使用C 43 43 编写发布者和订阅者节点 1 编写 Publisher Node 节点 是连接到ROS网络的可执行文件的ROS术语 现在将创建一个发布者 xff08 publisher talker xff09 节点 xff
  • 在Ubuntu系统中设置中文!!!

    建议在观看本篇前先观看上一篇修改Ubuntu系统下载源 Ubuntu系统下面可以配置中文 1 xff0c 设置 gt 系统设置 2 xff0c 选择区域与语言 单击管理已安装的语言 3 xff0c 单击添加或者删除语言 4 xff0c 选择

随机推荐

  • 视觉问答项目

    视觉问答项目 1 项目地址 本笔记项目包括如下 xff1a MCAN Deep Modular Co Attention Networks for Visual Question Answering 用于VQA的深层模块化的协同注意力网络
  • 基于形状的模板匹配(Shape-Based)

    称为基于边缘方向梯度的匹配 xff0c 是一种最常用也是最前沿的模板匹配算法 xff08 一 xff09 根本思想 以物体边缘的梯度相关性作为匹配标准 xff08 二 xff09 原理 提取ROI中的边缘特征 xff0c 结合灰度信息创建模
  • Hadoop基础教程-第7章 MapReduce进阶(7.1 MapReduce过程)(草稿)

    第7章 MapReduce进阶 7 1 MapReduce过程 7 1 1 input 一般而言 xff0c 数据文件都会上传到HDFS上 xff0c 也就是说HDFS上的文件作为MapReduce的输入 已知block块大小是128M x
  • RedHat Linux 5企业版开启VNC Server远程桌面功能手记

    环境 xff1a RedHat Linux 5企业版 Xwindows xff1a gnome xff08 红帽默认安装的图形界面 xff09 尽管我们可以使用SSH连接远程通过字符界面来操作Linux xff0c 但是对于更多熟悉图形人来
  • man: can't change directory to '/root': Permission denied

    执行 man 命令报错 man can t change directory to root Permission denied man command exited with status 255 sed e 错误原因 用户权限不够 解决
  • 树莓派3B入门开发之(一)--简介

    介绍 树莓派3B 树莓派是一个小型的单板计算机 通过将键盘 xff0c 鼠标 xff0c 显示器等外围设备连接到Raspberry Pi xff0c 它将作为一台迷你个人电脑 Raspberry Pi广泛用于实时图像 视频处理 xff0c
  • 3.19、BI之SSIS之数据流转换(合并)

    BI之SSIS之数据流转换 xff08 Union xff09 1 使用 合并 前必须先对数据进行排序 xff0c 否则会报错 xff0c 而union all则不需要排序 xff0c 这是它们二者的区别 2 新建SSIS包 3 控制流 拖
  • 3.20、BI之SSIS之数据流转换(合并连接)

    BI之SSIS之数据流转换 xff08 合并连接 xff09 1 合并联接转换功能是将两个已排序的输入列的数据通过使用FULL JOIN Left JOIN或INNERR JOIN联接形成一个输出数据集 它类似于T SQL语句中的连接查询语
  • 缓存小技巧--异步更新缓存时remove cache数据

    在支撑大规模 高并发 高可用的互联网应用中 xff0c 异步更新分布式缓存的应用已经越来越多了 xff08 为什么是异步更新缓存 xff0c 因为异步不仅可以提高系统性能 xff0c 而且提高系统的伸缩性和可用性 xff09 xff0c 由
  • pixhawk 2.4.6 pix2.4.8 原理图PCB二层板

    pixhawk 2 4 6 pix2 4 8 原理图PCB二层板 www cirmall com circuit 21579
  • Dockerfile简单使用入门

    什么是 Dockerfile xff1f Dockerfile 是一个用来构建镜像的文本文件 xff0c 文本内容包含了一条条构建镜像所需的指令和说明 docker build命令用于从Dockerfile构建映像 可以在docker bu
  • 什么是私有云?您应该知道的 6 个优势

    私有云是指单个业务实体或目标用户可以单独访问特定云计算环境中指定的硬件和软件资源 私有云类似于其他形式的云环境 xff0c 因为它通过物理组件提供虚拟化资源 私有云的优势 私有云的六大主要优势包括可预测的服务器使用 提高资源利用率 降低成本
  • CORD 4.1:打造实现边缘计算的最佳平台

    开放网络基金会 xff08 ONF xff09 周一发布了CORD 4 1版本的代码 xff0c 该版本的代码新增的功能为CORD项目注入了新的活力 xff0c 该版本是CORD项目独立一年半以来发布的一个重要的版本 xff0c 本次版本的
  • linux 查看动态库和可执行程序依赖库

    Linux动态库 一 objdump二 readelf三 ldd四 进程是否依赖指定五 动态库搜索路径顺序 一 objdump span class token comment 查看依赖的库 span objdump x xxx so sp
  • putty远程连接linux显示连接超时

    这个问题可真坑爹啊 一开始我百度谷歌了老长时间 xff0c ping一下也没有问题 xff0c 原来是关电脑后虚拟机的ip会发生变化 xff0c 重新连接就好了 xff0c 希望对大家有所帮助
  • Ubuntu 14.04安装openssh7.5

    因公司系统上线 xff0c 客户方 xff08 中国电信 xff09 入网需要系统安全评估报告 xff0c 根据第三方公司测试 xff0c 测出openssh有远程漏洞 xff0c 第三方测试公司提出整改建议 xff0c 升级最新的open
  • ovs测试vlan

    ovs端口默认是trunk模式 xff0c 且所有的VLAN tag都可以通过 单个网桥实现vlan隔离的场景 实验拓扑如下 xff1a 1 首先创建一个网桥ovs switch xff0c 在命名空间里创建两个接口p0和p1 分别分配地址
  • [STM32CubeIDE]FreeRTOS创建线程的方法

    1 在Device Configuration Tool 中 xff0c 依次选择Pinout amp Configuration gt Categories gt Middleware gt FREERTOS interface 选择CM
  • [STM32CubeIDE]使用freertos时Timebase Source为什么不能设定为SysTick

    参考https www digikey com en maker projects getting started with stm32 introduction to freertos ad275395687e4d85935351e16e
  • [CMSIS-RTOS2]rtos 基本概念

    特点 xff1a 利于采用更加面向对象的设计方法 多任务处理 相较于过程化的C xff0c 需要考虑的是任务线程设计及线程间的数据流 有助于项目管理 代码重用和软件测试 rtos需要额外的内存 xff0c 中断响应变慢 基本元素 xff1a