3.RT-Thread线程的创建与删除,动态线程、静态进程

2023-05-16

在实际应用中,经常添加多个 .c 文件和 .h 文件,RT-Thread借助自动构建系统--Scon,它会自动添加你的.c和.h文件到你的工程中,Scon工具根据package-kernel目录下的SConscripts构建工程。  

添加RTT_ROOT(rtt的源码目录)环境变量然后在命令行中构建。

线程的优先级数字越大,优先级越小,如果线程优先级一样,则采取时间片轮询方式。

rt_thread_create     创建动态线程

rt_thread_delete     删除动态线程     静态线程和动态线程的区别就在线程堆栈的分配方式不一样。

rt_thread_init          创建静态线程 ,事先定义一个数组,把数组地址给堆栈起始地址

rt_thread_detach    删除静态线程      

rt_thread_startup     启动线程

rt_thread_cleanup      回收线程(可选)


线程的组成:

A    线程代码

    1. 无线循环模式,代码中有while(1){},一直执行某个功能,但是在while(1)中需要采取方式让出CPU使用权,比如rt_thread_delay(),

    2. 顺序执行模式,执行完之后线程退出,线程资源被回收。

B    线程控制块 tid1=rt_thread_creat(), 

        动态线程控制块static struct rt_thread_t tid1;

        静态线程控制块 static struct rt_thread tid1;

C    线程堆栈,可以在shell中执行list_thread来观察线程所需最大堆栈。


/*
 * 程序清单:创建和删除线程例程
 *
 * 这个例子会创建两个线程,在一个线程中删除另外一个线程。
 */
#include <rtthread.h>

#define THREAD_PRIORITY     25
#define THREAD_STACK_SIZE   512
#define THREAD_TIMESLICE    5

/*
 * 线程删除(rt_thread_delete)函数仅适合于动态线程,为了在一个线程
 * 中访问另一个线程的控制块,所以把线程块指针声明成全局类型以供全
 * 局访问
 */
static rt_thread_t tid1 = RT_NULL;//动态创建线程控制块
static struct rt_thread tid2;//静态创建线程控制块

static rt_uint8_t thread2_stack[THREAD_STACK_SIZE];//静态堆栈

/* 线程1的入口函数 */
static void thread1_entry(void *parameter)
{
    rt_uint32_t count = 0;

    while (1)
    {
        /* 线程1采用低优先级运行,一直打印计数值 */
        rt_kprintf("thread count: %d\n", count ++);
        count ++;
    }
}

static void thread1_cleanup(struct rt_thread *tid)
{
    if (tid != tid1)
    {
        return ;
    }
    rt_kprintf("thread1 end\n");
    tid1 = RT_NULL;
}

/* 线程2的入口函数 */
static void thread2_entry(void *parameter)
{
    /* 线程2拥有较高的优先级,以抢占线程1而获得执行 */

    /* 线程2启动后先睡眠10个OS Tick */
    rt_thread_delay(10);

    /*
     * 线程2唤醒后直接删除线程1,删除线程1后,线程1自动脱离就绪线程
     * 队列
     */
    rt_thread_delete(tid1);

    /*
     * 线程2继续休眠10个OS Tick然后退出,线程2休眠后应切换到idle线程
     * idle线程将执行真正的线程1控制块和线程栈的删除
     */
    rt_thread_delay(10);
}

static void thread2_cleanup(struct rt_thread *tid)
{
    /*
     * 线程2运行结束后也将自动被删除(线程控制块和线程栈在idle线
     * 程中释放)
     */

    if (tid != &tid2)
    {
        return ;
    }
    rt_kprintf("thread2 end\n");
    
}

