你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
tianyukobe 提问时间:2017-3-20 15:50 /
芯片: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).
头文件路径已都包含,百度谷歌 无果,求助弄过的大神,谢谢
收藏 1 评论7 发布时间:2017-3-20 15:50

举报

7个回答
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()的定义:
  1. /**
  2.   \brief   Set Main Stack Pointer
  3.   \details Assigns the given value to the Main Stack Pointer (MSP).
  4.   \param [in]    topOfMainStack  Main Stack Pointer value to set
  5. */
  6. __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
  7. {
  8.   register uint32_t __regMainStackPointer     __ASM("msp");
  9.   __regMainStackPointer = topOfMainStack;
  10. }
复制代码




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主堆栈指针赋值,不过就几条语句,简单的汇编命令而已。
若1989 回答时间:2018-1-17 17:57:54
你好,我也出现了同样的问题,最后楼主解决了吗?怎么解决的?

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版