OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5033|回复: 13

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

[复制链接]

83

主题

217

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-4-8
在线时间
116 小时
发表于 2017-1-11 09:34:34 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 vention 于 2017-1-11 09:35 编辑

想做个延时 delayms(10)  却又不知道如何进行,难不成让CUP一直在空转执行空指令么……这样太浪费,可是又不知道怎么写。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13108
金钱
13108
注册时间
2012-11-26
在线时间
3812 小时
发表于 2017-1-11 09:39:17 | 显示全部楼层
裸奔不白等着,还想怎样?
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7542
金钱
7542
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-11 09:42:22 | 显示全部楼层
同问,裸奔不等着还能干吗!
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2017-1-11 10:13:19 | 显示全部楼层
你没任务调度,你跳过延时想干啥
我有故事,你有酒吗
回复

使用道具 举报

21

主题

387

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1043
金钱
1043
注册时间
2016-9-8
在线时间
213 小时
发表于 2017-1-11 10:18:30 | 显示全部楼层
定时器,,,,,,,,,
shop60994719.taobao.com
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2017-1-11 10:47:35 | 显示全部楼层
本帖最后由 东北小辉辉 于 2017-1-11 10:49 编辑

裸奔也是完全可以释放CPU的,任务调度用状态机来实现,加上时钟节拍。
你可以把具体的需求说一下,具体情况具体分析,裸机完全可以实现非阻塞的代码。
有一些协作式内核的OS,共享栈,采用纯C语言,不也实现了多任务吗?参考CONTIKI。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

83

主题

217

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-4-8
在线时间
116 小时
 楼主| 发表于 2017-1-11 11:38:31 | 显示全部楼层
东北小辉辉 发表于 2017-1-11 10:47
裸奔也是完全可以释放CPU的,任务调度用状态机来实现,加上时钟节拍。
你可以把具体的需求说一下,具体情 ...

嗯,就是想不要阻塞。但是不知道如何入手
回复

使用道具 举报

83

主题

217

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-4-8
在线时间
116 小时
 楼主| 发表于 2017-1-11 11:39:16 | 显示全部楼层
jermy_z 发表于 2017-1-11 09:39
裸奔不白等着,还想怎样?

想跳过做下面的事情,用其他的任务时间来填充等待的时间
回复

使用道具 举报

83

主题

217

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-4-8
在线时间
116 小时
 楼主| 发表于 2017-1-11 11:39:39 | 显示全部楼层
lvkanger 发表于 2017-1-11 09:42
同问,裸奔不等着还能干吗!

不想阻塞
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7542
金钱
7542
注册时间
2016-11-30
在线时间
642 小时
发表于 2017-1-11 12:33:39 | 显示全部楼层

那对于裸奔来讲,你那延时有什么意义呢?
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2017-1-11 12:34:09 | 显示全部楼层
本帖最后由 东北小辉辉 于 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,只能使用状态机方式来实现多任务。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

3

主题

95

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2452
金钱
2452
注册时间
2015-11-1
在线时间
301 小时
发表于 2017-1-11 12:45:07 | 显示全部楼层
延时10MS的过程中你还想做点什么?
第一: 你得有事做才能行.
第二:如果那件事在10MS内做完了还好,
       如果做不完,你10MS后要做的事,MCU也要做, 这样就变成两个事情要做,如何决择?
这样的情况:用系统就好解决.如果自己写,写出来的也会类似系统的才能解决.
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2017-1-11 13:55:29 | 显示全部楼层
非阻塞绝对是有意义的,实在没事做也不必空转,至少可以休眠实现低功耗。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2016-5-4
在线时间
25 小时
发表于 2017-1-11 13:55:58 | 显示全部楼层
直接开个定时器就好了吧???
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-30 11:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表