在Keil新建的所有工程中,毫无例外地都包含startup_M051.s,如图19.1-1。
图19.1-1 startup_M051.s
该文件主要作用于上电时初始化单片机的硬件堆栈、初始化RAM、分配内存空间和跳转到主函数即main函数。硬件堆栈是用来存放函数调用地址、变量和寄存器值的;分配内存空间为异常提供更加快速的访问,减少中断延迟。如果不加载该startup_M051.s文件,编译的代码可能会使单片机不能正常工作。 那么什么是堆栈呢?在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈这两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。 堆,一般是在堆的头部用一个字节存放堆的大小,堆中的具体内容由程序员安排。 栈,在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,接着是函数中的局部变量,注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址(后进先出),也就是主函数中的下一条指令,程序由该点继续运行。 虽然堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因。 startup_M051.s文件并不复杂,只要用户有基本的汇编基础,就可以看懂,以下就给出该上电初始化文件的详细注解,可以作为参考,只作为选学内容。
|