RT-Thread相同优先级线程的调度
/* 静态线程的 线程堆栈*/
static rt_uint8_t thread1_stack[];
static rt_uint8_t thread2_stack[]; /* 静态线程的 线程控制块 */
static struct rt_thread thread_test1;
static struct rt_thread thread_test2; static void test1_thread_entry(void* parameter);
static void test2_thread_entry(void* parameter); void demo_thread_creat(void)
{
rt_err_t result; /* 创建静态线程 : 优先级 15 ,时间片 2个系统滴答 */
result = rt_thread_init(&thread_test1,
"test1",
test1_thread_entry, RT_NULL,
(rt_uint8_t*)&thread1_stack[], sizeof(thread1_stack), , ); if (result == RT_EOK)
{
rt_thread_startup(&thread_test1);
} /* 创建静态线程 : 优先级 15 ,时间片 1个系统滴答 */
result = rt_thread_init(&thread_test2,
"test2",
test2_thread_entry, RT_NULL,
(rt_uint8_t*)&thread2_stack[], sizeof(thread2_stack), , ); if (result == RT_EOK)
{
rt_thread_startup(&thread_test2);
} } void test1_thread_entry(void* parameter)
{
rt_uint8_t i; for(i = ; i < ; i ++)
{
rt_kprintf("Thread1:\r\n");
rt_kprintf("This is a demo for same priority !\r\n");
rt_thread_delay();
}
} void test2_thread_entry(void* parameter)
{
rt_uint8_t j; for(j = ; j <; j ++)
{
rt_kprintf("Thread2:\r\n");
rt_kprintf("This is a demo for same priority !\r\n");
}
}
线程 test2 的打印信息输出不全,说明 test2 线程的执行被打断了, 因为 test1 线程和 test2线程的优先级都是 15,并不会发生抢占的情况,所以说 test2 线程是等到自己的执行时间片到达时,被系统剥夺了 CPU 使用权,而将使用权交给了 test1 线程,从而 test1 线程重新获得执行.由此可以看出当两个相同线程间,运行是以时间片为基准的,时间片到达,则交出CPU 使用权,交给下一个就绪的同优先级线程执行。
PS:由于上面的两个线程都不是无限循环结构,在其正常退出后,其线程状态变为初始化状态,然后在空闲线程中将其从线程调度列表中删除。学到这里可以再创建个任务,一段时间以后调用rt_thread_startup再变成就绪状态。代码如下:
#include <rtthread.h>
#include <stm32f10x.h>
#include "test.h" /* 变量分配4字节对齐 */
ALIGN(RT_ALIGN_SIZE) /* 静态线程的 线程堆栈*/
static rt_uint8_t thread1_stack[];
static rt_uint8_t thread2_stack[];
static rt_uint8_t thread3_stack[]; /* 静态线程的 线程控制块 */
static struct rt_thread thread_test1;
static struct rt_thread thread_test2;
static struct rt_thread thread_test3; static void test1_thread_entry(void* parameter);
static void test2_thread_entry(void* parameter);
static void test3_thread_entry(void* parameter); static rt_uint8_t test3_thread_flag = ; void demo_thread_creat(void)
{
rt_err_t result; /* 创建静态线程 : 优先级 15 ,时间片 2个系统滴答 */
result = rt_thread_init(&thread_test1,
"test1",
test1_thread_entry, RT_NULL,
(rt_uint8_t*)&thread1_stack[], sizeof(thread1_stack), , ); if (result == RT_EOK)
{
rt_thread_startup(&thread_test1);
} /* 创建静态线程 : 优先级 15 ,时间片 1个系统滴答 */
result = rt_thread_init(&thread_test2,
"test2",
test2_thread_entry, RT_NULL,
(rt_uint8_t*)&thread2_stack[], sizeof(thread2_stack), , ); if (result == RT_EOK)
{
rt_thread_startup(&thread_test2);
} /* 创建静态线程 : 优先级 14 ,时间片 1个系统滴答 */
result = rt_thread_init(&thread_test3,
"test3",
test3_thread_entry, RT_NULL,
(rt_uint8_t*)&thread3_stack[], sizeof(thread3_stack), , ); if (result == RT_EOK)
{
rt_thread_startup(&thread_test3);
} } void test1_thread_entry(void* parameter)
{
rt_uint8_t i; for(i = ; i < ; i ++)
{
rt_kprintf("Thread1:\r\n");
rt_kprintf("This is a demo for same priority !\r\n");
rt_thread_delay();
}
} void test2_thread_entry(void* parameter)
{
rt_uint8_t j; for(j = ; j <; j ++)
{
rt_kprintf("Thread2:\r\n");
rt_kprintf("This is a demo for same priority !\r\n");
}
} void test3_thread_entry(void* parameter)
{
while()
{
rt_thread_delay();
if( == test3_thread_flag)
{
rt_thread_startup(&thread_test1);
rt_thread_startup(&thread_test2);
test3_thread_flag = ;
}
}
}
本例程同样需要关闭 finsh 组件。
RT-Thread相同优先级线程的调度的更多相关文章
- Windows内核之线程的调度,优先级,亲缘性
1 调度 Windows不是实时操作系统,它是抢占式多线程操作系统.在如果全部优先级同样的情况下,CPU对线程的调度原则是每隔20m就会切换到下一个线程,依据Context中的IP和SP来接着运行上次 ...
- Java多线程-线程的调度(优先级)
与线程休眠类似,线程的优先级仍然无法保障线程的执行次序.只不过,优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行. 线程的优先级用1-10之间的整数表示,数值越大优先级越高,默认的优先 ...
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(下)
7.6 运用结构环境 现在应该懂得环境结构在线程调度中所起的重要作用了.环境结构使得系统能够记住线程的状态,这样,当下次线程拥有可以运行的C P U时,它就能够找到它上次中断运行的地方. 知道这样低层 ...
- Thread之五:线程的优先级
Java线程可以有优先级的设定,高优先级的线程比低优先级的线程有更高的几率得到执行(不完全正确,请参考下面的“线程优先级的问题“). 记住当线程的优先级没有指定时,所有线程都携带普通优先级. 优先级可 ...
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)
第7章 线程的调度.优先级和亲缘性 抢占式操作系统必须使用某种算法来确定哪些线程应该在何时调度和运行多长时间.本章将要介绍Microsoft Windows 98和Windows 2000使用的一些算 ...
- Java多线程01(Thread类、线程创建、线程池)
Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...
- Linux的进程线程及调度
本文为宋宝华<Linux的进程.线程以及调度>学习笔记. 1 进程概念 1.1 进程与线程的定义 操作系统中的经典定义: 进程:资源分配单位. 线程:调度单位. 操作系统中用PCB(Pro ...
- [转帖]Linux的进程线程及调度
Linux的进程线程及调度 本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10393707.html 本文为宋宝华<Linux的进程 ...
- java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)
今天开始就来总结一下Java多线程的基础知识点,下面是本篇的主要内容(大部分知识点参考java核心技术卷1): 1.什么是线程以及多线程与进程的区别 2.多线程的创建与启动 3.中断线程和守护线程以及 ...
随机推荐
- !!!四种常见的 POST 提交数据方式(含application/json)
HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文 ...
- [译]ASP.NET 性能监控
概述:在性能测试中性能监视器是非常强大的工具,本文主要简述了几个关键的计数器和相关的阈值. 监控性能计数器 很多的性能计数器在性能调优中是非常重要的,由于性能计数器太多,很多人不知道选择那些计数器. ...
- MVC的处理过程
MVC的处理过程,首先控制器接受用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户.
- Linux常用命令_(文件查看)
文件查看主要有以下命令 cat.tac.more.less.head.tail.nl cat命令:是一个文本文件查看和连接工具.从第一个字节开始正向查看文件的内容,适用于小文件 以第一行开始,显示没有 ...
- Redis String命令
命令 解释 APPEND key value 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾. 如果 key 不存在, APPEND ...
- LightOJ1037 Agent 47(状压DP)
dp[S]表示已经消灭目标集合为S的最少射击数 dp[0]=0 dp[S]=min( dp[S'] + min( health[i] , health[i]/demage[j][i] ) ) 其中S ...
- BZOJ3821 : 玄学
对操作建立线段树,每个节点维护一个有序的操作表,表示用$[l,r]$的操作在每段区间上的作用效果. 对于一个线段树节点,合并左右儿子信息只在该区间刚刚被填满时进行,利用归并排序,时间复杂度为$O(n\ ...
- Linq To Objects
一.什么是Linq To Objects 从根本上说,Linq To Objects表示一种新的处理集合的方法.采用旧方法,必须编写指定如何从集合检索数据的复杂的foreach循环.而采用Linq方法 ...
- Codeforces Round #189 (Div. 2) A. Magic Numbers
#include <iostream> #include <vector> #include <algorithm> #include <string> ...
- CentoS 下报的 Requires: perl(:MODULE_COMPAT_5.8.8)
yum error requires: libtcmalloc.so.4 rpm -Uvh http://ceph.com/rpm-cuttlefish/el6/x86_64/ceph-release ...