OpenEdv-开源电子网

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

问一个逻辑

[复制链接]

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
发表于 2017-6-10 10:33:16 | 显示全部楼层 |阅读模式
5金钱
执行状态0;满足条件状态置1,等待100ms,如果没有中断发生状态置0,有中断就执行状态1,,,,现在这个状态机在中断里面,所以延时不能放中断里面,有没有什么好办法
大概是这样
switch(state)
{
case 0:
         state=1;
         delay(100);
        state=0;
        break;
case  1:
        xxxx();
        break;
}   
     

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

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
 楼主| 发表于 2017-6-10 10:38:38 | 显示全部楼层
当然我可以再用一个中断来判断,但是这么小的一个东西用两个中断感觉会被打死
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-6-10 11:46:03 | 显示全部楼层
这种小逻辑问题自己解决.不然长不大.
回复

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
 楼主| 发表于 2017-6-10 11:49:34 | 显示全部楼层
操作系统 发表于 2017-6-10 11:46
这种小逻辑问题自己解决.不然长不大.

好吧、、、、
回复

使用道具 举报

6

主题

146

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1254
金钱
1254
注册时间
2016-11-30
在线时间
211 小时
发表于 2017-6-10 13:32:35 | 显示全部楼层
我讲一下我的理解,我觉得直接在中断服务函数弄一个标志位,然后再主函数的循环体里面判断这个标志。假设中断产生,那么标志位置1,主函数判断标志是否为1,是的话改变状态位的值,即置位1,否则,相反!
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1822
金钱
1822
注册时间
2011-10-9
在线时间
232 小时
发表于 2017-6-10 13:51:31 | 显示全部楼层
任何中断服务函数里面  只置标志 不能做具体处理 要在大循环哪里判断标志   在中断服务函数放延时更是大忌
回复

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
 楼主| 发表于 2017-6-10 13:56:36 | 显示全部楼层
MrXiong 发表于 2017-6-10 13:32
我讲一下我的理解,我觉得直接在中断服务函数弄一个标志位,然后再主函数的循环体里面判断这个标志。假设中 ...

你说的这个我试过、、、、第一个中断进入判断延时100ms如果没有发生第二个中断是可以、、问题是如果在延时的100ms里如果发生了好几个中断,它不会重新判断有没有中断产生,也不会重新延时100ms、
回复

使用道具 举报

6

主题

146

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1254
金钱
1254
注册时间
2016-11-30
在线时间
211 小时
发表于 2017-6-10 14:07:57 | 显示全部楼层
执迷 发表于 2017-6-10 13:56
你说的这个我试过、、、、第一个中断进入判断延时100ms如果没有发生第二个中断是可以、、问题是如果在延 ...

中断的都是有优先级的,只要调好优先级就行了
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2017-6-10 14:20:04 | 显示全部楼层
switch(state)
{
case 0:
         delay(100);
        break;
case  1:
        xxxx();
        break;
}

void 中断(void)
{
state=1;
}
回复

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
 楼主| 发表于 2017-6-10 14:25:10 | 显示全部楼层
MrXiong 发表于 2017-6-10 14:07
中断的都是有优先级的,只要调好优先级就行了

没有,,就一个中断,,我的意思是第二次中断,,没说清楚
回复

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
 楼主| 发表于 2017-6-10 14:28:31 | 显示全部楼层
simms01 发表于 2017-6-10 13:51
任何中断服务函数里面  只置标志 不能做具体处理 要在大循环哪里判断标志   在中断服务函数放延时更是大忌

是的、、、遇到问题才知道、、
回复

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
 楼主| 发表于 2017-6-10 14:30:54 | 显示全部楼层
