|
发表于 2011-2-16 10:45:13
|
显示全部楼层
ba_wang_mao 大侠你好!
我最近一直想学RTOS,本身打算直接看uCOS2呢,但是感觉不太好懂,特别是汇编函数移植那一块实在搞不清。偶然想起以前看过一个帖子,你在上面说入门还是选择Small RTOS51比较合适。于是下了一篇电子书来看,已经看了一个多星期,除了后边第6章,第7章讲信号量、信号队列的没看,前边的五章都看了。我是分程序模块一部分一部分看的,大部分内容都理解了,但是中间关于堆栈变换函数的一部分一直不明白,今天早上来回又看了这一部分,感觉弄明白了一些。除此之外就是对整个程序的执行流程,在头脑里还没有联系起来想清楚。关于堆栈变换这一部分,感觉书上有些部分写的有些混乱或是不对。
首先书上第55页最下面一行说,“因为OSTaskStackBotton[x]为字节宽度,所以,当IDATA_RAM_SIZE为0x100时,OSTaskStackBotton[OS_MAX_TASKS+2]=0。”觉得数组里边的下标弄错了,应该是OSTaskStackBotton[OS_MAX_TASKS+1]=0,因为数组定义大小是OS_MAX_TASKS+2,所以最后一个可以引用的元素下标应该是OS_MAX_TASKS+1,对应的元素数组里存放的应是优先级最低的任务,即系统定义的最大任务数OS_MAX_TASKS,它代表的就是系统预定义的空闲任务,的堆栈栈顶地址。它是内部RAM空间的最大值,当为0x100时,8位截断,所以应该是0。
另一个大的问题就是书上66页中下部到69页中上部的,这部分内容,专讲C语言版的堆栈变换函数的C_OSCtxSw( )。这一部分我原来一直没看明白,是因为没有弄清它的堆栈变换和自由RAM搬移到底指的的什么。今天早上再看时,我联系起来前边55页下边的地方和后面所附的三个示意图,弄清了他说的数据移动的源起始地址、目的起始地址和结束条件指的的是什么,因此基本弄清了它说的自由RAM移动所代表的堆栈变换的意思。
关于这几个关键的变量我是这样理解的:
程序第(1)行的SP的值是经过上一步程序调整后的当前任务的堆栈指针的值,它指向当前任务堆栈中,最上边一个有用数据的值,就是51单片机中所说的堆栈栈顶的值。
程序第(2)行CP1的值是当前任务的堆栈指针SP的值加1,也就是自由RAM的低端地址。即是搬移的源起始地址。
程序第(3)行是指把当前堆栈指针设为备用数组的起始地址减1的值,因为51单片机入栈时,是先将SP+1后,再将数据压入SP+1所指地址的单元中的。
程序第(4)行temp指向的是新任务的下一个任务的栈底的地址,也就是,新任务的栈顶的地址。即循环搬移的结束条件判断值。
程序第(5)行CP2指向的是当前任务的下一个任务的栈底,也就是,当前任务的栈顶,也就是当前任务的自由RAM的高端地址。即是搬移的目的起始地址。
其中CP1和CP2代表的含义在OSTaskID小于或大于OSNextTaskID两种情况下是互换的。
但是对这一部分看过之后,还有如下疑惑或混乱的感觉:
1. 其中程序第(18)行是不是写错了,while循环判断条件应该是while(cp1 !=(uint8 idata * )temp)吧?
2. 图5.7画的流程图,里边写的大小条件是一样的,不对。
3. 对于69页上班页说的第二和第三两种情况的叙述,我怎么感觉是说反了。比如关于自由RAM在两种情况下是向高端或低端移动方向的叙述。
我自己理解那一阵感觉是对的,清楚的,但是看了他的叙述一对照又好像混了。想请你给一个明确的解释,澄清一下这一部分的混乱。
现在的问题就是这些,繁繁的写了这么多,期待你的释疑,先在此谢过!以后活或许还有问题要请教你。 |
|