打印

非常佩服匠人的bit真气**

[复制链接]
楼主: ayb_ice
手机看帖
扫描二维码
随时随地手机跟帖
61
gtw| | 2008-6-3 23:25 | 只看该作者 回帖奖励 |倒序浏览

有人在穿内裤,闪

使用特权

评论回复
62
emot| | 2008-6-4 09:25 | 只看该作者

看看

暂时想不出用宏参确定NOP次数的宏。

使用特权

评论回复
63
三块石头| | 2008-6-4 15:33 | 只看该作者

提问:为什么if语句没有被展开汇编?

匠人的宏体是这样的:

#define __NOPX__(a)             
    if ((a)&(0x01))    {__NOP1__}                    
    if ((a)&(0x02))    {__NOP2__}                    
    if ((a)&(0x04))    {__NOP4__}                    
    if ((a)&(0x08))    {__NOP8__}                    
    if ((a)&(0x10))    {__NOP16__}                    
    if ((a)&(0x20))    {__NOP32__}                    
    if ((a)&(0x40))    {__NOP64__}                    
    if ((a)&(0x80))    {__NOP128__}                   

我能明白这里有按权展开然后相加的意思,但是为什么if语句没有被展开编译为汇编语句?我觉得应该用#if,而不应该是if语句

使用特权

评论回复
64
莫沾衣| | 2008-6-4 15:57 | 只看该作者

好像是没太明白

#define _nop_() ;

使用特权

评论回复
65
cashkan| | 2008-6-4 16:25 | 只看该作者

经典...

受教了....总能学到东西...

使用特权

评论回复
66
程序匠人| | 2008-6-4 17:22 | 只看该作者

答复三块石头

匠人一开始也尝试用#if,但是系统会报错。后来把#去掉才正常。

匠人的理解是,一个宏里面,不允许出现多个#号。

使用特权

评论回复
67
ayb_ice|  楼主 | 2008-6-4 19:55 | 只看该作者

(KEIL)编译器

自动计算中间表达式,
和 a = 3+5;这是类似的。。。

使用特权

评论回复
68
程序匠人| | 2008-6-4 21:32 | 只看该作者

系统自动优化了

cw里的问题可能就是优化不一样导致的

使用特权

评论回复
69
wxj1952| | 2008-6-4 22:00 | 只看该作者

还有吗?

站长的方法很优雅.14亿人不会只有一种方法.
这两天出差在外地,想出2种方法了.
要是和谁想的一样,那可真是白学了.你不信,HWM就一定不会和谁想的一样.还有涛行九天,hotpower,.....独立的人.

使用特权

评论回复
70
jcsasm| | 2008-6-5 01:23 | 只看该作者

精彩

使用特权

评论回复
71
phoenixmy| | 2008-6-5 03:37 | 只看该作者

的确


要是能嵌套就好了

不如先直接定义一个递归函数来的方便
为啥一定要用宏定义呢~~~~~~~~~~~~~~~~~

使用特权

评论回复
72
HWM| | 2008-6-5 08:12 | 只看该作者

可笑,正是可笑之极,忍不住再次多说两句。

这么都把功劳归于“宏”了呢?没理解33L和40L的提醒?

这玩意儿就是建立在对if语句的优化上的,用宏嵌套只是使书写更为简洁而已。
如果一个语句(包括宏)的语义是由编译优化所决定的,所构成的程序质量可想而知。这么简单的问题都看不清?太不专业了(恕我直言)!

使用特权

评论回复
73
wxj1952| | 2008-6-5 09:11 | 只看该作者

支持LS

有句话说:“与其编写很糟糕的代码来靠编译优化器的优秀功能来产生良好的代码,不如一开始就写出好的代码。”

使用特权

评论回复
74
程序匠人| | 2008-6-5 09:21 | 只看该作者

HWM说的有点道理

这种用法可能是不太可靠的。就像楼主现在遇到的CW问题。

使用特权

评论回复
75
ayb_ice|  楼主 | 2008-6-5 09:58 | 只看该作者

匠人和HWM说的有道理

但这个宏本身是没有任何问题的,CW很多东东都不行,人性化很差,我相信这个宏在绝大部分编译器上是可行的,CW也有效果,只是有副作用,功能还是达到了。。。
我估计是由于CW里的NOP操作本身是内嵌汇编造成的,CW的内嵌汇编本身也还有一些问题,比如用宏实现多句汇编不能写在多行(这还需要进一步证实,这几天为这都搞晕了)。
这些都可以测试一下。

使用特权

评论回复
76
HWM| | 2008-6-5 10:08 | 只看该作者

to 74楼:是因为多数编译器对if语句的优化类同所致。

若你取消优化会发现其结果相当怪异。作为一个健壮的软件不仅尽量可以在各种不同的编译器之间游弋(可移植性),还要保证语义一致性(包括优化),这是基本要求。

使用特权

评论回复
77
phoenixmy| | 2008-6-5 10:58 | 只看该作者

=,= 学习了~~~~~~~~~~~


感觉用for循环也挺好的么





使用特权

评论回复
78
phoenixmy| | 2008-6-5 11:04 | 只看该作者

...


unsigned char i;

for(i=0;i<24;i++)
{
_nop_();
}
_nop_();
_nop_();

这样就得到了100个指令周期,还是挺精准的,而且做起来也挺方便的


NOP占用一个指令周期
INC也占用一个指令周期
CJNE占用2个指令周期

这样循环体内为4个指令周期,所以简单算算就可以得到循环次数:
循环次数=(总周期数-2)/4
需要修正补充的指令周期数为:(总周期数-2)% 4

顺便补充一句:

i from 0 to 255
并且 i>=6






使用特权

评论回复
79
ayb_ice|  楼主 | 2008-6-5 11:20 | 只看该作者

进一步证实

移植到PICC和KEIL,IAR效果完全一致。当然这些都是非常出色的编译器。

这里仅仅讨论技术。

用软件当然可以写出精确的延时程序,这没有什么难度,看看汇编语句即可。

使用特权

评论回复
80
gyt| | 2008-6-5 13:38 | 只看该作者

相当有趣

使用特权

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

本版积分规则