最近在研究F*R*E*E*RTOS,同时看PIC32,PIC24F的官方PORT,经过分析,发现了MPLAB IDE的TOOL——RTOS VIEWER的一个大BUG,很容易误导初学者,特此立贴,申请加精。
RTOSVIEWER菜单,会列出已经创建的TASK,并列出栈顶,栈底地址,同时背后有一个“used”,这个值,简单来说就是栈顶地址减去栈底地址(注意进制转换)。
在MPLAB IDEV850以及以下版本,这个值,针对PIC24在内的16BIT的含义是,已经使用堆栈的空间大小。针对PIC32的含义是,还可以使用的堆栈空间的大小。由于PIC24在内的16BIT的堆栈方向是正方面,PIC32是负方向,MPLAB IDE并没有考虑此点。(因为used的含义,应该是已经使用的,即按照PIC24的结果显示才是比较合适的,PIC32的显示是错误的,本人先看PIC32的移植,因此被搞得一头雾水。)
PS:从精确的角度,简单的地址相减是不对的,还要考虑对齐问题,比如PIC32是按4个字节对齐,做一个定性分析,不考虑太细的几个字节的偏差。
最后一个问题,PIC18F的“used”到底是表示什么意思,是已经使用的还是还可以使用的。很简单,可以自行测试。方法大致如下:
在工具栏显示“debug”(PIC18F可能是添加带i的LKR文件,针对MCC18)时,编译文件,并用MPLAB SIM模拟。
在主文件中创建一个任务。通过断点,使xTaskCreate语句执行完毕后停止,先观察此时的used值,记录下来,随便运行一会,在观察used值。如果值增加(比如PIC24),则表示used值为已经使用掉的堆栈,如果减少(比如PIC32),则表示还可使用的堆栈空间。用这样的土办法,是最直观可可靠的。当然,最简单的方法,可以去观察堆栈生长方向的定义与PIC24一致,还是与PIC32一致。 |