将在Keil运行成功的工程移植到SW4STM32 AC6上

最近尝试由Keil工具转到SW4STM32 AC6,毕竟,SW4STM32 AC6是免费的。

先下载安装好SW4STM32 AC6软件,因为该IDE是基于Eclipse框架开发,所以同时需要Java 运行环境 JRE。

sw4stm32可以在下面链接下载 
http://www.ac6-tools.com/downloads/SW4STM32/ 

JRE安装直接从oracle 下载安装

安装新建工程部分这节不写,以下主要记录这次移植过程中遇到的问题以及解决方法。

硬件:STM32F429IGTx系列

软件:SW4STM32

下载器:STLINK

移植过程中遇到几个问题,排查问题点从以下几个方面入手:(通过设置断点排查定位一下出错位置,缩小排查范围)

1、对比MDK和SW4STM32两者汇编.s文件堆栈大小设置
2、对比修改MDK和SW4STM32内存对齐 __align以及指定具体地址,内存映射等
3、对比修改MDK和SW4STM32编译器相关的汇编函数指令
4、MDK和SW4STM32两者lds链接文件对应一下

解决方法:

1、烧录问题:STLink需要复位才能下载进板子上,注意下面红色方框选择“Software system reset”。

将在Keil运行成功的工程移植到SW4STM32 AC6上_第1张图片

2、keil和SW4STM32字节对齐和指定到具体地址有不一样的表达

keil里面的内存池、内存管理表语句是:

将在Keil运行成功的工程移植到SW4STM32 AC6上_第2张图片

SW4STM32里面 GCC 对齐是 __attribute__((__aligned__(n)));
以及要把内存固定到某一地址,GCC就只能定义一个段,lds指定这个段的起始地址,段大小,变量链接到这个段中;

不用申请变量区域,直接把地址写到内存分配的那个表的部分,这种方式我没有试过,后面会试一下,改ld文件不能有地址冲突,要清楚怎么改才行,确保lds文件内存分配跟手动指定的内存区域没有冲突,大家如果感兴趣可以参考这位朋友的文章,链接:https://www.cnblogs.com/RegressionWorldLine/p/11968467.html

以上问题我直接这样改:

将在Keil运行成功的工程移植到SW4STM32 AC6上_第3张图片

3、keil编译器和SW4编译器汇编指令不一致,需要修改汇编指令

keil汇编指令是:

将在Keil运行成功的工程移植到SW4STM32 AC6上_第4张图片

直接全部屏蔽掉,因为没用到,因为我的工程只用到开关中断,所以我修改如下:

将在Keil运行成功的工程移植到SW4STM32 AC6上_第5张图片

__asm void INTX_DISABLE这样的函数是keil调用汇编函数语法,这是编译器不可移植的地方。

实际编译器可移植要用enable_irq函数,它在keil,gcc上有不一样的定义,这是编译器相关的部分。

Bx lr指令是函数返回,keil有asm修饰函数,是这么实现,但如果完全照搬到gcc就是指令跑飞,会进入死循环。

4、查看Keil和SW4STM32的编译预定义是否一致
SW4STM32添加编译预定义位置:属性Properties--C/C++ Build -- Settings -- Preprocessor)

将在Keil运行成功的工程移植到SW4STM32 AC6上_第6张图片

 

编译器设置有预定义加入、优化等级这些可进行设置

保持工程SW4STM32预定义跟keil一样就可以了。

 

以上是这次学习的记录,由于第一次写,所以有些表达不是很到位,大家凑合着看吧。

 

你可能感兴趣的:(stm32)