发个讨论贴: 关于单片机的运算能力

2020-02-02 09:18发布

本帖最后由 sgweilong 于 2012-11-17 09:27 编辑

从最早的89C52学起, 也有10多年了,虽然现在开发以ARM为主,但是还是对keil51有感情, 经常有些小项目或者改造项目,喜欢用51来实现.

最近做一个改造项目, 11.0592M, 6CLK. 发现了两个问题:
1. 串口处理数据, 不用中断反应比较快, 但有丢数据的风险.
中断用了接收FIFO, 一有数据先放在FIFO里面, 然后在主程序中屏蔽中断取数, 处理.
比较了一下同样的命令任务:
不用中断, 直接查询RI, 处理完数据最多是16ms.
加中断处理, 处理数据多在100~120ms左右. 同样的功能我用ARM7试过没有发现有区别,基本也是16ms左右.

2. 定时1s功能的实现, 用除法和不用除法, 结果区别很大:
定时器标准定时25ms溢出, 用中断和不用中断是一样的,这里不讨论中断问题. 但是下面两个语句造成的结果让我吃惊:
语句判断1: if ( ( SystemTicks1msec % 20 ) == 0 ) {1s定时到, SystemTicks1msec++; } //to long time esp if it is U16
语句判断2: if ( SystemTicks1msec > 20 ) {1s定时到, SystemTicks1msec=0; };

1s定时都没有问题,很准. 但是我用语句1的时候, 串口用查询方式基本无法工作, 发3次命令顶多能收到1次. 为了这个问题, 我搞了1下午,最后才发现用语句2就成功.
或者把20改为64也没有问题.

以上是个人的一点发现, 欢迎点评,共同进步!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
duanll
1楼-- · 2020-02-03 03:09
  如果做主机,用查询方式还勉强能用。如果做从机用查询,基本上单片机就做不了其它事了。

  我一般收发都用中断,只要调试OK,基本上没有丢过数据。
HeP028
2楼-- · 2020-02-03 06:26
看看我的头像变了米?
mcu5i51
3楼-- · 2020-02-03 12:22
 精彩回答 2  元偷偷看……
wctmdgcd
4楼-- · 2020-02-03 17:57
LZ用ARM比较多,你不会将SystemTicks1msec定义为非unsigned char的数据了吧?
sgweilong
5楼-- · 2020-02-03 18:21
如果就是一个U8和U16就造成这么大的区别, 不是正说明单片机运算能力问题么.

我一直对51很有感情, 当年也是很难才转到ARM做项目的,现在回头做51, 发现了很多以前没注意到的问题.

其实还准备发个贴讨论函数多级调用的问题 (汗, 因为函数中再次调用其他函数,现在程序卡住了, 不是我解决不了问题, 只是分享一下看法).

做51的,不管你理解多深, 还是向32位机或者AVR发展吧
duanll
6楼-- · 2020-02-03 23:17
LZ推荐一款2块以下的32位机看看。。  

一周热门 更多>