第一章 经典暗器 【开门见山的废话】 菜鸟学μC/OS-II时,一般,会遇到以下问题: ·栈是啥玩意?感觉μC/OS-II到处是“栈栈栈”。 ·CPU寄存器又是啥? 栈、CPU寄存器非常“经典”,对于C程序员来说“并不可见”,所以,本书称它们为“经典暗器”。 本章要要做的,就是分析这些暗器。 · 栈【概念简要说明】 ·栈:一种数据结构,是一个虚无①的东西,其实体是RAM。STM32的栈就存在RAM中。 特点:先进后出,只能在它的一端进行插入和删除操作(这么戳的东西,还挺有用)。 ·栈底:栈存储变量的起始地址。 ·栈顶:栈中最后压入数据的地址。 ·栈顶指针:SP(Stack Point),指向栈顶。SP的值存放在CPU寄存器②中。 当PUSH、POP时,栈顶就变了,所以,SP的值也会跟着自动改变。 【相关重要说明】 有些葵花宝典或神来之笔说,栈顶指针指向当前存储数据的下个存放地址,这是有误的③。 栈顶指针“名副其实”就是指向当前存储数据“最上面”的地址。 【碉堡指引】 什么时候需要入栈?什么时候需要出栈?什么时候需要改变栈顶指针?后面章节会有少量相关说明,但不多。 读者看的不明白,笔者也没办法,这个问题只能交给他们自己去解决。 解决方法是:学习点汇编语言,推荐学8051,简单,容易抓住核心,容易明白所以然。 ------------------------------------------------------------------------------------------------------------------------------------------- ① 有人问过我:“什么是栈,跟CPU寄存器、RAM、ROM有什么关系?” 我说:“它是个虚无的东西,跟RAM有关,跟CPU寄存器没球关系,除非CPU寄存器希望它帮忙存下东西(任务切换),才会偶尔的发生下性关系。” ② SP存在CPU寄存器中,这样,CPU才能快速访问。对于一般的MCU来说,没缓存,没其它地方可供存放,SP存在CPU寄存器中更是毫无疑问。 ③ 另外,有些雾里看花的秘籍写道“SP总是先加1或减1再存数据(看堆栈是递减还是递增)”,之所以说它们“雾里看花”,是因为: ·SP不是加1或减1,即不是偏移1,而是偏移n个堆栈单位长度。在μC/OS-II里,系统需定义堆栈长度,如:typedef unsigned int OS_STK。 n>=1,由变量类型决定。如用INT8U、INT16U、INT32U定义变量,则n=1,如用FP64定义变量,则n=2。 (为方便懒人输入,下文将“偏移n个堆栈单位长度”简写为“偏移”。) ·当使用C语言存变量时,SP会自动偏移再存。 (但,这其实没有绝对,请参阅【第二章】;另外,汇编语言存变量,SP也不会自动偏移再存。) ·当使用汇编语言PUSH/POP时,SP会自动偏移再存。 (如果不是PUSH/POP,则是直接存入SP指向的地址,SP并不会自动偏移,这将导致SP指向的地址中的内容会被覆盖。) 以上说明,笔者已通过实验检验。 自私声明:其实,笔者也可能在本宝典中犯些类似的错误,诚恳的希望读者能提出,这样,笔者才能修正错误。 ------------------------------------------------------------------------------------------------------------------------------------------- · CPU寄存器CM3STM32 的CPU寄存器如下(以下截图来自μVisions编译器): ·R0-R12:平民百姓 ·R13(SP):存放堆栈指针 ·R14(LR):存放最近一次被转向前①的PC值 ·R15(PC):存放下一条将要执行的指令地址② ·xPSR:特殊功能寄存器 介绍到这,就够后续几章用了,关于Cortex-M3的CPU寄存器更多说明,参见【第十一章】。 ------------------------------------------------------------------------------------------------------------------------------------------- ① 函数执行到一半,调用了其它函数,或者被中断,则pc会突然改变,否则,pc将自动指向下一条指令的地址。 ② 很多书籍或文档,写的是“下一条指令地址”,笔者认为,还是加上“将要执行”才不会有歧义。 ------------------------------------------------------------------------------------------------------------------------------------------- |