首页 > 其他分享 >RT-Thread多线程

RT-Thread多线程

时间:2024-07-27 15:25:26浏览次数:8  
标签:RT rt thread Thread THREAD 线程 thread2 多线程

RT-Thread启动流程分析

线程的状态

  • 初始状态 : 线程刚开始创建,还没开始运行时就处于,初始状态。

  • 就绪状态 :在就绪状态下,线程按照优先级排队,等待被执行。

  • 运行状态 :线程正在运行,在单核系统中,只有rt_thread_self()函数返回的线程处于运行状态,但多核系统下,运行的线程不止一个。

  • 挂起状态:也称阻塞态,他可能应为资源不够用而挂起等待,或线程主动延时一段时间而挂起。在挂起状态下,线程不参与调度。

  • 关闭状态:当运行结束时,将处于关闭状态。

    线程状态转换

示例:(点亮led和屏幕):

​
#include <rtthread.h>
#include<board.h>
#include<drv_gpio.h>
#include<drv_lcd.h>
#ifdef RT_USING_NANO
#include<rtdevice.h>
#endif
​
#define THREAD_PRIORITY         25
#define THREAD_STACK_SIZE       512
#define THREAD_TIMESLICE        5
​
#define GPIO_LED_B GET_PIN(F,11)
#define GPIO_LED_R GET_PIN(F,12)
​
static rt_thread_t tid1 = RT_NULL;
​
/* 线程1的入口函数 */
static void thread1_entry(void *parameter)
{
    /*点亮LED*/
    rt_pin_mode(GPIO_LED_R,PIN_MODE_OUTPUT);
    while(1)
    {
        rt_pin_write(GPIO_LED_R,PIN_HIGH);
        rt_thread_mdelay(500);
        rt_pin_write(GPIO_LED_R,PIN_LOW);
        rt_thread_mdelay(500);
    }
}
​
#ifdef rt_align
rt_align(RT_ALIGN_SIZE)
#else
ALIGN(RT_ALIGN_SIZE)
#endif
static char thread2_stack[1024];
static struct rt_thread thread2;
​
/* 线程2入口 */
static void thread2_entry(void *param)
{
    //屏幕显示
    lcd_clear(WHITE);
    lcd_set_color(WHITE,BLACK);
    while(1)
    {
        lcd_show_string(10,69+16+24,32,"hello,world");
        lcd_show_string(10,69,32,"RT-Thread");
        rt_thread_mdelay(500);
    }
​
    /* 线程2运行结束后也将自动被系统脱离 */
}
​
/* 线程示例 */
int lcd_led(void)
{
    /* 创建线程1,名称是thread1,入口是thread1_entry*/
    tid1 = rt_thread_create("thread1",
                            thread1_entry, RT_NULL,
                            THREAD_STACK_SIZE,
                            THREAD_PRIORITY, THREAD_TIMESLICE);
#ifdef RT_USING_SMP
    /* 绑定线程到同一个核上,避免启用多核时的输出混乱 */
    rt_thread_control(tid1, RT_THREAD_CTRL_BIND_CPU, (void*)0);
#endif
    /* 如果获得线程控制块,启动这个线程 */
    if (tid1 != RT_NULL)
        rt_thread_startup(tid1);
​
    /* 初始化线程2,名称是thread2,入口是thread2_entry */
    rt_thread_init(&thread2,
                   "thread2",
                   thread2_entry,
                   RT_NULL,
                   &thread2_stack[0],
                   sizeof(thread2_stack),
                   THREAD_PRIORITY - 1, THREAD_TIMESLICE);
#ifdef RT_USING_SMP
    /* 绑定线程到同一个核上,避免启用多核时的输出混乱 */
    rt_thread_control(&thread2, RT_THREAD_CTRL_BIND_CPU, (void*)0);
#endif
    rt_thread_startup(&thread2);
​
    return 0;
}
​
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(lcd_led, lcdandled);
​
​
int main(void)
{
   return 0;
}

