【RTX51 Tiny初级】11_os_wait和os_switch_task区别和使用场合

你说的曾经没有我的故事 提交于 2019-12-24 01:37:11


01 - os_send_signal()和os_set_ready()的区

  os_wait()用于等待某个信号,os_switch_task()用于协助调度,相同点和不同点如下:
  相同点:正常情况下都能发生上下文切换,也就是成功执行API后task都会停止当前执行,由running态转为waiting / ready态。
  不同点:os_wait()让task进入waiting态,需要信号触发(set signal / set ready)才能恢复到ready,等待调度后才能运行进入running。os_switch_task()让task进入ready态,是一种协助调度的手段,主动让出CPU资源,随后等待调度进入running
在这里插入图片描述

02 - 使用场合

  当一个task在完成自己的工作后可以让出CPU资源,等待下一次继续执行的时候,就用os_switch_task()。例如,有一个main_task,它主要轮询handle各种由定时器或中断引起的flag,由于是轮询,所以不必要一直执行,于是轮询完一次后,就可以让出CPU资源,供其它task使用:

void main_task() _task_ 1
{
	while(1) {
		buzzer_handler();
		button_handler();
		output_handler();
		input_handler();
		os_switch_task();
	}
}

  当一个task需要同步等待某种信号的发生才能继续工作的时候,就用os_wait()。例如,有一个buzzer_task,它主要等待按键按下的时候才发出声音,于是等待button_task发来信号才能工作:

uint8_t g_beep;
void buzzer_task() _task_ 2
{
	while(1) {
		os_wait1(K_SIG);
		buzzer_set_beep(g_beep);
	}
}

03 - 总结

  • 具有轮询性质的task用os_switch_task(),具有同步性质的task用os_wait
  • os_switch_task()让task进入ready态;os_wait()让task进入waiting态

  • 01-【RTX51 Tiny入门】-RTX51 Full & Tiny简介
  • 02-【RTX51 Tiny入门】-资源占用情况
  • 03-【RTX51 Tiny入门】-内核组成
  • 04-【RTX51 Tiny入门】-任务和调度器
  • 05-【RTX51 Tiny入门】-OS API函数
  • 06-【RTX51 Tiny入门】-查看RTX51 Tiny官方例程
  • 07-【RTX51 Tiny入门】-使用RTX51 Tiny
  • 08-【RTX51 Tiny入门】-Conf_tny.A51配置文件
  • 09-【RTX51 Tiny初级】-K_TMO与K_IVL的区别和使用场合
  • 10-【RTX51 Tiny初级】-os_send_signal()和os_set_ready()的区别和使用场合
  • 11-【RTX51 Tiny初级】-os_wait和os_switch_task区别和使用场合
  • 12-【RTX51 Tiny初级】-解决多重调用问题(MULTPLE CALL TOSEGMENT)
  • 13-【RTX51 Tiny高级】-进行Task的划分与拆分
  • 14-【RTX51 Tiny高级】-修改默认产生时间片的定时器T0为其它定时器
  • 15-【RTX51 Tiny高级】-考虑Round-Robin的开启与关闭
  • 16-【RTX51 Tiny高级】-解决Task之间的通讯和耦合问题
  • 17-【RTX51 Tiny高级】-Task ID隐藏的优先级问题
  • 18-【RTX51 Tiny高级】-系统架构的设计
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!