tuzhuke 发表于 2017-12-4 09:03:38

bitcraze 代码移植到MDK(Keil)

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
      http://www.keil.com/support/man/docs/armcc/armcc_pge1464343207588.png


The layout of SP is:
Figure 9-2 Packed structure SP
         http://www.keil.com/support/man/docs/armcc/armcc_pge1464343208523.png

2 汇编移植
    __ASM volatile ("movs r3, #0\nldr r3, \nMSR msp, r3\n" : : : "r3", "sp");
3enumerated 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 属于正常,一个一个替换即可。
页: [1]
查看完整版本: bitcraze 代码移植到MDK(Keil)