/* 线程示例的初始化 */
int thread_sample_init()
{
    /* 创建线程1 */
    tid1 = rt_thread_create("t1", /* 线程1的名称是t1 */
                            thread1_entry, RT_NULL,   /* 入口是thread1_entry,参数是RT_NULL */
                            THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
    if (tid1 != RT_NULL) /* 如果获得线程控制块,启动这个线程 */
    {
        tid1->cleanup = thread1_cleanup;
        rt_thread_startup(tid1);
    }

    /* 创建线程2 */
    rt_err_t res;
		res=rt_thread_init(&tid2,
                        "tid2",
                        thread2_entry,
                        RT_NULL,
                        thread2_stack,
                        THREAD_STACK_SIZE,
                        THREAD_PRIORITY,
                        THREAD_TIMESLICE);
    if (res == RT_EOK) /* 如果获得线程控制块,启动这个线程 */
    {
        tid2.cleanup = thread2_cleanup;
        rt_thread_startup(&tid2);
    }

    return 0;
}
/* 如果设置了RT_SAMPLES_AUTORUN,则加入到初始化线程中自动运行 */
#if defined (RT_SAMPLES_AUTORUN) && defined(RT_USING_COMPONENTS_INIT)
    INIT_APP_EXPORT(thread_sample_init);
#endif
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(thread_sample_init, run signal sample);


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

3.RT-Thread线程的创建与删除,动态线程、静态进程 的相关文章

随机推荐

  • Linux C++ Socket实战

    本文主要介绍Linux C 43 43 基础Socket网络编程 大部分知识来自于网站 xff1a https www geeksforgeeks org socket programming cc Socket编程状态图 从图中可以看到
  • CSAPP第二章-信息的表示与处理-随手记

    仅作为学习 深入理解计算机系统 第二章时的笔记 xff0c 仅记录对自己有启发的部分 xff0c 不作为知识整理 xff08 直接看电子书就可以了 xff09 因为这本书知识点非常多 xff0c 所以我会抽时间多次阅读 xff0c 本文也会
  • Vue的路由配置及手动改地址栏为啥又跳转回来??

    vue cli xff08 vue脚手架 xff09 超详细教程 xff1a https blog csdn net wulala hei article details 85000530 这个教程里面是使用 vue init webpac
  • GPS卫星轨道

    GPS卫星轨道周期几乎是24小时 xff0c 而自己的卫星在太阳同步轨道上的周期大概是1 5个小时 xff0c 那么就是说太阳同步轨道已经绕几周了 xff0c GPS卫星才饶一周 所以当算多普勒频移的时候只需要算出GPS一个周期时间内的多普
  • 快速了解S7-1200 PLC的存储器及存储区的寻址方式

    S7 1200 PLC的存储器地址包括输入I 输出Q 位存储器M 数据块DB xff0c 以及本地或临时存储器L eg xff1a 标识存储区M0 0 MB0 MW0 MD0 分别是 B位 字节B 8位 字W 16位 双字D 32位 输入过
  • 网络编程之UDP简单示例

    UDP编程函数recvfrom inet pton sendto UDP协议 user data protrol 用户数据协议特点 xff1a TCP xff1a 面向连接 gt 一定双方连接上了才能进行通信 xff01 UDP xff1a
  • 微信开发(二)http请求工具类

    说明 进行微信开发 xff0c 后台程序需要与微信服务器进行交互 xff0c 通过调用接口来完成服务 xff0c 阅读微信开发文档 xff0c 发现接口的调用都是通过http请求进行的 xff0c 所以必须有个HttpUtil来支撑 xff
  • STM32寄存器与结构体

    piaolin 发表于 2015 9 30 01 02 只看该作者 倒序浏览 阅读模式 第16集 蜂鸣器实验 这个实验和流水灯是一样的 xff0c 只是将相对应的IO口拉高拉低即可控制蜂鸣器 值得注意的是电路设计方面 xff0c 根据视频描
  • 字节序

    1 字节序 字节序 xff0c 又称端序或尾序 xff0c 指的是多字节数据在内存中的存放顺序 例如一个int型变量x占用4个字节 xff0c 假设它的起始地址 amp x为0x10 xff0c 那么x将会被存储在 0x10 0x11 0x
  • extern “C“的作用及理解

    1 意图 extern 34 C 34 是C 43 43 特有的指令 xff08 C无法使用该指令 xff09 xff0c 目的在于支持C 43 43 与C混合编程 2 作用 extern C 的作用是告诉C 43 43 编译器用C规则编译
  • Linux命令 nautilus

    nautilus是GNOME桌面下的一个文件管理工具 通过这个命令我们可以在终端下非常方便的打开指定目录的文件 nautilus 命令后面一个 xff0c 表示当前目录 命令模式为 nautilus pwd支持绝对路径和相对路径两种方式 x
  • windows下C语言实现TCP通信

    编译器 xff1a vs2017 语言 xff1a c语言 具体的原理可以在其他博客看到 在我学习winsock编程时 xff0c 发现那些博客代码居然在我机器上没一个能运行 xff0c 可能是我水平有限 于是我根据winsock相关知识
  • 关于USB转串口型设备的latency问题

    USB转串口型设备在通讯时默认有16ms延时 xff0c 这在控制任务中往往是不能接受的 xff0c 为了改善这个情况需要改变latency的值为最小值1 在Windows环境下 xff0c 可以如下操作 xff1a 右键属性 端口设置 高
  • 航模lipo锂电池过放抢救/处理方式

    实验室用的tattu航模电池经常因为疏忽导致过放 xff0c 逐渐也摸索出来过放的抢救方法 当然最好的方法还是不要过放 xff1a xff09 1 首先是检查电池剩余电压 xff0c 用普通的电压表就可以了 xff0c 今天刚搞崩了了一块
  • 基于DCT+huffman变换的图像压缩解压缩FPGA实现

    目录 一 理论基础 二 verilog程序 三 仿真结果 一 理论基础 整个算法涉及到DCT变换和Huffman编码两个部分 其整体流程图如下所示 nbsp 这里 我们将做三个方面的工作
  • C++代码编译过程

    C 43 43 代码编译过程 源代码从生成到可执行文件可以分成四个步骤 xff1a 预处理 编译 汇编和链接 以下是linux下GCC生成一个可执行文件a out的过程 xff1a 一 预处理 预处理过程主要是处理那些源文件和头文件中以 开
  • Linux终端美化

    1 安装终端软件terminator 可自行选择 sudo apt get install terminator y 2 安装zsh sudo apt get install zsh y 3 安装oh my zsh sh c 34 curl
  • windows 7 浏览器无法进网站,提示安全证书存在问题(GlobalSign)

    下载更新包就行了kb4474419 http www catalog update microsoft com search aspx q 61 kb4474419
  • linux下共享库(.so文件)的调用

    需要的文件 libxxxx so xxxx h 记住 复制文件的时候千万不要用ROOT权限 xff0c 不然编译时会找不到这个共享库 最好时把库放到 usr lib chmod 777 chown username CMakeLists t
  • 3.RT-Thread线程的创建与删除,动态线程、静态进程

    在实际应用中 xff0c 经常添加多个 c 文件和 h 文件 xff0c RT Thread借助自动构建系统 Scon xff0c 它会自动添加你的 c和 h文件到你的工程中 xff0c Scon工具根据package kernel目录下的