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();
}


审核编辑:符乾江

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

    关注

    5091

    文章

    19176

    浏览量

    307070
  • RT
    RT
    +关注

    关注

    0

    文章

    73

    浏览量

    40083
  • 线程
    +关注

    关注

    0

    文章

    505

    浏览量

    19733
收藏 人收藏

    评论

    相关推荐

    RT-Thread上CAN实践

    开箱测试RT-Thread官方已完成了对英飞凌XMC7200EVK的移植,通过shell可以看到做好了uart3的console。本文将介绍如何进行RT-ThreadCan移植。接下来我们要完成CAN_FD的驱动移植,并正常启动
    的头像 发表于 11-13 01:03 1351次阅读
    <b class='flag-5'>RT-Thread</b>上CAN实践

    开源共生 商业共赢 | RT-Thread 2024开发者大会报名启动

    亲爱的RT-Thread开发者我们很高兴地宣布,一年一度的RDC(RT-ThreadDeveloperConference,RT-Thread开发者大会)正式启动报名!2024
    的头像 发表于 10-29 08:06 479次阅读
    开源共生 商业共赢 | <b class='flag-5'>RT-Thread</b> 2024开发者大会报名<b class='flag-5'>启动</b>!

    Nordic-RT-Thread5.1.0移植笔记

    Nordic-RT-Thread5.1.0移植笔记
    的头像 发表于 10-16 08:09 560次阅读
    Nordic-<b class='flag-5'>RT-Thread</b>5.1.0移植笔记

    线程创建成功了,为啥ai_thread_entry()函数不运行呢?

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

    stm32cubmx生成的makefile编译无法启动线程怎么解决?

    stm32cubmx生成的makefile编译无法启动线程,rt_thread_startup返回 RT_EOK无错误 但是使用生成的 keil工程编译就没问题, 板子是 stm32f
    发表于 09-27 09:27

    使用rt_thread_mdelay函数后出现hardfault的原因?

    问题:在一个线程中共有前后2部分使用rt_thread_mdelay()进行延时等待,前面部分延时是正常的,后面部分进入rt_thread_mdelay()函数后立马打印hardfault错误,定位
    发表于 07-16 07:07

    lvgl移植到RT-Thread Nano后进入硬件错误中断的原因?

    使用的是RT-Thread Nano的最新版,第一次移植,不知道是不是因为这个lvgl只能移植到标准版里? 尝试过给lvgl的线程分配更大的栈,但是依旧会卡死在硬件错误中断里。但只要把用户的ui
    发表于 07-04 07:40

    6月6日杭州站RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    6月6日下午我们将在杭州举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 05-28 08:35 475次阅读
    6月6日杭州站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    4月25日北京站RT-Thread线下workshop,探索RT-Thread混合部署新模式

    4月25日,下午我们将在北京举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 04-16 08:35 454次阅读
    4月25日北京站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式

    rt-thread是如何在线程运行结束后识别到的呢?

    _mdelay(1000); } return RT_EOK; } 总所周知,main本身就是rt-thread创建的线程,我在这个线程中创建了一个新的
    发表于 03-22 08:20

    RT-thread中运行了好多个线程,有的线程很长时间不执行是什么原因?

    RT-thread中运行了好多个线程,有的线程很长时间不执行,通过什么方式知道线程因为什么原因阻塞
    发表于 03-22 06:48

    线程中调用rt_thread_mdelay()函数程序卡死了怎么解决?

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

    使用rt_thread nano有办法查看线程的资源占用情况吗?

    使用rt_thread nano ,有办法查看线程的资源占用情况麽?
    发表于 02-26 06:05

    RT-Thread Nano在调用rt_thread_control时,修改线程优先级一直不执行的原因?如何解决?

    RT-Thread Nano在调用rt_thread_control时,修改线程优先级一直不执行
    发表于 02-23 07:32

    psoc62-wifi-bt 在rt thread启动thread失败,如何增加heap空间?

    psoc62-wifi-bt在rt thread启动thread 失败, 如何增加heap 空间? tid = rt_thread_c
    发表于 02-21 07:58