请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Keil 不支持 __attribute__((bitband))?

[复制链接]
edmundlee 提问时间:2020-2-22 14:51 /
100ST金币
版本 : uVision V5.29 , 编译器V6.13.1

在头文件定义了bitband的结构体, 总是有警告说不认识这bitband

typedef struct _EVENTDEF {
  u32   RxDataRdy_evt     : 1 ;
  u32   HalfBufEmpty_evt  : 1 ;

}EVENTDEF __attribute__((bitband));


../Inc/control.h(11): warning: unknown attribute 'bitband' ignored [-Wunknown-attributes]



把编译改为V5, 没有警告, 但也没有bitband的效果

那位高人知道这是什么回事?


最佳答案

查看完整内容

实测了一下1.测试环境 MDK5.29 2.测试结构体 3.C 与 ASM 对比 结论:未复现楼主所述问题,楼主可以考虑加上“__IO” 即 “volatile”关键字试一下。
收藏 1 评论13 发布时间:2020-2-22 14:51

举报

13个回答
byronsong 回答时间:2020-2-22 14:51:53
实测了一下1.测试环境
MDK5.29
bbenv.png
2.测试结构体
bbstruct.png
3.C 与 ASM 对比
bbhb.png

结论:未复现楼主所述问题,楼主可以考虑加上“__IO” 即 “volatile”关键字试一下。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

哀歌与世无争 回答时间:2020-2-22 21:08:27
不知道你说的bitband是啥,但是看上去是C语言位域的写法,我想你是要单独操作这个结构体的某一个吧,按下面这样写就能实现
//__packed修饰不进行内存对齐
//volatile修饰防止被编译器优化
typedef __packed struct _EVENTDEF
{
    volatile u32  RxDataRdy_evt         : 1 ;
    volatile        u32   HalfBufEmpty_evt  : 1 ;
    volatile        u32 Reserved                : 30;//保留
} EVENTDEF;
edmundlee 回答时间:2020-2-23 10:30:23
哀歌与世无争 发表于 2020-2-22 21:08
不知道你说的bitband是啥,但是看上去是C语言位域的写法,我想你是要单独操作这个结构体的某一个吧,按下面 ...


bitband跟你说的位定义不是同一回事, bitband定义下的结构体, 编译器会用“位带操作”

即, 等同于下面的自定义位带操作
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))   
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))   
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))  

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

七哥 回答时间:2020-2-23 11:06:34
软件的bitband,首先得硬件支持才行。
STM32是有位带操作,一般只用外设的位带操作,还没用过内存的位带操作。你这里是内存位带操作,具体用哪个系列的,看一下对应的内核手册,有没有相应的内存位带操作。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

edmundlee 回答时间:2020-2-23 11:20:26
toofree 发表于 2020-2-23 11:06
软件的bitband,首先得硬件支持才行。
STM32是有位带操作,一般只用外设的位带操作,还没用过内存的位带操 ...

我用的是M3, 是支持bit-band的
bitband的用法, keil官网上有说明

STM1024 回答时间:2020-2-23 14:16:07
这个是编译器指令,需要编译器支持,你先看看keil的arm编译器是否支持此项功能?
edmundlee 回答时间:2020-2-23 15:09:29
stm1024 发表于 2020-2-23 14:16
这个是编译器指令,需要编译器支持,你先看看keil的arm编译器是否支持此项功能? ...

这是keil官网对bitband的说明, 只要是m3及m4的就支持, 甚至没提过编译器的版本。

bitband.PNG
yklstudent 回答时间:2020-2-23 20:35:41
typedef struct _EVENTDEF
{
        u32 RxDataRdy_evt:1;
        u32 HalfBufEmpty_evt:1;
        u32 Reserved_evt:30;
}EVENTDEF;

volatile EVENTDEF Comm_Evt __attribute__((at(0x20001004)));
KEIL支持这样的方式

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

edmundlee 回答时间:2020-2-23 21:02:01
好的, 我先试一下, 先谢了
edmundlee 回答时间:2020-2-23 21:04:55
yklstudent-1794 发表于 2020-2-23 20:35
typedef struct _EVENTDEF
{
        u32 RxDataRdy_evt:1;

这不是bitband的定义, 这类定义是可以对位操作, 但不能触发编译器使用bit-band的安全操作
yklstudent 回答时间:2020-2-24 09:59:33
edmundlee 发表于 2020-2-23 21:04
这不是bitband的定义, 这类定义是可以对位操作, 但不能触发编译器使用bit-band的安全操作 ...

typedef struct _EVENTDEF
{
        u32 RxDataRdy_evt:1;
        u32 HalfBufEmpty_evt:1;
        u32 Reserved_evt:30;
}EVENTDEF __attribute__((bitband));;

//volatile EVENTDEF Comm_Evt __attribute__((at(0x20001004)));
volatile EVENTDEF Comm_Evt;

void uctsk_dog_init(void)
{
        Comm_Evt.RxDataRdy_evt = 0;
        Comm_Evt.HalfBufEmpty_evt = 0;
        Comm_Evt.Reserved_evt = 0;
}

void uctsk_dog(void *pvParameters)
{
    mico_context_t *mico_context = (mico_context_t*)(pvParameters);
   
    mico_context->coef.data.uwCRC = 0;
   
        Comm_Evt.RxDataRdy_evt ^= 1;
}
F4芯片下测试也是支持bitband,不过也没感觉有啥特殊地方
STM1024 回答时间:2020-2-25 00:26:19
edmundlee 发表于 2020-2-23 15:09
这是keil官网对bitband的说明, 只要是m3及m4的就支持, 甚至没提过编译器的版本。

...

在 CM3中,有两个区中实现了位带。其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB 范围。这个功能不是任何区域都可以。你看看文档中用的例子的地址。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

edmundlee 回答时间:2020-2-25 09:15:00
songshiqun2010 发表于 2020-2-24 11:49
实测了一下1.测试环境
MDK5.29

感谢这位大侠, 问题解决了, 用编译器V5可以成功触发bitband的操作, 但也证实了编译器V6, 是不支持bitband(我用其它方法也解决了)

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版