打印
[STM8]

香主,删除吧

[复制链接]
5472|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CC2530|  楼主 | 2011-6-29 10:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 CC2530 于 2011-6-30 10:00 编辑

香主,删除吧
评分
参与人数 1威望 +1 收起 理由
a061210883 + 1
沙发
香水城| | 2011-6-29 10:57 | 只看该作者
1)为什么要直接读取CC?
2)BMCC指令的作用是什么?
3)16位加减没有进位标志,这确实是一个不方便、不尽合理的地方。有空儿看看。

使用特权

评论回复
板凳
CC2530|  楼主 | 2011-6-29 13:44 | 只看该作者
1)为什么要直接读取CC?
香水城 发表于 2011-6-29 10:57


读取CC主要用在临界段上。
一个简单例子:
uint8 CriticalReadByte(const volatile uint8 * pdata)
{
    uint8 result;
    CRITICAL()
    {
        result=pdata[0];
    }
    return result;
}

汇编代码:
STM8:
CriticalReadByte:
        PUSH      CC
        POP       A
        AND       A, #0x28
        LD        S:?b0, A
        SIM
//   27     {
//   28         result=pdata[0];
        LD        A, (X)
        LD        S:?b1, A
//   29     }
        LD        A, S:?b0
        PUSH      CC
        POP       A
        AND       A, #0xffffffffffffffd7
        OR        A, S:?b0
        PUSH      A
        POP       CC
//   30     return result;
        LD        A, S:?b1
        RET
//   31 }
//   32

AVR:
        RSEG CODE:CODE:NOROOT(1)
//   23 uint8 CriticalReadByte(const volatile uint8 * pdata)
CriticalReadByte:
//   24 {
//   25     uint8 result;
//   26     CRITICAL()
        IN      R18, 0x3F
        CLI
//   27     {
//   28         result=pdata[0];
        MOVW    R31:R30, R17:R16
        LD      R16, Z
//   29     }
        OUT     0x3F, R18
//   30     return result;
        RET

使用特权

评论回复
地板
CC2530|  楼主 | 2011-6-29 13:47 | 只看该作者
本帖最后由 CC2530 于 2011-6-29 13:48 编辑
1)
2)BMCC指令的作用是什么?
香水城 发表于 2011-6-29 10:57

应该叫BCMC。

BCMC是相对亦BCCM来说的。
BCCM:BIT Copy carry to memory
BCMC:BIT Copy  memory to carry

使用特权

评论回复
5
CC2530|  楼主 | 2011-6-29 13:51 | 只看该作者
3)16位加减没有进位标志,这确实是一个不方便、不尽合理的地方。有空儿看看。
香水城 发表于 2011-6-29 10:57


如果16位加减有进位标志,两条指令就能进行32位加减。
如果16位加减没有进位标志,32位加减将会增加很多指令。

使用特权

评论回复
6
CC2530|  楼主 | 2011-6-29 13:52 | 只看该作者
4.X,Y访问RAM指令,不能自增,自减。
-------------------------------------------------------
这也是STM8一个比较大的缺陷。

使用特权

评论回复
7
xwj| | 2011-6-29 13:56 | 只看该作者
没用过,路过随便问问:

STM8不是8位的吗?
CPU有“16位加减”指令?
而不是宏指令或者组合指令?

使用特权

评论回复
8
CC2530|  楼主 | 2011-6-29 14:04 | 只看该作者
没用过,路过随便问问:

STM8不是8位的吗?
CPU有“16位加减”指令?
而不是宏指令或者组合指令?
xwj 发表于 2011-6-29 13:56


8位机也一样有16位运算指令,只是一般比较少,比较简单。
比如51里面的INC DPTR,AVR的ADIW,SBIW。

STM816位运算指令相对比较多。
后面带W的都是16位运算指令。

Image0301.JPG (70.25 KB )

Image0301.JPG

使用特权

评论回复
9
香水城| | 2011-6-29 14:08 | 只看该作者
哦,关于临界段的问题,LZ提出了一种使用CC的办法,但也可以用其它办法实现,比如EXG和EXGW指令,而且功能更强、更灵活。你说呢?

使用特权