标签:RT,rt,thread,Thread,THREAD,线程,thread2,多线程
From: https://blog.csdn.net/2301_80360664/article/details/140736104

相关文章

  • ThreadLocal
    ThreadLocal是Java中提供的一种用于实现线程局部变量的工具类。它允许每个线程都拥有自己的独立副本,从而实现线程隔离,用于解决多线程中共享对象的线程安全问题。通常,我们会使用synchronzed关键字或者lock来控制线程对临界区资源的同步顺序,但这种加锁的方式会让未获取到锁......
  • LockSupport
    LockSupprot用来阻塞和唤醒线程,底层实现依赖于Unsafe类(后面会细讲)。该类包含一组用于阻塞和唤醒线程的静态方法,这些方法主要是围绕park和unpark展开。publicclassMain{publicstaticvoidmain(String[]args){ThreadmainThread=Thread.currentThre......
  • C++多线程基本使用方式
    一、线程创建        创建线程的函数  thread t(函数名f,函数f的参数) 或者 用lambda表达式代码:#include<iostream>#include<thread>#include<vector>usingnamespacestd;voidoutput(stringinput,inta){ cout<<input<<endl; cout<<a......
  • ScheduledThreadPoolExecutor
    定时任务ScheduledThreadPoolExecutor类有两个用途:指定时间延迟后执行任务;周期性重复执行任务。JDK1.5之前,主要使用Timer类来完成定时任务,但是Timer有以下缺陷:Timer是单线程模式;如果在执行任务期间某个TimerTask耗时较久,就会影响其它任务的调度;Timer的任务调度是基于......
  • LeetCode 2976 Minimum Cost to Convert String I
    MinimumCosttoConvertStringIProblemDescriptionYouaregiventwo0-indexedstrings,sourceandtarget,bothoflengthnandconsistingoflowercaseEnglishletters.Youarealsoprovidedwithtwo0-indexedcharacterarrays,originalandchanged,a......
  • Partial类、枚举、结构体
    1.Partial示例:命名空间一样,类名一样:  如上所示,tb_Employee是一张数据库表,如果数据库增加了新的字段,VS中就会更新类,如果在主程序中调用Report方法,并将Report方法写道Partial类中,Partial类中的数据就不会被覆盖;2.winfrom窗口,winfrom设计器的代码就是一个Partial类;3.枚举的......
  • FFmpeg开发笔记(四十一)结合OBS与MediaMTX实现SRT直播推流
    ​《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2 FFmpeg推流和拉流”提到直播行业存在RTSP和RTMP两种常见的流媒体协议。除此以外,还有于2017年推出的SRT协议,相比常见的RTMP协议,SRT协议具有更低的延迟,并且消除了卡帧、抖动等花屏现象。腾讯视频云已经引入了SRT协议,在实践......
  • 「代码随想录算法训练营」第二十二天 | 回溯算法 part4
    491.非递减子序列题目链接:https://leetcode.cn/problems/non-decreasing-subsequences/题目难度:中等文章讲解:https://programmercarl.com/0491.递增子序列.html视频讲解:https://www.bilibili.com/video/BV1EG4y1h78v/题目状态:有思路,借助ChatGPT通过思路:在之前代码的基......
  • 分布式集群与多线程高并发
     后台数据的处理语言有很多,Java是对前端采集的数据的一种比较常见的开发语言。互联网移动客户端的用户量特别大,大量的数据处理需求应运而生。可移动嵌入式设备的表现形式很多,如PC端,手机移动端,智能手表,Google眼镜等。Server2client的互联网开发模式比较常见,有一种新的数......
  • 6. cmake(property)
    目录1.文件目录 2.基本语法2.1全局属性2.2目录属性2.3文件属性 2.4目标属性 2.5CMakePrintHelpers打印属性3.代码段1.文件目录 其中sub_global和sub_directory下的cmakelists.txt以及main.cpp为我们需要的测试文件,其内容分别如下:main.cpp#includ......