请教用过汇编转C的高手

[复制链接]
2693|3
 楼主| dudongdao 发表于 2009-8-5 22:14 | 显示全部楼层 |阅读模式
移植汇编程序到C,思路上有些堵塞了。我先说一下我的疑问。
     汇编程序时中断响应232代码,接收到正确的232命令后,把对应的处理函数压栈到SP,然后执行RETI指令到处理函数处,处理完堆栈设置为一个固定值,例子如下:
PC_RS232:   

Push      PSW
Push      A
中间是命令判断RS232_FUN_EXIT:

MOV      DPTR,         #FUN5;比如要执行函数功能5
RS232_FUN_EXIT:
           POP      A
           POP      PSW
           POP      SP_TEMP
           POP      SP_TEMP
           PUSH     DPL
           PUSH     DPH
           RETI
到这里执行了RETI就跳转到FUN5执行了。
执行完之后  ,给SP一个固定的值。         
MOV      SP,        #0BFH                 ;设置堆栈位置为0BFH
JMP      WAIT_INT

整体意思是通过232判断要执行哪个功能,然后直接到哪个功能区执行,不考虑以前
在哪一步执行,不考虑以前的SP是多少,反正执行完之后给SP一个固定的值。

这么做的好处是能快速响应串口命令,比如串口发送一个命令后,单片机执行,执行时间可能是几百毫秒或者几秒,这期间如果再有其他命令则放弃本次任务,执行新任务。
进入中断马上执行新任务可能造成SP错误,所有执行完一次任务就给SP一个固定值,

现在用C改写,应该怎么做才能做到这个实时性的要求呢,C可以这么操作堆栈吗,大家有没有什么更好的办法?
shawn_rin 发表于 2009-8-7 17:58 | 显示全部楼层
小弟求教一下:
(1) 实时性的问题是意思?您232处理完了,直接用函数指针跳转到您自己定义的程序入口地址 可以吗?
(2) 你所谓的操作堆栈不就是想把程序控制字这些自己赋值?支持内嵌汇编的是可以
 楼主| dudongdao 发表于 2009-8-8 10:08 | 显示全部楼层
1.是这样的,实时性就是单片机正在忙工作A,但现在工作B发生了,那你就去工作B忙,放弃工作A。这样是可行的,但中间是有些问题要考虑,如果你不懂汇编是有点想不通,你用汇编写过就知道怎么处理这些问题了。
2.是内嵌了几句,内嵌的时候也遇到一些问题,想找一个最佳方法。你真正做的时候才会遇到一些问题的。
e掾木 发表于 2009-8-12 08:10 | 显示全部楼层
实时性简单地说就是 任何被处理的功能模块不能长时间占用CPU,任何模块都可以在申请CPU使用权之后尽快得到满足。要命的工作优先级高,可以延后处理的优先级低。一般来说RTOS设计要求CPU闲置时间尽可能多,占用CPU 70%以上的设计就不是很优化的方案。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

413

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部