评论回复
10
香水城| | 2011-6-29 14:18 | 只看该作者
关于BCMC指令的功能: BIT Copy  memory to carry

BTJT指令具有相同的功能,只不过没有用BCMC这个助记符。

使用特权

评论回复
11
香水城| | 2011-6-29 14:23 | 只看该作者
16位加减指令,请看这2页,红线圈出的部分是你说的进位标志吗:

STM8_ADDW_Instruction.GIF (53.08 KB )

STM8_ADDW_Instruction.GIF

STM8_SUBW_Instruction.GIF (45.2 KB )

STM8_SUBW_Instruction.GIF

使用特权

评论回复
12
CC2530|  楼主 | 2011-6-29 14:26 | 只看该作者
BTJT指令具有相同的功能,只不过没有用BCMC这个助记符。
---------------------------------------------------------------------
虽然是实现相同功能,但开销不一样。

BCCM单周期指令。

BTJT本质上是跳转,指代码令更长,执行时间也更长。
而且跳转与不跳转,执行时间不一样(IAR软件仿真的结果,未在STM8硬件上测试)。
而且,对编译器来说,也不会用BTJT来读取BIT到C.

使用特权

评论回复
13
香水城| | 2011-6-29 14:31 | 只看该作者
关于最后增加的:“X,Y访问RAM指令,不能自增,自减”

我认为这不是大问题,因为有INCW X、INCW Y和DECW X、DECW Y,这几条指令都只有2个周期的执行时间。

使用特权

评论回复
14
CC2530|  楼主 | 2011-6-29 14:32 | 只看该作者
多谢香水城回复。

INCW木有。

Image0302.JPG (81.12 KB )

Image0302.JPG

使用特权

评论回复
15
香水城| | 2011-6-29 14:33 | 只看该作者
BTJT指令具有相同的功能,只不过没有用BCMC这个助记符。
---------------------------------------------------------------------
虽然是实现相同功能,但开销不一样。

BCCM单周期指令。

BTJT本质上是跳转,指代 ...
CC2530 发表于 2011-6-29 14:26


我认为设计一个指令系统,不可能照顾到所有功能,对于较少使用的功能,执行时间稍微长一点,不会影响大局。

使用特权

评论回复
16
香水城| | 2011-6-29 14:36 | 只看该作者
多谢香水城回复。

INCW木有。
CC2530 发表于 2011-6-29 14:32


INC和DEC也没有设置C标志,但你可以用V标志和Z标志判断是否溢出。

况且,如果确实要C标志,可以使用ADDW X, #1实现INCW的功能。

使用特权

评论回复
17
香水城| | 2011-6-29 14:45 | 只看该作者
:handshake对STM8的指令系统研究这么深,难道LZ是做编译器的?  什么时候有产品推出呀?

使用特权

评论回复
18
CC2530|  楼主 | 2011-6-29 14:51 | 只看该作者
本帖最后由 CC2530 于 2011-6-29 14:54 编辑
INC和DEC也没有设置C标志,但你可以用V标志和Z标志判断是否溢出。

况且,如果确实要C标志,可以使用ADDW X, #1实现INCW的功能。
香水城 发表于 2011-6-29 14:36


多谢。

使用特权

评论回复
19
香水城| | 2011-6-29 14:59 | 只看该作者
哈哈,谢谢LZ的质疑,看起来STM8的设计还是比较合理的,:victory:

使用特权

评论回复
20
CC2530|  楼主 | 2011-6-29 15:07 | 只看该作者
本帖最后由 CC2530 于 2011-6-29 15:22 编辑
INC和DEC也没有设置C标志,但你可以用V标志和Z标志判断是否溢出。

况且,如果确实要C标志,可以使用ADDW X, #1实现INCW的功能。
香水城 发表于 2011-6-29 14:36


终于想起来了,我为什么要说16位加减没进位。
原来是16位加减无法带进位运算。
(没ADCW,SBCW指令)

还有,操作数必须是RAM才有进位,立即数无进位。
ADDW X,#1      没有进位
ADDW X,MEM   才有进位

使用特权

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

本版积分规则

个人签名:该死的ST,还不赶快出STM8L小FLASH片子

0

主题

262

帖子

1

粉丝