|
bitcraze 代码是在ubuntu上使用GCC 编译的,国内使用linux 开发stm32 的用户非常有限,大多使用Keil ,少量用户使用IAR
这里我尝试移植到Keil 下,移植注意事项: 使用stm32 cube STM32F07 相关的代码,因为这个库中的hal 层函数与bitcraze最为接近,不要使用单独std lib !不然问题多多!
其它问题汇总:
1 __attribute__((packed))属性
在移植过程中,会遇到如下的一个属性 __attribute__((packed)),这个要替换位__pack,编译器不同,前者适合GCC,后者用于Keil,下面摘录keil 官网
http://www.keil.com/support/man/ ... hr1359124980173.htm
- This type attribute is a GNU compiler extension that the ARM compiler supports.
- This attribute is equivalent to __packed
复制代码 上面的属性主要是是对齐功能,按照最小对齐方式对齐,例如如果一个结构体里有一个char 和 一个int,正常情况按照4字节对齐,这个结构体需要占用8个字节,而如果使用__packed修饰,按照最小对齐,那么只需要5个字节。 keil 官网有如下一个例子
- typedef struct
- {
- char a;
- int b;
- } S;
- #pragma pack(2)
- typedef struct
- {
- char a;
- int b;
- } SP;
- S var = { 0x11, 0x44444444 };
- SP pvar = { 0x11, 0x44444444 };
复制代码 The layout of S is:
Figure 9-1 Nonpacked structure S
The layout of SP is:
Figure 9-2 Packed structure SP
2 汇编移植
- __ASM volatile ("movs r3, #0\nldr r3, [r3, #0]\nMSR msp, r3\n" : : : "r3", "sp");
复制代码
3 enumerated type mixed with another type
查看问题代码:
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, 0);
复制代码 然后看这个函数的定义
- void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
复制代码 而GPIO_PinState是一个结构体
- typedef enum
- {
- GPIO_PIN_RESET = 0U,
- GPIO_PIN_SET
- }GPIO_PinState;
复制代码 我们现在直接赋值0 / 1 ,KEIL 在编译的时候报warning 属于正常,一个一个替换即可。
|
|