rt thread代码的疑问与解答

rt_thread_suspend 函数将线和从ready队列移出,它将被挂在哪个队列上呢?

rt_thread_suspend 这个函数不会主要将线程挂在suspend队列上,而是形成一个自旋队列(自己指向自己),成为假僵尸线程,在下一个时间片到来前这个线程不会中断,且一旦中断就不会再运行,因而推荐在调用后马上调用 rt_schedule。必须由其它线程调用 rt_thread_resume 来重新把它放回ready队列,否则会成为真正意义的僵尸,空闲线程不会回收它。

附:suspend队列有8种:

  • 定时期队列
  • 信号量队列
  • 互斥锁队列
  • 消息等待队列
  • 事件队列
  • 邮件队列
  • signal队列
  • mempool等待分配block队列

当有线程等待mutex锁时,mutex拥有者线程的优先级会上升至与本线程,那么拥有者当释放这个锁时,优先级是否会恢复?

好像不会,mutex拥有者线程的优先级需要上升成与最高等待线程的优先级以防死锁(rt_thread_control(mutex->owner,RT_THREAD_CTRL_CHANGE_PRIORITY,&thread->current_priority)),这个优先级记录在mutex->original_priority上,但当调用 rt_mutex_release 释放锁时,持有者线程的优先级好像并没有恢复

线程的调度(切换)怎么发生的?

  • 当时间片到达,引发cpu硬件中断,保存寄存器信息到中断栈中,再找到中断处理程序 SysTick_Handler
  • 进入rt_interrupt_enter,将中断嵌套加1
  • 在这次时间片remaining_tick用完时调用 rt_tick_increase->rt_schedule
  • rt_schedule 函数中执行 rt_hw_context_switch(),这个函数的实现依赖于板子本身,在各板子的文件位置不同,例如cpuport.c、context_gcc.S、startup.S,它的作用是把rt_interrupt_from_thread 与 rt_interrupt_to_thread 标记上,再次触发用于切换的中断
  • 如果是用户调用的切换,此时直接处理切换中断,如果是系统中断,由于中断嵌套,会先处理完后续(检查定时器rt_timer_check,将嵌套数减1 rt_interrupt_leave),再调用切换的中断处理程序

定时器的 rt_timer_check 中创建了一个临时list,它的作用是什么?

在执行定时器绑定函数时,timer本身可能被销毁,这时再判断它是否为RT_TIMER_FLAG_PERIODIC周期型定时器时就会跃界访问,因此用了一个临时list与它相连,如果它被销毁了,这个list会只剩下它自己,就不用再去判断是不吭国周期性定时器了

rt thread 中的互斥量可不可以用数量为1的信号量来实现?

不能,互斥量会自动将mutex拥有者的优先级提高来防止优先级反转造成死锁,信号量不能保证这一点

rt thread 中邮箱与消息队列的区别

都是类似于管道的机制(主要是一对一),实现逻辑几乎一样,只是数据的维护结构不同

  • mailbox 用数组环存值(通常是指针),有一个游标,比较轻量。
  • message queue 用链表环存一定长度的信息,有头尾游标,可以将紧急信息存在环头部。

使用rt_thread_kill发送信号后,对应线程就能收到马上信号吗?

不能,rt_thread_kill 函数将信号放在对应线程的 thread->si_list 上后调用 _signal_deliver,这个函数为线程标记 RT_THREAD_STAT_SIGNAL_PENDING 状态,并把原栈作为返回栈thread->sig_ret,创建新栈并将栈的入口设置为信号处理的_signal_entry入吕,然后调用 rt_schedule,在调度时如果那个线程刚好是优先级高的线程,就能在被唤醒时检查信号,如果没有这么怡好,可能就轮不到那个线程处理信号。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值