【急求】单片机非阻塞是调度问题

tsenthan 2014-06-10 09:01:26
各位同仁,大家好,在此先行谢过,我有一些疑惑,希望各位可以给我解答,万谢。
是关于单片机任务调度的问题,我想在单片机开发板上实现非阻塞是调度,简单的说,比如,我想让1号led灯亮着,500毫秒之后灭掉,通常的做法是让芯片在点亮led之后,阻塞在这里,等待500毫秒,比如数数等等,如果我不想这么做,我想在这500毫秒之内去干点别的,不想死在这里,我该怎么做呢?称之为非阻塞式调度,如果使用系统节拍器的话,我也没有实现。求助各位
...全文
265 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
whysoft 2014-10-09
  • 打赏
  • 举报
回复
这种设计方法叫:状态机。FSA 是业界常用的设计方法。工作2年经验的都会做。
lbing7 2014-06-13
  • 打赏
  • 举报
回复
用定时器来处理 定时器相应引入了另外一个线程。同时做多件事。
pathletboy 2014-06-11
  • 打赏
  • 举报
回复
引用 2 楼 tsenthan 的回复:
[quote=引用 1 楼 pathletboy 的回复:] 变量记录亮灯时间,然后每次循环里判断是否超过500ms,超过就关呗。
非常谢谢你的回答,这个方法肯定可以,不过对精度要求较高的计时,这个就做不到,因为每个循环的事件是不定的,我想使用通用的,高精度的计时,这里说的500毫秒只是举个例子,可能是更短,比如50微妙(比如某些模组要进入某个状态时,需要某条腿太高多久,等等)[/quote] 一样的,你灯亮了后把定时器打开,时间短直接定时一次就可以,定时器中断触发后关掉,时间长就对定时器中断触发做个计数,当然,你的定时器中断间隔要是你定时时间的整除分母,也不能设置太小,尽量往大里设置,设置太小频繁触发中断影响整体性能,例如你灯搞个结构,里面设置上led.timeout=5,然后定时器中断10us一次:
if (led.timeout)
{    
	led.timeout--;    
	if (!led.timeout) 
		led_off();    
}
tsenthan 2014-06-10
  • 打赏
  • 举报
回复
引用 1 楼 pathletboy 的回复:
变量记录亮灯时间,然后每次循环里判断是否超过500ms,超过就关呗。
非常谢谢你的回答,这个方法肯定可以,不过对精度要求较高的计时,这个就做不到,因为每个循环的事件是不定的,我想使用通用的,高精度的计时,这里说的500毫秒只是举个例子,可能是更短,比如50微妙(比如某些模组要进入某个状态时,需要某条腿太高多久,等等)
pathletboy 2014-06-10
  • 打赏
  • 举报
回复
变量记录亮灯时间,然后每次循环里判断是否超过500ms,超过就关呗。

27,370

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