0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT—thread线程启动详解

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-05-19 16:17 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

就序列表实现

就序列表实际上就是一个数组,用来存放优先级不同的线程,系统默认最大的线程数量为32个,用户可自行修改。

线程创建好之后,我们需要把线程添加到就绪列表里面,表示线程已经就绪,系统随时可以调度。 就绪列表在scheduler.c中定义(scheduler.c第一次使用需要在rtthread3.0.3src目录下新建, 然后添加到工程的rtt/source组中)

/* 线程就绪列表*/
rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX]; //  (1)

就绪列表实际上就是一个rt_list_t类型的数组,数组的大小由决定最大线程优 先级的宏RT_THREAD_PRIORITY_MAX决定,RT_THREAD_PRIORITY_MAX在rtconfig.h中默认定义为32。 数组的下标对应了线程的优先级,同一优先级的线程统一插入到就绪列表的同一条链表中。

线程控制块里面有一个tlist成员,数据类型为rt_list_t,我们将线程插入到就绪列表里面,就是通过将线程控制块的tlist这个节点插入到就绪列表中来实现的。如果把就绪列表比作是晾衣杆,线程是衣服,那tlist就是晾衣架,每个线程都自带晾衣架,就是为了把自己挂在各种不同的链表中。

下面在线程中加入就绪列表信息,如下;

/* 初始化线程 */
rt_thread_init( &rt_flag1_thread,                 /* 线程控制块 */
                flag1_thread_entry,               /* 线程入口地址 */
                RT_NULL,                          /* 线程形参 */
                &rt_flag1_thread_stack[0],        /* 线程栈起始地址 */
                sizeof(rt_flag1_thread_stack) );  /* 线程栈大小,单位为字节 */
/* 将线程插入到就绪列表 */
rt_list_insert_before( &(rt_thread_priority_table[0]),&(rt_flag1_thread.tlist) );

/* 初始化线程 */
rt_thread_init( &rt_flag2_thread,                 /* 线程控制块 */
                flag2_thread_entry,               /* 线程入口地址 */
                RT_NULL,                          /* 线程形参 */
                &rt_flag2_thread_stack[0],        /* 线程栈起始地址 */
                sizeof(rt_flag2_thread_stack) );  /* 线程栈大小,单位为字节 */
/* 将线程插入到就绪列表 */
rt_list_insert_before( &(rt_thread_priority_table[1]),&(rt_flag2_thread.tlist) );

就绪列表的下标对应的是线程的优先级,但是目前我们的线程还不支持优先级,有关支持多优先级的知识点我们 后面会讲到,所以flag1和flag2线程在插入到就绪列表的时候,可以随便选择插入的位置。在 代码清单:线程的定义-21 中,我们选择将flag1线程插入到就绪列表下标为0的链表中,flag2线程插入到就绪列表下标为1的链表中

pYYBAGKGBKOAViENAAE-ZdN1xto145.png

下一步调度器初始化:

/* 初始化系统调度器 */
void rt_system_scheduler_init(void)
{
    register rt_base_t offset;//                                        (1)


    /* 线程就绪列表初始化 */
    for (offset ==== 0; offset < RT_THREAD_PRIORITY_MAX; offset ++)//   (2)
    {
            rt_list_init(&rt_thread_priority_table[offset]);
    }

    /* 初始化当前线程控制块指针 */
    rt_current_thread ==== RT_NULL;//                                   (3)
}

线程调度要在硬件初始化之后

int main(void)
{
    /* 硬件初始化 */
    /* 将硬件相关的初始化放在这里,如果是软件仿真则没有相关初始化代码 */

    /* 调度器初始化 */
    rt_system_scheduler_init();

    /* 初始化线程 */
    rt_thread_init( &rt_flag1_thread,                 /* 线程控制块 */
                    flag1_thread_entry,               /* 线程入口地址 */
                    RT_NULL,                          /* 线程形参 */
                    &rt_flag1_thread_stack[0],        /* 线程栈起始地址 */
                    sizeof(rt_flag1_thread_stack) );  /* 线程栈大小,单位为字节 */
    /* 将线程插入到就绪列表 */
    rt_list_insert_before( &(rt_thread_priority_table[0]),&(rt_flag1_thread.tlist) );

    /* 初始化线程 */
    rt_thread_init( &rt_flag2_thread,                 /* 线程控制块 */
                    flag2_thread_entry,               /* 线程入口地址 */
                    RT_NULL,                          /* 线程形参 */
                    &rt_flag2_thread_stack[0],        /* 线程栈起始地址 */
                    sizeof(rt_flag2_thread_stack) );  /* 线程栈大小,单位为字节 */
    /* 将线程插入到就绪列表 */
    rt_list_insert_before( &(rt_thread_priority_table[1]),&(rt_flag2_thread.tlist) );

    /* 启动系统调度器 */
    rt_system_scheduler_start();
}


