当前位置: 首页 > news >正文

rtthread学习笔记系列 -- 13 线程

@

目录
  • 13 线程
    • 13.1 线程创建
    • 13.2 线程启动
    • 13.3 线程挂起
    • 13.4 线程延时
    • 13.5 线程超时
    • 13.6 线程退出 && 线程删除

在这里插入图片描述

https://github.com/wdfk-prog/RT-Thread-Study

13 线程

13.1 线程创建

  • 初始化上下文信息
  • 将栈初始化为 #
rt_uint8_t *rt_hw_stack_init(void       *tentry,void       *parameter,rt_uint8_t *stack_addr,void       *texit){struct stack_frame *stack_frame;rt_uint8_t         *stk;unsignedlong       i;stk  = stack_addr + sizeof(rt_uint32_t);stk  = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stk, 8);stk -= sizeof(struct stack_frame);stack_frame = (struct stack_frame *)stk;/* init all register */for (i = 0; i < sizeof(struct stack_frame) / sizeof(rt_uint32_t); i ++){((rt_uint32_t *)stack_frame)[i] = 0xdeadbeef;}stack_frame->exception_stack_frame.r0  = (unsignedlong)parameter; /* r0 : argument */stack_frame->exception_stack_frame.r1  = 0;                        /* r1 */stack_frame->exception_stack_frame.r2  = 0;                        /* r2 */stack_frame->exception_stack_frame.r3  = 0;                        /* r3 */stack_frame->exception_stack_frame.r12 = 0;                        /* r12 */stack_frame->exception_stack_frame.lr  = (unsignedlong)texit;     /* lr */stack_frame->exception_stack_frame.pc  = (unsignedlong)tentry;    /* entry point, pc */stack_frame->exception_stack_frame.psr = 0x01000000L;              /* PSR */#if USE_FPUstack_frame->flag =0;#endif /* USE_FPU *//* return task's current stack address */return stk;}

R0-R3: 这些寄存器在函数调用时通常用于传递参数。R0 被设置为传入的参数,而 R1 到 R3 被初始化为 0。这是因为在这个特定的上下文中,我们只需要一个参数。如果有更多的参数,它们会被放在 R1,R2,和 R3 中。

LR (Link Register): 这个寄存器通常包含函数返回地址。LR 被设置为 texit,当任务完成时,它会跳转到这个地址。

PC (Program Counter): 这个寄存器包含下一条要执行的指令的地址。PC 被设置为 tentry,这意味着当任务开始时,它会从这个地址开始执行。

PSR (Program Status Register): 这个寄存器包含了关于程序状态的信息,如条件代码和中断禁用位。在这个函数中,PSR 被设置为 0x01000000L,这是一个特定的值,表示默认的状态

  • 初始化线程定时器

13.2 线程启动

  • 上锁
  • 该函数将恢复一个线程并将其放入系统就绪队列。
    • 停止线程定时器
    • 从挂起链表中移除,插入就绪链表中
  • 解锁并调度

13.3 线程挂起

  • 设置状态为挂起状态
  • 等待下一次触发时挂起

13.4 线程延时

  • 设置定时器超时时间并启动
  • 执行一次调度安排

rt_thread_delayrt_thread_delay_until delay 是相对时间,delay_until 是绝对时间

13.5 线程超时

  • 线程定时器超时后,从挂起链表中移除,插入就绪链表中

13.6 线程退出 && 线程删除

  • 线程退出
    • 设置线程状态为 RT_THREAD_CLOSE
    • 从就绪链表中移除
    • 释放线程资源
http://www.hskmm.com/?act=detail&tid=26517

相关文章:

  • 2025 年淋膜机厂家最新推荐排行榜:覆盖纸张 / 无纺布 / 高速 / 全自动等多类型设备,精选优质企业助力精准选购
  • 2021年度十大前沿科技研究盘点
  • 2025 商事律师咨询最新推荐榜:权威甄选专业法律服务品牌武汉公司法商事/武汉股东纠纷股权/武汉商事争议解决/武汉公司法股权律师推荐
  • 2025 最新推荐:全国开锁公司口碑排行榜权威甄选,含智能锁专项服务与紧急上门品牌详解全国/汽车保险柜/汽车锁/保险柜/智能/快速上门开锁公司推荐
  • CSP - J 讲义内容与CSP - S 讲义内容对比
  • 云安全挑战与AI时代防护策略
  • python“锈化”库替代,性能更快的库
  • 大语言模型时代计算语言学新进展
  • 用新媒体给产业园招商 - 智慧园区
  • 30年后摘得诺奖,一个叛逆“东亚小孩”的胜利
  • 2025年诺贝尔物理学奖揭晓,其中两位得主曾获“墨子量子奖”
  • 诺贝尔奖各种统计数据
  • 在AI技术唾手可得的时代,挖掘新需求成为制胜关键——某知名自动化脚本工具需求洞察
  • 多文本转语音模型共存的可扩展框架
  • AI元人文理论体系研究:从基石重构到文明共生——声明Ai研究
  • 白箱算力与AI元人文:一场从“求解”到“创造”的范式革命
  • vm ubuntu22安装docker
  • vm Locky9.6 安装docker
  • 重装系统后 D 盘软件搜不到?3 步搞定快捷方式与搜索问题
  • Codeforces 2155D Batteries 题解 [ 绿 ] [ 图论 ] [ Ad-hoc ]
  • Disruptor框架深度解析与实战指南
  • P2824 [HEOI2016/TJOI2016] 排序
  • GCC背后的故事C程序常量变量的地址分配
  • 龙芯是被gcc正儿八经支持的
  • python程序设计课程练习题
  • IEEE754浮点格式与解析
  • 国庆 Day3 强基数学
  • Petrozavodsk Summer 2024. Day 1. Welcome Contest
  • 项目作业2
  • 如何使用 INFINI Gateway 对比 ES 索引数据