版本 : 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的效果 那位高人知道这是什么回事? |
MDK5.29
2.测试结构体
3.C 与 ASM 对比
结论:未复现楼主所述问题,楼主可以考虑加上“__IO” 即 “volatile”关键字试一下。
评分
查看全部评分
//__packed修饰不进行内存对齐
//volatile修饰防止被编译器优化
typedef __packed struct _EVENTDEF
{
volatile u32 RxDataRdy_evt : 1 ;
volatile u32 HalfBufEmpty_evt : 1 ;
volatile u32 Reserved : 30;//保留
} EVENTDEF;
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))
评分
查看全部评分
STM32是有位带操作,一般只用外设的位带操作,还没用过内存的位带操作。你这里是内存位带操作,具体用哪个系列的,看一下对应的内核手册,有没有相应的内存位带操作。
评分
查看全部评分
我用的是M3, 是支持bit-band的
bitband的用法, keil官网上有说明
这是keil官网对bitband的说明, 只要是m3及m4的就支持, 甚至没提过编译器的版本。
{
u32 RxDataRdy_evt:1;
u32 HalfBufEmpty_evt:1;
u32 Reserved_evt:30;
}EVENTDEF;
volatile EVENTDEF Comm_Evt __attribute__((at(0x20001004)));
KEIL支持这样的方式
评分
查看全部评分
这不是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,不过也没感觉有啥特殊地方
在 CM3中,有两个区中实现了位带。其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB 范围。这个功能不是任何区域都可以。你看看文档中用的例子的地址。
评分
查看全部评分
感谢这位大侠, 问题解决了, 用编译器V5可以成功触发bitband的操作, 但也证实了编译器V6, 是不支持bitband(我用其它方法也解决了)