立即注册 找回密码

微雪课堂

搜索
微雪课堂 操作系统 μC/OS-II卧槽宝典 查看内容

《μC/OS-II卧槽宝典(上)》 【连载 第一章 经典暗器】

2016-9-26 15:02| 发布者: waveshare-admin| 查看: 3558| 评论: 0

摘要: 菜鸟学μC/OS-II时,一般,会遇到以下问题: ·栈是啥玩意?感觉μC/OS-II到处是“栈栈栈”。 ·CPU寄存器又是啥?
第一章 经典暗器

开门见山的废话
菜鸟学μ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将自动指向下一条指令的地址。
② 很多书籍或文档,写的是“下一条指令地址”,笔者认为,还是加上“将要执行”才不会有歧义。
-------------------------------------------------------------------------------------------------------------------------------------------


341

顶一下

刚表态过的朋友 (341 人)

相关阅读

最新评论

μCOS-II

微雪官网|产品资料|手机版|小黑屋|微雪课堂. ( 粤ICP备05067009号 )

GMT+8, 2024-4-19 06:55 , Processed in 0.035501 second(s), 32 queries .

返回顶部