【学习笔记】rt-thread

任务

  • 创建好任务,不管是动态还是静态创建,任务的状态是init ,通过start方法来启动任务;
  • 线程大小 设置小了,无法正常工作?显示占空间100%

启动过程

TODO 这是编译器特性?

因为RT-Thread使用编译器(这里仅讲解KEIL,IAR或 者GCC稍微有点区别,但是原理是一样的)自带的$Sub$$和$Super$$这两个符号来扩展了main函数,使 用$Sub$$main可以在执行main之前先执行$Sub$$main,在$Sub$$main函数中我们可以先执行一些预操作,

RT-Thread通过扩展main函数的方式都在component.c 里面实现了硬件初始化,系统初始化

启动过程中函数sub and super - CC-ARM编译器的特性

S u b Sub Sub$ 与 S u p e r Super Super$ 的“补丁”功能(_CC_ARM编译器环境)

extern void ExtraFunc(void);     /* 用户自己实现的外部函数*/void $Sub$$function(void)
{ExtraFunc();                 /* 做一些其它的设置工作 */$Super$$function();          /* 回到原始的function函数 */
}/* ==在执行function函数执行会先执行function的扩展函数$Sub$$function,在扩展函数里面执行一些扩展的操作,
当扩展操作完成后,最后必须调用$Super$$function函数通过它回到我们原始的function函数== */
void function(void)
{/* 函数实体 */
}

main 是初始线程-main_thread_entry【main d的 while 需要吗?】

在这个初始线程里面创建各 种应用线程,当所有应用线程都成功创建好后,初始线程就把自己关闭。那么这个初 始线程就在rt_application_init()里面创建

注意他的优先级 是 最大/3
TODO 等下测试下;打印线程列表
在这里插入图片描述
在原有 main 函数中的while循环 还需要吗?一般不需要,没事做就不需要
只有在不写成while时 才会退出该线程;
【解释了一个现象,这种写法是错误的,强制占用该线程,导致所有优先级比 main_thread低的都无法执行(main 的优先级是 max/3)】

main(){
while(1){
//什么也没有
}
}

初始化内核

  • 板级硬件初始化
  • 定时器初始化-线程
  • 调度器初始化-任务模块
  • 信号量初始化
  • 空闲线程

线程设计

  • 中断函数 不能使用挂起当前线程的操作,
  • 不允许调用任何会阻塞运行的API函数接口
  • 空闲线程是唯一不允许出现阻塞情况的线程
  • 一般来说处理时间更短的线程优先级应设置更高一些。

执行时间

线程的执行时间一般是指两个方面,一是线程从开始到结束的时间-线程本身运行的时长,二是线程的周期-响应时间。
一般来说处理时间更短的线程优先级应设置更高一些,因为即时低优先级被抢占,也花费不了多少时间;

在系统设计的时候这两个时间候我们都需要考虑,例如,对于事件A对应的服务线程Ta,系统要求的实时响应指标是10ms,而Ta的最大运行时间 是1ms,那么10ms就是线程Ta的周期了,1ms则是线程的运行时间,简单来说线程Ta在10ms内完成对事件A的响应即可。此时,系统中还存在着 以50ms为周期的另一线程Tb,它每次运行的最大时间长度是100us。在这种情况下,即使把线程Tb的优先级抬到比Ta更高的位置,对系统的实 时性指标也没什么影响,因为即使在Ta的运行过程中,Tb抢占了Ta的资源,等到Tb执行完毕,消耗的时间也只不过是100us,还是在事件A规定 的响应时间内(10ms),Ta能够安全完成对事件A的响应。但是假如系统中还存在线程Tc,其运行时间为20ms,假如将Tc的优先级设置比Ta更高, 那么在Ta运行的时候,突然间被Tc打断,等到Tc执行完毕,那Ta已经错过对事件A(10ms)的响应了,这是不允许的。所以在我们设计的时候, 必须考虑线程的时间,一般来说处理时间更短的线程优先级应设置更高一些。

参考资料

内核移植 cortex-M

上下文切换
中断开关

接口-全局中断开关

PRIMASK 寄存器只有一位,屏蔽所有的可屏蔽中断

任务栈的初始化

cortex-m3的核心寄存器
在这里插入图片描述

主堆栈指针(MSP)进程堆栈指针(PSP)


R13在任何时刻只能是其中一个,默认情况为MSP,可以通过控制寄存器(CONTORL)来改变。

一般情况下,没有必要使用PSP,除非是有os存在时,MSP用于os内核的sp,而PSP用于thread级app的sp,这两个sp需严格分开。

