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

【学习笔记】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.lryc.cn/news/339729.html

相关文章:

  • 一文掌握 React 开发中的 JavaScript 基础知识
  • 读天才与算法:人脑与AI的数学思维笔记01_洛夫莱斯测试
  • 嵌入式系统的时间保存问题,hwclock保存注意事项
  • jenkins(docker)安装及应用
  • uni-app中,页面跳转前,进行拦截处理的方法
  • Jmeter参数化的 4 种方式用法总结
  • 华为OD机试 - 连续天数的最高利润额(Java 2024 C卷 100分)
  • C语言——内存函数的实现和模拟实现
  • 如何优化邮箱Webhook API发送邮件的性能?
  • OceanBase V4.X中常用的SQL(一)
  • 代码随想录算法训练营第五十天|123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV
  • Composer安装与配置:简化PHP依赖管理的利器(包括加速镜像设置)
  • 灯塔:抽象类和接口笔记
  • mybatis 入门
  • Spring-AI-上下文记忆
  • 内存函数memcpy、mommove、memset、memcmp
  • symfony框架介绍
  • 【计算机毕业设计】游戏售卖网站——后附源码
  • LabVIEW电信号傅里叶分解合成实验
  • Docker 学习笔记(六):挑战容器数据卷技术一文通,实战多个 MySQL 数据同步,能懂会用,初学必备
  • csdn怎么变得这么恶心,自动把一些好的文章分享改成了vip可见
  • 自然语言处理NLP:文本预处理Text Pre-Processing
  • 家庭网络防御系统搭建-虚拟机安装siem/securityonion网络连接问题汇总
  • 2024年外贸行业营销神器推荐
  • k8s高可用集群部署介绍 -- 理论
  • 【GDAL-Python】1-在Python中使用GDAL读写栅格文件
  • 【C++】explicit关键字详解(explicit关键字是什么? 为什么需要explicit关键字? 如何使用explicit 关键字)
  • maven引入外部jar包
  • 李沐37_微调——自学笔记
  • 【小程序】生成短信中可点击的链接