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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版