显示标签为“__main”的博文。显示所有博文
显示标签为“__main”的博文。显示所有博文

2014年5月10日星期六

关于ARM处理器在执行__main和__rt_entry之间的代码时出现 HardFault 异常问题解释(备忘录)

    关于__main和__rt_entry(点击这里进入详细页面,keil说明)的作用(或者进入ARM官网查看).
    现在开始说为什么出现异常,因为当__main中的代码执行时使用到了堆栈(stack:也就是处理器中的sp寄存器),__main内部调用两层以上的函数,比如A函数调用B函数,进入B函数时A函数中的调用B函数的指令的下一个位置会地址push进堆栈(sp),当copy或者初始化全局变量时刚好把堆栈中的数据清零了,结果调用POP指令把堆栈中的数据取回到PC中,那么这时PC的值是0,然后ARM处理器就开始进入了HardFault异常处理。
    不解的是,你手动把PC的值改为0的话处理器又不进入HardFault异常处理程序,郁闷不解!

解决办法就是在AREA中加入NOINIT关键字:
 AREA init_stack,DATA;,NOINIT
s_size EQU 0x200
 SPACE s_size
stack_End

2014年4月26日星期六

C库(C 标准函数库(C Standard library))

C库(C 标准函数库C Standard library))是什么?具体我也不知道!还是去看wiki吧!
看完上面的,下面我来说说为什么要用C库,因为我在写一个单片机程序时发现我定义的全局变量无法初始化为我想要的初始值(就比如说我要的int t=30;结果却是0或是别的),而局部变量却可以,然后我去看了看ST公司所提供的启动文件(因为我用的单片机是STM32F0系列单片机),看到他调用的函数是“__main”,结果我在自己写的启动代码中把“main”改为“__main”,全局变量就初始成我想要的值了。
想了解ARM的c库的话:RealView 编译工具 库和浮点支持指南
KeilMDKRealView一样,所以不想看英文的帮助文档的话,那么可以去看RealView的中文帮助文档!中英文帮助手册结合来看更不错!