打印
[开发工具]

MDK的MicroLIB与仿真 求教!!!

[复制链接]
2569|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zxl6534|  楼主 | 2013-4-1 14:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以前一直用原子提供的MDK3.80A,烧写调试也一直使用串口ISP的方式用得挺好。最近另外一个组的同事移交过来一个项目,他们的板子是用JTAG口进行烧写的,MCU是STM32F100C8,仿真工具是STLINKv2的。网上查了下MDK只有在4.2之后的版本才支持STLINKv2,好吧,直接官网下了个MDK4.7A版本的,**好,开始调试。直接打开原来MDK3.80A下的一个调试程序,设置好仿真的一些参数开始仿真。问题出来了,开始从复位状态开始运行,当运行到
跳转MAIN函数的语句时就会无限进入一个不可屏蔽中断,如下:
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                LDR     R0, =__main
                BX      R0                        //进入HARD_FAULT中断
                ENDP

//HARD_FAULT中断
HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler         [WEAK]
                B       .
                ENDP
网上查了下进入该中断的原因是堆栈溢出之类的。由于原来程序是在STM32F103C8上写的,现在换到了STM32F100C8上,猜想是不是启动文件或者头文件出了问题。于是在Debug里选上Run to main()跳过复位部分,发现程序会在不确定的随机位置进入HardFault中断。纠结了很久之后想在MDK4.7下重新建一个工程试试看。发现在新版本下STM32的启动文件改了,各种头文件例如.MAP .TYPE .CONF等都整合成了一个新的头文件stm32f10x.h。需要在C/C++配置 define里加上STM32F10X_HD USE_STDPERIPH_DRIVER等等等等,各种纠结之后终于可以调试了,然后同样的问题再次出现。纠结N久无果之后问同事拿来了他们之前在这套环境下写得程序,他们从未发生过这样的现象。开始比较两边程序的区**发现在他们的程序里用到了Printf()这个函数,之前记得要用这个函数需要调用微库。于是在Target配置里勾上Use MicroLIB,编译,仿真,这次好了,程序正常进入MAIN函数也再也没有进入过那个坑爹中断。
网上查了下microlib:
microlib 是缺省 C 库的备选库。 它用于必须在极少量内存环境下运行的深层嵌入式应用程序。 这些应用程序不在操作系统中运行。microlib 不会尝试成为符合标准的 ISO C 库。
microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。某些库函数的运行速度也比较慢,例如,memcpy()。
完全搞不明白不用微库怎么会导致这样奇怪的错误,希望各位前辈能够给予指点。之前对于这块完全没有理解,正好趁这个机会搞搞明白,谢谢了!!
沙发
airwill| | 2013-4-2 08:54 | 只看该作者
估计是地址设置问题. main 函数可能没有在合法的 flash  空间.
看一下编译器的芯片设置

使用特权

评论回复
板凳
liuyahoo| | 2013-8-1 10:09 | 只看该作者
我也有这个问题。关于MicroLib谁有比较详细的资料啊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

26

帖子

0

粉丝