d1z1y2 发表于 2017-6-10 14:20
switch(state)
{
case 0:

不知道是你没懂我的意思还是我没懂你的意思
回复

使用道具 举报

1

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2015-10-13
在线时间
34 小时
发表于 2017-6-10 14:39:30 | 显示全部楼层
你这中断是多长时间进一次,根据进中断的时间和延时100ms的关系写函数,贸然写肯定不对。
不要把钱当成你们的首要追求的目标,你们只需要追求两个字,卓越,你只要去追求它, 这个钱它自然就会跟着你,当你有了远大的目标跟志向的时候, 你自己本身它就是一个财富,钱,它就变成了一个副产品.
回复

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
 楼主| 发表于 2017-6-10 14:42:40 | 显示全部楼层
安尚科技 发表于 2017-6-10 14:39
你这中断是多长时间进一次,根据进中断的时间和延时100ms的关系写函数,贸然写肯定不对。

恩,就是接受完数据中断建立连接处理数据,100ms没接到下个数据就断开连接
回复

使用道具 举报

5

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
419
金钱
419
注册时间
2015-9-16
在线时间
122 小时
发表于 2017-6-10 14:45:22 | 显示全部楼层
用定时器做延时,不要用delay。
回复

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
 楼主| 发表于 2017-6-10 14:50:58 | 显示全部楼层
dozm 发表于 2017-6-10 14:45
用定时器做延时,不要用delay。

我是用的定时器做的延时,,,,
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3774
金钱
3774
注册时间
2015-4-26
在线时间
766 小时
发表于 2017-6-10 14:51:41 | 显示全部楼层
本帖最后由 来俩不甜的 于 2017-6-10 14:53 编辑

你想实现什么功能,为什么要连续触发2次中断才允许执行。你这个写法肯定有问题的。有可能你的方向都是错的,说下功能,没必要强行状态机
我有故事,你有酒吗
回复

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
 楼主| 发表于 2017-6-10 14:56:27 | 显示全部楼层
来俩不甜的 发表于 2017-6-10 14:51
你想实现什么功能,为什么要连续触发2次中断才允许执行。你这个写法肯定有问题的

就是第一次建立连接,就是握手,握手成功等待数据,100ms没有数据就断开连接,重新等待握手,,,我自己想的这样搞、、可能不太好。。有更好的方法的话我就推掉重做。。
回复

使用道具 举报

5

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
419
金钱
419
注册时间
2015-9-16
在线时间
122 小时
发表于 2017-6-10 15:14:29 | 显示全部楼层
执迷 发表于 2017-6-10 14:50
我是用的定时器做的延时,,,,

中断置位,函数放在while里,延时用定时器中断,设置个计数变量。第一次中断建立连接,计数变量赋值延时100ms,时间到就断开,假设100ms内再次进入中断,一直重新赋值计数变量就可以了。
回复

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
 楼主| 发表于 2017-6-10 15:26:50 | 显示全部楼层
dozm 发表于 2017-6-10 15:14
中断置位,函数放在while里,延时用定时器中断,设置个计数变量。第一次中断建立连接,计数变量赋值延时1 ...

恩、、这样要用到两个定时器、、、实在不行也只能这样了
回复

使用道具 举报

6

主题

146

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1254
金钱
1254
注册时间
2016-11-30
在线时间
211 小时
发表于 2017-6-10 18:29:15 | 显示全部楼层
执迷 发表于 2017-6-10 14:25
没有,,就一个中断,,我的意思是第二次中断,,没说清楚

那就要看你的中断是用来做什么的了,是外部中断,还是定时器中断呢
回复

使用道具 举报

6

主题

146

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1254
金钱
1254
注册时间
2016-11-30
在线时间
211 小时
发表于 2017-6-10 18:31:05 | 显示全部楼层
执迷 发表于 2017-6-10 14:25
没有,,就一个中断,,我的意思是第二次中断,,没说清楚

很多时候,一般都是从功能出发,看什么方式实现它最简单,觉得这个也是要考虑一下的
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3774
金钱
3774
注册时间
2015-4-26
在线时间
766 小时
发表于 2017-6-10 21:37:31 | 显示全部楼层
执迷 发表于 2017-6-10 14:56
就是第一次建立连接,就是握手,握手成功等待数据,100ms没有数据就断开连接,重新等待握手,,,我自己 ...

为什么要握手?握手是干什么用的,
我有故事,你有酒吗
回复

使用道具 举报

1

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2015-10-13
在线时间
34 小时
发表于 2017-6-11 10:17:09 | 显示全部楼层
执迷 发表于 2017-6-10 14:42
恩,就是接受完数据中断建立连接处理数据,100ms没接到下个数据就断开连接

晕,没看懂我的话,那你慢慢研究吧。
不要把钱当成你们的首要追求的目标,你们只需要追求两个字,卓越,你只要去追求它, 这个钱它自然就会跟着你,当你有了远大的目标跟志向的时候, 你自己本身它就是一个财富,钱,它就变成了一个副产品.
回复

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
 楼主| 发表于 2017-6-12 08:27:23 | 显示全部楼层
来俩不甜的 发表于 2017-6-10 21:37
为什么要握手?握手是干什么用的,

一般两个设备通讯不都要先握手吗
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3774
金钱
3774
注册时间
2015-4-26
在线时间
766 小时
发表于 2017-6-12 08:48:16 | 显示全部楼层
执迷 发表于 2017-6-12 08:27
一般两个设备通讯不都要先握手吗

不啊,除了tcp建立链接需要握手,我见过的串口通讯从来都不需要握手。当然串口协议我只用过modbus,别的没见过。。
我有故事,你有酒吗
回复

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
 楼主| 发表于 2017-6-12 08:50:24 | 显示全部楼层
来俩不甜的 发表于 2017-6-12 08:48
不啊,除了tcp建立链接需要握手,我见过的串口通讯从来都不需要握手。当然串口协议我只用过modbus,别的 ...

额、、、这个协议不是自己定的嘛、、、不要当然也可以、
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3774
金钱
3774
注册时间
2015-4-26
在线时间
766 小时
发表于 2017-6-12 10:06:36 | 显示全部楼层
执迷 发表于 2017-6-12 08:50
额、、、这个协议不是自己定的嘛、、、不要当然也可以、

关键是你用的什么通讯方式,串口完全不需要握手。tcp也只是在建立链接的时候 握手
我有故事,你有酒吗
回复

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
 楼主| 发表于 2017-6-12 10:22:38 | 显示全部楼层
来俩不甜的 发表于 2017-6-12 10:06
关键是你用的什么通讯方式,串口完全不需要握手。tcp也只是在建立链接的时候 握手

串口通讯啊,,是可以不要的、、问题是我得根据协议写啊,,协议怎么定,就要怎么写、、、、、、不然到时候怎么和上位机通讯,,,上位机也是用的这份协议啊、、、
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3774
金钱
3774
注册时间
2015-4-26
在线时间
766 小时
发表于 2017-6-12 12:37:52 | 显示全部楼层
执迷 发表于 2017-6-12 10:22
串口通讯啊,,是可以不要的、、问题是我得根据协议写啊,,协议怎么定,就要怎么写、、、、、、不然到时 ...

只能开定时器中断,state=1,开始计时,超时在定时器中断里设置state=0
我有故事,你有酒吗
回复

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
 楼主| 发表于 2017-6-12 13:37:45 | 显示全部楼层
来俩不甜的 发表于 2017-6-12 12:37
只能开定时器中断,state=1,开始计时,超时在定时器中断里设置state=0

是的、、这样感觉要专门看个定时器挺浪费的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-18 11:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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