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

2019-10-15 17:38发布

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

想做个延时 delayms(10)  却又不知道如何进行,难不成让CUP一直在空转执行空指令么……这样太浪费,可是又不知道怎么写。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
东北小辉辉
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,只能使用状态机方式来实现多任务。

一周热门 更多>