打印
[STM32F1]

STM32的位段操作问题

[复制链接]
4143|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
亚历山大Y|  楼主 | 2014-8-30 13:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠,
  需要将一个8位的char型数据发送到8个IO口(PB区域4个,PG区域4个),用什么语句实现最快?
  方法1:对8位数据各位判断是不是1,如果是1,则对相应的IO口置高电平,否则置低电平。
   分析:这个操作貌似比较麻烦,需要位操作,然后判断比较,最后赋值。
  方法2:查了下,C语言中有位段操作,即定义一个结构体,然后可对各位进行直接操作。
   分析:这个耗时会不会短一些?
    我写了段代码如下,但语法有问题,对着谭浩强的书写的,自己实在看不出毛病来。有大侠能否看下:
   typedef struct bus_data
{
        unsigned int b0:1;
        unsigned int b1:1;
        unsigned int b2:1;
        unsigned int b3:1;
        unsigned int b4:1;
        unsigned int b5:1;
        unsigned int b6:1;
        unsigned int b7:1;
}sys_outdata ;
       
         sys_outdata.b0=0;//显示这句话有错误。

十分感谢!
沙发
小浣熊| | 2014-8-30 15:05 | 只看该作者
呵呵 不是很明白啊,我也看不出毛病,高手进!

使用特权

评论回复
板凳
亚历山大Y|  楼主 | 2014-8-30 17:14 | 只看该作者
自己顶一下。等待高手

使用特权

评论回复
地板
STM32初学者| | 2014-8-30 17:30 | 只看该作者
亚历山大Y 发表于 2014-8-30 17:14
自己顶一下。等待高手

结构体的初始化,不是这么初始化的吧

使用特权

评论回复
5
亚历山大Y|  楼主 | 2014-8-30 18:04 | 只看该作者
STM32初学者 发表于 2014-8-30 17:30
结构体的初始化,不是这么初始化的吧

如何初始化?我看网上例子是如此,实际语法貌似没错。。。

使用特权

评论回复
6
hdp7891000| | 2014-8-30 18:37 | 只看该作者
去掉typedef

使用特权

评论回复
7
菜鸟同学| | 2014-8-30 18:43 | 只看该作者
   typedef struct bus_data
{
        unsigned int b0:1;
        unsigned int b1:1;
        unsigned int b2:1;
        unsigned int b3:1;
        unsigned int b4:1;
        unsigned int b5:1;
        unsigned int b6:1;
        unsigned int b7:1;
}sys_outdata ;

sys_outdata  是一个类型了,不是你定义的一个数据,现在sys_outdata 就相当于是int char short long float double 这些了。
typedef 是你自己重定义了一个类型。

C语言基础多看,如果还没看明白,那么举例吧。
sys_outdata xx;
xx.b1=0;
类似这样的才是对的。

使用特权

评论回复
评论
亚历山大Y 2014-8-31 10:57 回复TA
尝试了大侠的改法,还是报错啊。bus_data才是一个类吧。 
8
ZhangStudy| | 2014-8-30 20:19 | 只看该作者
sys_outdata是类型

使用特权

评论回复
9
STM32初学者| | 2014-8-30 20:29 | 只看该作者
看谭的书,死的快,还不如问度娘呢

使用特权

评论回复
评论
亚历山大Y 2014-8-31 10:50 回复TA
怎么说?谭是大师,还死得快? 
10
huzi2099| | 2014-8-31 00:42 | 只看该作者
本帖最后由 huzi2099 于 2014-8-31 00:44 编辑

你这个不算位段操作,你看看汇编就知道了还是"与"的操作.
另外要用联合而不是结构.

使用特权

评论回复
11
亚历山大Y|  楼主 | 2014-8-31 10:49 | 只看该作者
huzi2099 发表于 2014-8-31 00:42
你这个不算位段操作,你看看汇编就知道了还是"与"的操作.
另外要用联合而不是结构. ...

多谢,
大侠的意思是,这样的结构体不能提高执行效率,其本质不是真正的位操作?用联合体?能否提示下。
一直在找执行效率最高的这段代码。

使用特权

评论回复
12
亚历山大Y|  楼主 | 2014-8-31 10:56 | 只看该作者
菜鸟同学 发表于 2014-8-30 18:43
typedef struct bus_data
{
        unsigned int b0:1;

多谢大侠,
bus_data是一个类吧,sys_outdata是这个类下面的一个变量。

使用特权

评论回复
13
亚历山大Y|  楼主 | 2014-8-31 11:20 | 只看该作者
ZhangStudy 发表于 2014-8-30 20:19
sys_outdata是类型

多谢,
sys_outdata是类型,那bus_data是什么?

使用特权

评论回复
14
菜鸟同学| | 2014-8-31 14:35 | 只看该作者
typedef 把
struct bus_data 转化为
bus_data
怎么可能出错!你自己好好看看吧。

使用特权

评论回复
15
huzi2099| | 2014-8-31 14:52 | 只看该作者
亚历山大Y 发表于 2014-8-31 10:49
多谢,
大侠的意思是,这样的结构体不能提高执行效率,其本质不是真正的位操作?用联合体?能否提示下。 ...

union,具体用法的你嗖嗖,不过这个也不行,因为它需要C编译器配合MCU特性.
真正能提高效率的是MCU位带特性,库里有例程你看看.

使用特权

评论回复
16
亚历山大Y|  楼主 | 2014-8-31 20:48 | 只看该作者
huzi2099 发表于 2014-8-31 14:52
union,具体用法的你嗖嗖,不过这个也不行,因为它需要C编译器配合MCU特性.
真正能提高效率的是MCU位带特性, ...

多谢大侠,
  位带操作对IO口倒是知道,对普通的变量也行?比如char型的?

使用特权

评论回复
17
一往直前| | 2014-8-31 21:25 | 只看该作者
结构体的初始化错误了。试试struct bus_date{
        ....//不变
};
struct sTime sys_outdata;

使用特权

评论回复
18
ZhangStudy| | 2014-8-31 21:58 | 只看该作者
亚历山大Y 发表于 2014-8-31 11:20
多谢,
sys_outdata是类型,那bus_data是什么?

bus_data 也是类型。

使用特权

评论回复
19
huzi2099| | 2014-9-1 20:16 | 只看该作者
亚历山大Y 发表于 2014-8-31 20:48
多谢大侠,
  位带操作对IO口倒是知道,对普通的变量也行?比如char型的? ...

可以的,你可以看看固件库里的例子

使用特权

评论回复
20
myxiaonia| | 2014-9-1 23:27 | 只看该作者
想用结构体位带,mdk有个扩展关键字,这种知识首先查mdk帮助文档,最有效也最权威

使用特权

评论回复
评论
亚历山大Y 2014-9-2 10:33 回复TA
多谢大侠。扩展关键字大概是什么,能够提示下,我好查。 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

135

主题

588

帖子

2

粉丝