RTT学习之线程
获得线程:rt_thread_t rt_thread_self(void);
一 线程的创建和删除:
rt_thread_create()创建的句柄,对应的删除rt_thread_delete(),注意线程的删除只是将线程的状态该为close,进入空闲任务才删除。
rt_thread_init()函数对应的是rt_thread_detach()
二 线程的就绪和挂起:RTT只能是讲一个已经就绪的线程挂起,而不能对已经挂起(调用系统延时函数)的任务再执行挂起操作用suspend!
rt_thread_startup(taskn):使当前线程就绪;
rt_err_t rt_thread_suspend (rt_thread_t thread)使当前线程挂起但很少用,除非在调用该函数后立刻调用rt_schedule()进行调度;
对应的恢复就绪rt_err_t rt_thread_resume (rt_thread_t thread)后也紧跟调用rt_schedule();
yield主动切出挂起;rt_thread_yield()函数和rt_schedule()函数的区别:前者从当前线程中切出,插入到本优先级列表尾端,然后转到同优先级的其它线程执行;而后者当前线程不一定切出,只是从调度器重新检查一遍最高优先级就绪任务并执行;
三线程的休眠:
rt_err_t rt_thread_sleep(rt_tick_t tick);
rt_err_t rt_thread_delay(rt_tick_t tick);
rt_err_t rt_thread_mdelay(rt_int32_t ms);
四线程控制:rt_err_t rt_thread_control(rt_thread_t thread, rt_uint8_t cmd, void* arg);使之就绪、删除、或更改优先级
五空闲线程:
void rt_thread_idle_init(void);
void rt_thread_idle_sethook(void (*hook)(void));
rt_err_t rt_thread_idle_delhook(void (*hook)(void));设置的钩子函数必须保证空闲线程在任何时刻都不会处于挂起状态,主要用于设置状态指示(因不能调用系统延时函数,等待信号所以用处不大,最多只能用条件判断的指示灯)。低功耗模式。删除的线程资源回收。
void rt_scheduler_sethook(void (*hook)(struct rt_thread* from, struct rt_thread* to)调度器钩子用以确定在某个时刻发生了什么线程切换。 六 线程设计:
1 需要知道什么时候让线程进入非就绪态,如果一直就绪,低优先级线程就可能得不到执行的机会。
2 需要确定线程的运行周期、运行时间(task1的响应时间(周期)有要求,则要求其它高优先级任务taskn的执行时间不能超过task1的周期)、优先级的因素
3线程创建步骤:
3.0系统启动流程架构:在rt_application_init()中创建main线程($super$$main必须成对使用,这里是让扩展了Main之后返回到用户main,然后删除自己。硬件初始化,系统初始化,
RT-Thread通过扩展main函数的方式都在component.c里面实现,所以在主main中只有用户自己创建的线程。main线程执行到最后,通过LR寄存器指定的链接地址退出,在
创建main线程的时候,线程栈对应LR寄存器的内容是rt_thread_exit()函数,在
rt_thread_exit里面会把main线程占用的内存空间都释放掉

3.1 创建线程函数,执行什么功能;定义线程堆栈和线程控制块(ID:)
3.2用rt_thread_init()初始化线程任务,任务进入初始化态,调用rt_thread_startup(&led1_thread); 后参与线程调度
#define LED1_StackSize 1024
static rt_uint8_t rt_led1_thread_stack[LED1_StackSize];
static struct rt_thread led1_thread;
rt_thread_init(&led1_thread, /* 线程控制块 */ (1)
"led1", /* 线程名字 */ (2)
led1_thread_entry, /* 线程入口函数 */ (3)
RT_NULL, /* 线程入口函数参数 */ (4)
&rt_led1_thread_stack[0], /* 线程栈起始地址 */ (5)
sizeof(rt_led1_thread_stack), /* 线程栈大小 */ (6)
3, /* 线程的优先级 */ (7)
20); /* 线程时间片,相同优先级才起作用,对只有一个线程时那么该参数不起作用 */
,
线程的栈、控制块用的若静态内存(由编译器负责分配),必须由用户手动预先定义,但这种方法我们在使用RT-Thread的时候用的比较少,通常的方法是在线程创建的时候动态
的分配线程栈和线程控制块的内存空间,即推荐使用动态法创建线程(堆栈大小、优先级、时间片最好宏定义给出增加灵活性)。接下来我们讲解下“创建单线程—SRAM动态内存”的方法(堆),在board.c

static rt_thread_t led1_thread = RT_NULL;
led1_thread = /* 线程控制块指针 */ (1)
rt_thread_create( "led1", /* 线程名字 */ (2)
led1_thread_entry, /* 线程入口函数 */ (3)
512, /* 线程栈大小 不用指定起始地址*/ (5)
3, /* 线程的优先级 */ (6)
20); /* 线程时间片 */ (7)
RT_NULL, /* 线程入口函数参数 */ (4)
if (led1_thread != RT_NULL)
rt_thread_startup(led1_thread); /* 启动线程,开启调度 */
else
return -1;
线程的管理:
RT-Thread内核中采用了基于位图的优先级算法(时间复杂度O(1),即与就绪线程的多少无关)。
在系统中除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢占的之外,系统的其他部分都是可以抢占的,包括线程调度器自身。
时间片轮转调度仅在当前系统中无更高优先级就绪线程存在的情况下才有效,也可以是一个任务的2个副本。
RTT学习之线程的更多相关文章
- rtt学习之线程间同步与通信
一 线程间的同步与互斥:信号量.互斥量.实践集 线程互斥是指对于临界区资源访问的排它性,如多个线程对共享内存资源的访问,生产消费型对产品的操作.临界区操作操作方法有: rt_hw_interrupt_ ...
- python自动化开发学习 进程, 线程, 协程
python自动化开发学习 进程, 线程, 协程 前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...
- ORB-SLAM2 论文&代码学习 —— LocalMapping 线程
转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12360913.html 本文要点: ORB-SLAM2 Local ...
- 手写一个线程池,带你学习ThreadPoolExecutor线程池实现原理
摘要:从手写线程池开始,逐步的分析这些代码在Java的线程池中是如何实现的. 本文分享自华为云社区<手写线程池,对照学习ThreadPoolExecutor线程池实现原理!>,作者:小傅哥 ...
- 学习C#线程
2016-12-17 无意间看到了关于C#线程的讲解.经过一下午的学习后,慢慢的对线程也有了一定的理解.这里讲解的是最基础的内容,包括线程的创建.睡眠.等待.终止. 实验环境:Visual studi ...
- java核心知识点学习----创建线程的第三种方式Callable和Future CompletionService
前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的. Call ...
- java SE学习之线程同步(详细介绍)
java程序中可以允许存在多个线程,但在处理多线程问题时,必须注意这样一个问题: 当两个或多个线程同时访问同一个变量,并且一些线程需要修改这个变量时,那么这个 ...
- 从使用到原理学习Java线程池
线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收. 所 ...
- Qt学习:线程间共享数据(使用信号槽传递数据,必须提前使用qRegisterMetaType来注册参数的类型)
Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据 ...
随机推荐
- 内存不足导致的java.lang.OutOfMemoryError: java heap space引出java工程启动参数设置
今天做分类实验,生成了190m的kernel文件,在读到svm中的时候跳出了java.lang.OutOfMemoryError: java heap space异常.随便搜了一下,发现与eclips ...
- officeaddin开发->excel,word另存为html,xml,csv,txt设置编码格式
在excel中设置保存之后的编码格式,需要获取到Microsoft.Office.Interop.Excel.Workbook然后设置其中的webOpetions的编码格式就可以了. workbook ...
- clojure.spec库入门学习
此文已由作者张佃鹏授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. clojure是一门动态类型的语言,在类型检查方面并没有c++/java这种静态类型语言好用,所以多个模块之 ...
- 值得细读!如何系统有效地提升Android代码的安全性?
众所周知,代码安全是Android开发工作中的一大核心要素. 11月3日,安卓巴士全球开发者论坛线下系列沙龙第七站在成都顺利举办.作为中国领先的安卓开发者社区,安卓巴士近年来一直致力于在全国各大城市举 ...
- AngularJS(一)理论篇
前言 大概今年春天的时候,自己对这个词产生了兴趣,那会只是简单的查了一下,并没有深入研究过这部分知识块,现在终于开始接触这些东西. 内容 AngularJS在web应用方面是一个非常完美的JavaSc ...
- 【bzoj4800】: [Ceoi2015]Ice Hockey World Championship dfs
[bzoj4800]: [Ceoi2015]Ice Hockey World Championship N<=40所以如果直接dfs背包会TLE 考虑Meet-in-the-middle 如果把 ...
- 模板【洛谷P3811】 【模板】乘法逆元
P3811 [模板]乘法逆元 给定n,p求1~n中所有整数在模p意义下的乘法逆元. T两个点的费马小定理求法: code: #include <iostream> #include < ...
- 2017第八届蓝桥杯决赛(C++ B组)4.发现环
描述 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管理员误操作使得某 ...
- [国家集训队]特技飞行 贪心BZOJ2697
题目背景 1.wqs爱好模拟飞行. 2.clj开了一家神犇航空,由于clj还要玩游戏,所以公司的事务由你来打理. 注意:题目中只是用了这样一个背景,并不与真实/模拟飞行相符 题目描述 神犇航空开展了一 ...
- Tensorflow实践
确定文件的编码格式 # -*- coding : utf-8 -*- 引入tensorflow库 import tensorflow as tf 定义常量 hw=tf.contant("he ...