打印

C51单片机如何提前结束一个正在运行的进程?

[复制链接]
6016|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
新好男孩|  楼主 | 2009-9-6 17:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C51单片机如何提前结束一个正在运行的进程?

如:

void main(void)
{
    while(1)
    {
        delay(2000);
        delay(1000);
        IDLE();
    }
}

如果单片机在主程序中运行到delay(2000);处的时候,有一个按键中断了,且已确认按键已按下,此时单片机要如何结束本次在while()循环中的进程,重新从while()循环开始运行??

相关帖子

沙发
xwj| | 2009-9-6 17:37 | 只看该作者
先要改变delay()的写法

使用特权

评论回复
板凳
新好男孩|  楼主 | 2009-9-6 17:40 | 只看该作者
如何改,在delay()中加一个标志吗?
如果标志改变了就从delaly()中退出对吧?
还有没有别的方式???

使用特权

评论回复
地板
新好男孩|  楼主 | 2009-9-6 17:44 | 只看该作者
还有,我说的退出不光是从delay()中退出,是要结束本此的while()循环,再从while()重新开始运行。

使用特权

评论回复
5
xinzha| | 2009-9-6 18:11 | 只看该作者
我觉得用汇编更好解决,直接修改返回地址就得了,要是用c就稍微麻烦点,先从delay中break,然后再continue,才能重新开始一次新的循环。实在想不到更好的办法,要不就像病毒一样,利用指针强行修改返回地址。

使用特权

评论回复
6
xwj| | 2009-9-6 18:47 | 只看该作者
LS 的做法是纯粹找死(找死机),强烈建议不要这么做。

LZ的问题在于还没学会用状态机写零耗时程序,关于这一点,教科书确实很害人。

这是个编程思想的问题,三言两语讲不清。

使用特权

评论回复
7
踢球老越位| | 2009-9-6 21:47 | 只看该作者
状态机经典啊。。。

使用特权

评论回复
8
踢球老越位| | 2009-9-6 21:48 | 只看该作者
找老hot的零耗时按键看看

使用特权

评论回复
9
冷漠| | 2009-9-6 21:52 | 只看该作者
这还不容易?只用你用汇编写中断程序就行了。

XWJ别骂我,OS中经常用的方法。
大意:中断程序返回前设定好返回地址,和备份的堆栈初值,RETI就行了。


MOV  DPTR,#main   ; 或者任意地址#ADR
MOV  SP, SP_BACK
PUSH  DPH
PUSH  DPL
RETI


你愿意返回到任意地址,只要在C程序任意位置设置汇编语言标号即可:例如:

__asm  ADR:
    while(1)
   {
..........
}

使用特权

评论回复
10
新好男孩|  楼主 | 2009-9-6 23:43 | 只看该作者
其实我也并不想这么做,但公司的要求要按键的实时性非常强,有按键触发就立即退出当前进程。

使用特权

评论回复
11
McuPlayer| | 2009-9-6 23:51 | 只看该作者
"按键的实时性非常强"---------你公司这个要求超级混蛋。
按键能在10mS级别响应就已经是实时的了,你手指头能有多快?

使用特权

评论回复
12
新好男孩|  楼主 | 2009-9-6 23:58 | 只看该作者
实时性---说的是在已确认按键按下了就立即执行。

使用特权

评论回复
13
xinzha| | 2009-9-7 07:41 | 只看该作者
如果是单片机,强制用汇编修改返回地址不会有什么问题的,毕竟程序段短,不涉及太多的状态。如果代码上了一定的规模,连goto都不建议使用,这时候要想随你心愿地安全地修改返回地址,那得是黑客级别的水平了。

使用特权

评论回复
14
McuPlayer| | 2009-9-7 12:49 | 只看该作者
楼主确实对很多基础知识应该补课下
1、关于实时性,软件内部立刻执行不是目的,对事件的反应速度才是目的
2、Kill掉一个进程是要不是清除堆栈这么简单
3、状态机、事件驱动 这些要慢慢引入到程序中去,以提高可维护性

使用特权

评论回复
15
badbird1234| | 2009-9-7 17:15 | 只看该作者
楼主用的是进程这个词
为何不懂进程调度呀

使用特权

评论回复
16
NE5532| | 2009-9-7 19:54 | 只看该作者
开定时器做延迟,行不?

使用特权

评论回复
17
雁舞白沙| | 2009-9-7 20:21 | 只看该作者
都是高手。。。。

使用特权

评论回复
18
cauhorse| | 2009-9-7 20:23 | 只看该作者
既然要求“实时性”,还写一堆delay()干啥。。。
实时性也有很多不同的指标的,并非是快了就实时了。

使用特权

评论回复
19
jerkoh| | 2009-9-7 20:31 | 只看该作者
顶11楼

使用特权

评论回复
20
徐小剑| | 2009-9-7 20:32 | 只看该作者
使用中断语句吧!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

136

帖子

0

粉丝