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

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

[复制链接]
Terry123 提问时间: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个回答
Terry123 回答时间: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的模板建个新工程。说不定你少的文件还不止一个。
Terry123 回答时间: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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版