审核编辑:符乾江

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5186

    文章

    20156

    浏览量

    328980
  • RT
    RT
    +关注

    关注

    0

    文章

    74

    浏览量

    40703
  • 线程
    +关注

    关注

    0

    文章

    508

    浏览量

    20761
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用rt_thread无法输出PWM怎么解决?

    ;, pwm_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); /* 如果获得
    发表于 10-14 07:05

    rt-thread studio 如何进行多线程编译?

    使用 rt-thread studio在工程配置 C/C++构建->Behavior->parallel build数量修改,CPU的占用率没有明显的改变
    发表于 10-11 09:16

    线程问题,线程已经创建成功了,为什么线程调用的函数不会运行呢?

    _t thread = rt_thread_create(\"ai\", ai_thread_entry, RT_NULL, 1024, 28, 30); /* 创建成功则
    发表于 10-10 08:02

    切换线程后中断被屏蔽怎么解决?

    我在将RT-thread移植到cortex-a7平台上,版本是rt-thread-5.1.0,参考的bsp是qemu-vexpress-a9。 目前可以启动到主线程上,具体是高优先级的
    发表于 09-29 07:48

    2025年RT-Thread开发者巡回培训报名正式启动

    亲爱的RT-Thread社区成员们:新程再启,共赴热爱!2025年RT-Thread开发者巡回培训正式启动报名!今年,我们选择了西安、武汉、北京、杭州、深圳、上海、成都这7座城市,为大家带来
    的头像 发表于 09-27 10:39 1146次阅读
    2025年<b class='flag-5'>RT-Thread</b>开发者巡回培训报名正式<b class='flag-5'>启动</b>!

    RT-Thread Nano移植后动态创建线程创建不了怎么解决?

    RT-Thread Nano 移植后动态创建线程创建不了,静态可以.直接烧录DEMO也一样,将RT_USING_HEAP开起来,使用动态创建就创建不起来,RT_USING_HEAP关掉
    发表于 09-19 06:28

    rtthread一直卡在rt_thread_idle_entry()的原因?

    我上面的代码中如果加入rt_thread_delay就一直卡在rt_thread_idle_entry空闲线程,如果去掉rt_thread_delay就能正常打印,请问这是怎么回事。
    发表于 09-12 08:13

    线程删除时遇到断言,是什么原因导致的?

    不足? (rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread) assertion failed at
    发表于 09-12 06:08

    线程中调用rt_thread_mdelay()函数卡死的原因?怎么解决?

    线程中调用rt_thread_mdelay()函数程序卡死。搞了两天也不知道问题出在哪,怎么解决。 int main(void) { interrupt_config
    发表于 09-11 08:11

    rt-thread线程调用rt_thread_mdelay延时后再恢复运行时thread会变,导致mutex释放失败,怎么解决?

    代码片段如下: 运行结果: 可以看到,在线程延时后,再恢复运行时,用rt_thread_self函数获取到的值与没有延时时获取到的值不一样了,导致mutex无法释放,其它等待这个mutex的线程都无法运行了,应该怎么处理这个
    发表于 09-09 08:06

    如何移植 RT-Thread Nano 并创建 2 个线程

    基于 BSP 中的 GPIO_OutputInput 演示,展示了如何移植 RT-Thread Nano 并创建 2 个线程
    发表于 08-19 07:45

    深度剖析 RT-Thread 线程调度流程

    RT-Thread调度第一个线程的主要流程分如下:rtthread_startup:RTT的启动函数,主要负责板级驱动,调度器,系统线程初始化,启动
    的头像 发表于 06-25 18:24 1450次阅读
    深度剖析 <b class='flag-5'>RT-Thread</b> <b class='flag-5'>线程</b>调度流程

    RT-Thread Nano移植后动态创建线程创建不了怎么处理?

    RT-Thread Nano移植后动态创建线程创建不了,静态可以.直接烧录DEMO也一样,将RT_USING_HEAP开起来,使用动态创建就创建不起来,RT_USING_HEAP关掉后
    发表于 06-11 06:36

    请问rt-thread studio如何进行多线程编译?

    使用 rt-thread studio 在工程配置 C/C++构建->Behavior->parallel build 数量修改,CPU的占用率没有明显的改变
    发表于 02-19 08:30

    如何将RT-Thread移植到NXP MCUXPressoIDE上

    RT-Thread默认支持的IDE只有IAR 和 Keil, 那如何将RT-Thread移植到NXP MCUXPressoIDE上呢?本文内容比较简单但稍有琐碎,希望对有需要的小伙伴有所帮助。
    的头像 发表于 02-13 10:37 2442次阅读
    如何将<b class='flag-5'>RT-Thread</b>移植到NXP MCUXPressoIDE上