LR 返回的地址

PC 当前运行地址

在这里插入图片描述

其他

create and init

创建- 动态创建对象 动态的内存,从无到有
初始化-静态创建对象,本来就有,静态的数据;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/624541.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态规划算法求解最长公共子序列

动态规划算法是运筹学中求解多阶段决策问题的经典算法,本文将介绍动态规划算法的基本思想,并介绍如何使用动态规划算法求解最长公共子序列问题。 1. 动态规划算法的基本思想 动态规划算法本质也是基于分治思想,将待求解问题分解成若干个子问…

13.继承(基类、派生类、同名函数、同名变量、虚拟继承、虚拟继承的原理、继承关系和访问限定符)

1.继承的概念及定义 1.1继承的概念 ​ 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的…

区块链知识总结——以太坊的账户

账户分类 在以太坊中,账户是参与交易和执行智能合约的基本单位。以太坊账户分为两种类型:外部账户(Externally Owned Account)和合约账户(Contract Account)。 外部账户(Externally Owned Acc…

数据库讲解---(数据更新、视图、数据控制)【MySQL版本】

目录 前言 一.数据更新 1.1插入数据 1.1.1插入单个元组 1.1.2将一个新学生记录(学号:091530,姓名:夏雨,性别:男,籍:海南,出生年份:1999,学院:计算机)插入到学生表中 1.1.3插入子查询结果 1.1.4有一个表“DEPT”(SDEPT CHAR(20),AVG_AGE SMALLINT)表示每个学院的学生的平…

2.2 iHRM人力资源 - 主页权限认证、Vux共享用户资料

iHRM人力资源 - 主页权限认证、主页内容展示 2.IHRM人力资源 - 登录-CSDN博客 文章目录 iHRM人力资源 - 主页权限认证、主页内容展示一、主页权限认证1.1 主页权限认证分析1.2 主页权限认证 - permission.js1.2.1 进度条部分1.2.2 token 认证 二、Vuex共享用户资料2.1 需求分析…

深入理解大语言模型微调技术

一、概念解析 1、什么是微调(Fine-tuning)? 大模型微调,也称为Fine-tuning,是指在已经预训练好的大型语言模型基础上(一般称为“基座模型”),使用特定的数据集进行进一步的训练&am…

【Delphi 爬虫库 1】GET和POST方法

文章目录 1.最简单的Get方法实现2.可自定义请求头、自定义Cookie的Get方法实现3.提取响应协议头4.Post方法实现单词翻译 爬虫的基本原理是根据需求获取信息并返回。就像当我们感到饥饿时,可以选择自己烹饪食物、外出就餐,或者订外卖一样。在编程中&#…

ROS 2边学边练(26)-- 监测参数变化(C++)

前言 通常,一个节点需要对其自身参数或另一个节点的参数的更改做出响应。ParameterEventHandler类使监听参数更改变得容易,这样代码就可以对它们做出响应。 动动手 创建一个包 进入工作空间根路径的src下(ros2_ws/src)&#xff…

基于区块链Hyperledger FabricV2.5的农产品溯源/商品/通用溯源应用系统模板

本项目所有相关文档包括区块链设计、后端设计、前端设计、结合IPFS改进以及简易的二次开发步骤收录于:《Fabric项目学习笔记》,当前本项目文档已全部发布。 购买专栏前请认真阅读:《Fabric项目学习笔记》专栏介绍 本项目的代码讲解与二次开发…

Unity 左右折叠显示与隐藏UI的简单实现

要实现一个简单的UI左右折叠显示与隐藏,可以结合遮罩,通过代码控制UI区块的宽度和位移来实现。 具体可以按以下步骤实现: 1、新建一个Image组件,并添加精灵,调整大小后,复制一份作为该UI的父物体&#xf…

光纤不够用怎么办?使用DWDM波分进行低成本扩容光纤容量

光通信行业一直有CWDM/DWDM/LWDM,波分复用(WDM)是一种光纤传输技术,可以使用多种光波长(或颜色)在同一介质上发送数据。两个或多个波长可以在一根光纤上传播,并且可以在光波导中以不同的波长或光…

阿赵UE学习笔记——28、粒子系统Niagara简介

阿赵UE学习笔记目录 大家好,我是阿赵。   继续学习虚幻引擎的使用。这次开始学习粒子系统的使用。 一、Cascade系统 在介绍UE5的Niagara系统之前,必须先介绍一下旧版本的粒子系统。   在UE4的时候,虚幻引擎的粒子系统叫做Cascade&#x…