打印
[PIC®/AVR®/dsPIC®产品]

dsPIC33位寻址的问题

[复制链接]
1595|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
12315kk|  楼主 | 2013-11-14 09:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 12315kk 于 2013-11-14 09:33 编辑

dsPIC33里面有位寻址的汇编指令,那如何能在C语言里定义使用位寻址呢?
沙发
1521732588| | 2013-11-14 11:49 | 只看该作者
定义位变量
bit

使用特权

评论回复
板凳
yewuyi| | 2013-11-14 11:54 | 只看该作者

#define              setbit(x,y)          (x|=(1<<y))  //置位操作
#define              clrbit(x,y)          (x&=~(1<<y)) //清位操作
#define              cplbit(x,y)          (x^=(1<<y))  //取反位操作
#define              getbit(x,y)          (x&(1<<y))   //测试位操作

在C当中不建议直接定义为bit,虽然PICC编译器支持这种定义,但其它很多C编译器都不支持,为了保持代码的通用性和可移植性,建议按照以上的方法写,则不管在何种C编译器或者芯片平台上,基本上都支持这种写法。

使用特权

评论回复
地板
12315kk|  楼主 | 2013-11-14 12:03 | 只看该作者
yewuyi 发表于 2013-11-14 11:54
#define              setbit(x,y)          (x|=(1

汇编指令里有
BSET     置位1
BCLR     清位0
BTG      取反位

有这些指令怎么能在C里面用宏定义呢

使用特权

评论回复
5
yewuyi| | 2013-11-14 12:26 | 只看该作者
12315kk 发表于 2013-11-14 12:03
汇编指令里有
BSET     置位1
BCLR     清位0

1、什么叫宏定义?你弄清楚了吗?
2、在C中,编译器会自动帮你转化为芯片所支持的汇编级位操作指令。

使用特权

评论回复
6
12315kk|  楼主 | 2013-11-14 13:40 | 只看该作者
yewuyi 发表于 2013-11-14 12:26
1、什么叫宏定义?你弄清楚了吗?
2、在C中,编译器会自动帮你转化为芯片所支持的汇编级位操作指令。
...

#define              setbit(x,y)          (x|=(1<<y))  //置位操作
会自动转成BSET指令?不可能吧

使用特权

评论回复
7
yewuyi| | 2013-11-15 08:19 | 只看该作者
12315kk 发表于 2013-11-14 13:40
#define              setbit(x,y)          (x|=(1

1、既然你说不可能,你到是说说为什么不可能?

2、去弄清楚什么叫宏定义?宏定义应该如何使用?这种入门的基础知识,不要让别人1+1=2开始给你讲。

使用特权

评论回复
8
12315kk|  楼主 | 2013-11-15 14:36 | 只看该作者
yewuyi 发表于 2013-11-15 08:19
1、既然你说不可能,你到是说说为什么不可能?

2、去弄清楚什么叫宏定义?宏定义应该如何使用?这种入门 ...





我只是猜测编译没有这么智能,事实也是除了Set_bit会用BSET,而Clr_Bit和Inv_Bit都是采用其它指令来完成

当然,我就是对宏定义不熟才发贴问的,如果熟我就直接写了,还用问?

使用特权

评论回复
9
12315kk|  楼主 | 2013-11-15 14:37 | 只看该作者


补充图

使用特权

评论回复
10
12315kk|  楼主 | 2013-11-16 09:03 | 只看该作者
经过自己的偿试,终于搞定了这个问题,分享给大家:
#define        Set_Bit(x,y)        asm volatile ("bset %0,#%1" :"=g"(x) :"i"(y))  //置位
#define        Clr_Bit(x,y)                        asm volatile ("bclr %0,#%1" :"=g"(x) :"i"(y))   //清位
#define        Inv_Bit(x,y)        asm volatile ("btg %0,#%1" :"=g"(x) :"i"(y))   //取反位

还有一个测试位没有找到解决办法。。

使用特权

评论回复
11
lanyong| | 2013-11-20 19:43 | 只看该作者
不错,加油

使用特权

评论回复
12
Rain_King| | 2013-11-22 09:03 | 只看该作者
12315kk 发表于 2013-11-15 14:37
补充图

第一个问题....你这个一句一句的c语言转汇编的,在哪里看到的??能否告诉我怎么看啊...第二,不错啊..加油..

使用特权

评论回复
13
12315kk|  楼主 | 2013-12-4 08:29 | 只看该作者
Rain_King 发表于 2013-11-22 09:03
第一个问题....你这个一句一句的c语言转汇编的,在哪里看到的??能否告诉我怎么看啊...第二,不错啊..加 ...

一。这个C语言转汇编可以在MPLAB里面的View -> Disassembly Listing中打开
二。大家共同学习交流

使用特权

评论回复
14
12315kk|  楼主 | 2013-12-4 08:31 | 只看该作者
测试位操作的宏定义还是没有找到很好的方法,有方法的可以分享一下

使用特权

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

本版积分规则

1

主题

12

帖子

1

粉丝