|  | 
 
| 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
 
 上面的属性主要是是对齐功能,按照最小对齐方式对齐,例如如果一个结构体里有一个char 和 一个int,正常情况按照4字节对齐,这个结构体需要占用8个字节,而如果使用__packed修饰,按照最小对齐,那么只需要5个字节。 keil 官网有如下一个例子复制代码This type attribute is a GNU compiler extension that the ARM compiler supports.
This attribute is equivalent to __packed
 The layout of S is:复制代码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 };
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);
 而GPIO_PinState是一个结构体复制代码void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
 我们现在直接赋值0 / 1 ,KEIL 在编译的时候报warning 属于正常,一个一个替换即可。复制代码typedef enum
{
  GPIO_PIN_RESET = 0U,
  GPIO_PIN_SET
}GPIO_PinState;
 | 
 |