请问裸奔的无系统要如何做延时,我又不想让CUP在空转

2019-10-15 17:38发布

本帖最后由 vention 于 2017-1-11 09:35 编辑

想做个延时 delayms(10)  却又不知道如何进行,难不成让CUP一直在空转执行空指令么……这样太浪费,可是又不知道怎么写。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
vention
1楼-- · 2019-10-16 16:07
 精彩回答 2  元偷偷看……
vention
2楼-- · 2019-10-16 20:24
lvkanger 发表于 2017-1-11 09:42
同问,裸奔不等着还能干吗!

不想阻塞
lvkanger
3楼-- · 2019-10-16 21:47
vention 发表于 2017-1-11 11:39
不想阻塞

那对于裸奔来讲,你那延时有什么意义呢?
东北小辉辉
4楼-- · 2019-10-17 00:46
本帖最后由 东北小辉辉 于 2017-1-11 13:32 编辑
vention 发表于 2017-1-11 11:38
嗯,就是想不要阻塞。但是不知道如何入手

我有这样一种比较笨的做法,你可以参考一下,比如,有这样一个任务。
void Task1( void )
{
      XXX;
      delayms(10);
      YYY
}

用状态机的写法,就可以这样,假设现在的时钟节拍设为1ms,给Task1定义一个变量Task1Timer。
void Task1( void )
{
      switch ( step )
            case 0:
            {
                   XXX;
                   step = 1;
                  break;
            }   
            case 1:
            {                  if( 10 == Task1Timer )
                  {
                        YYY;
                        step = 0;
                        Task1Timer = 0;

                  {
                  break;
            }
            default:
            ...
}
void Timer_ISR( void )
{
      Task1Timer++;
}

大概就是这么个意思,个人认为,裸奔与OS的本质区别还是在任务调度上,OS的每个任务有虚拟堆栈,可以实现自动调度。状态机是共享堆栈,所以要手动调度,编写程序要复杂一些,难懂一些,剩下的IPC机制其实是OS与状态机共有的。

极小资源单片机,无法使用OS,只能使用状态机方式来实现多任务。
cos12a
5楼-- · 2019-10-17 02:26
延时10MS的过程中你还想做点什么?
第一: 你得有事做才能行.
第二:如果那件事在10MS内做完了还好,
       如果做不完,你10MS后要做的事,MCU也要做, 这样就变成两个事情要做,如何决择?
这样的情况:用系统就好解决.如果自己写,写出来的也会类似系统的才能解决.
东北小辉辉
6楼-- · 2019-10-17 03:43
 精彩回答 2  元偷偷看……

一周热门 更多>