tianyukobe 发表于 2017-3-20 15:50:02

STM32F103做IAP,编译过程报 Undefined symbol __set_MSP

芯片:STM32F103VC
官方库:V3.5
MDK:      5.11
在做IAP工程时,参考官方代码
if (((*(__IO uint32_t*)AppAddress) & 0x2FFE0000 ) == 0x20000000) //检查栈顶地址是否合法.
        {/* Jump to user application */

                JumpAddress = *(__IO uint32_t*) (AppAddress + 4);
                /* 用户应用地址 */
                Jump_To_Application = (pFunction) JumpAddress;
                /* Initialize user application's Stack Pointer */
                __set_MSP(*(__IO uint32_t*) AppAddress);
               //跳转到APP.
                Jump_To_Application();                              
        }


编译过程出现 Error: L6218E: Undefined symbol __set_MSP (referred from iap.o).
头文件路径已都包含,百度谷歌 无果,求助弄过的大神,谢谢

tianyukobe 发表于 2017-3-20 16:59:57

zero99 发表于 2017-3-20 16:15
酱哒哒的回复:

Undefined symbol __set_MSP (referred from iap.o).翻译一下,就是未定义


感谢您的回复,在IAR确实没有问题,不过我用MDK编译ST官方的历程,就可以通过,我搜索了一下,结果如下
Searching for '__set_MSP'...
F:\STM32 开发手册\USB\STM32_USB-FS-Device_Lib_V4.0.0\Projects\Device_Firmware_Upgrade\src\main.c(78) :       __set_MSP(*(__IO uint32_t*) ApplicationAddress);
D:\Program Files\MDK\Keil_V5\ARM\PACK\ARM\CMSIS\4.1.1\CMSIS\Include\core_cmFunc.h(168) : __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
D:\Program Files\MDK\Keil_V5\ARM\PACK\ARM\CMSIS\4.1.1\CMSIS\Include\core_cmFunc.h(454) : __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
Lines matched: 3      Files matched: 2      Total files searched: 146

但是我自己建的工程就没有,不知道这个路径怎么知道MDK安装目录的,好像不是在include paths里面

moyanming2013 发表于 2017-3-20 16:46:14

本帖最后由 moyanming2013 于 2017-3-21 12:30 编辑

zero99 发表于 2017-3-20 16:15
酱哒哒的回复:

Undefined symbol __set_MSP (referred from iap.o).翻译一下,就是未定义

酱哒哒的回复有些误导(“__set_MSP是IAR软件可以使用的一个东西”)!另外最后也没有解决问题(百度不是什么都能解决的)。

“__set_MSP”函数原型为:
__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack);
该函数是ARM定义好的内核功能函数之一:设置主栈指针,该函数以存在于头文件(cmsis_armcc.h)的形式提供给各芯片厂商、IDE等使用(不是哪个芯片厂商或IDE特有的)。
简单说,如果楼主按照官方的例子还出现此类问题,是由于没有正确的包含路径所致,一般需要包含形如“CMSIS\Include”的路径(针对多IDE环境可能导致包含交叉而找不到定义)。自己写一个该函数根本不可取(因为如果此函数找不到定义,那么势必会有其它函数也会找不到而且会有很多!),工程中对于内核功能函数的引用也不可能只有这一个(你可能没看到其它的)。可以搜索相关路径(在mdk-arm中)找到cmsis_armcc.h所在的路径,然后明显的包含该路径即可。
建议楼主使用STM32CUBEF1来替代旧版本的库函数。ARM对__set_MSP()的定义:
/**
\brief   Set Main Stack Pointer
\details Assigns the given value to the Main Stack Pointer (MSP).
\param     topOfMainStackMain Stack Pointer value to set
*/
__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
{
register uint32_t __regMainStackPointer   __ASM("msp");
__regMainStackPointer = topOfMainStack;
}



zero99 发表于 2017-3-20 16:15:27

酱哒哒的回复:

Undefined symbol __set_MSP (referred from iap.o).翻译一下,就是未定义
为啥未定义,因为这个东西是设置主堆栈指针,__set_MSP是IAR软件可以使用的一个东西(简单说就是封装了下这个函数)。
估计是MDK没有封装这个东西,所以用不了。
自己写个汇编设置地址一样,就是简单的设置MSP堆栈指针,挺简单的(自己百度吧,百度好了,你再把那个汇编封装成__set_MSP,就可以用了)。

xmshao 发表于 2017-3-20 15:58:47

本帖最后由 xmshao 于 2017-3-20 16:03 编辑

应该是工程里少了跟内核定义相关的代码,你查下那个core_cm3.c文件加进来没有。

最简单的方法基于ST的模板建个新工程。说不定你少的文件还不止一个。

tianyukobe 发表于 2017-3-20 17:08:26

moyanming2013 发表于 2017-3-20 16:46
酱哒哒简直在胡扯(“__set_MSP是IAR软件可以使用的一个东西”)!另外最后也没有解决问题。

“__set_MSP ...

是的,我在我电脑里面搜cmsis_armcc.h, 只有CUBE库里面有这个.h 文件, 标准库没有这个文件

酱哒哒 发表于 2017-3-20 17:09:05

tianyukobe 发表于 2017-3-20 16:59
感谢您的回复,在IAR确实没有问题,不过我用MDK编译ST官方的历程,就可以通过,我搜索了一下,结果如下
S ...

不用谢,实在找不到路径,而且问题又只有这个__set_MSP,就可以自己编写一个,官方的也是人编写出来的。MSP主堆栈指针赋值,不过就几条语句,简单的汇编命令而已。:lol

若1989 发表于 2018-1-17 17:57:54

你好,我也出现了同样的问题,最后楼主解决了吗?怎么解决的?
页: [1]
查看完整版本: STM32F103做IAP,编译过程报 Undefined symbol __set_MSP