sswanglei 发表于 2008-1-15 10:51:15

ucosii-285在winavr20070525中移植问题求助!

目标CPU:m128
问题概述:
(1)若在main函数中建立所有的任务,如下:
int main(void)
{
    TargetInit();
       
        OSInit();
   
    OSTaskCreateExt(TaskStart,
                  (void *)0,
                  &TaskStartStk,
                  TaskStartPrio,
                  TaskStartPrio,
                  &TaskStartStk,
                  OS_TASK_START_STK_SIZE,
                  (void *)0,
                  OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR );
   OSTaskCreateExt(TaskTest0,
                   (void *)0,
                  &TaskTestStk0,
                  TaskTest0Prio,
                  TaskTest0Prio,
                  &TaskTestStk0,
                  OS_TASK_STK_SIZE,
                  (void *)0,
                  OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR );
        OSStart();
        return 0;
}   

一切正常,下载到目标板也能正常工作。
(2) 若采用如下方式,将TaskTest0任务的建立放到TaskStart任务中
void TaskStart(void *pdata)
{
       
       pdata = pdata;
          init_timer0();/*初始化时钟节拍中断*/
          
   OSTaskCreateExt(TaskTest0,
                   (void *)0,
                  &TaskTestStk0,
                  TaskTest0Prio,
                  TaskTest0Prio,
                  &TaskTestStk0,
                  OS_TASK_STK_SIZE,
                  (void *)0,
                  OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR );
       while(1)
       {
          GREEN_LED_CHG
                OSTimeDlyHMSM(0,0,2,0);
       }

}

编译链接没有问题,但是下载到m128中不能正常工作,下面对该程序进行了分析,发现在建立TaskTest时Ram乱了,具体分析见下文:
(1)Mega64(同128)的SRAM结构为:内部的32个寄存器和224个IO寄存器,内部RAM地址从0x100开始,一直到0x10FF;
(2)工程编译通过,占用的flash 、ram空间如下:
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_201612.jpg

(3) 该工程共3个任务,TaskStart堆栈为300,TaskTest为100,IdleTask为64;
编译后改任务占ram空间为1890个字节,从0x100--0x861;
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_201614.jpg
OSMapTbl            0x08            0x100-0x107
OSUnMapTbl         0x100            0x108-0x207
TaskStartStk         0x12c         0x208-0x333
TaskTestStk0         0x64         0x334-0x397
OSLockNesting      0x1             0x398
OSRunning         0x1            0x399
OSIdleCtr            0x4            0x39A-0x39D
OSPrioHighRdy       0x1            0x39E
OSPrioCur            0x1            0x39F
OSTCBList         0x2            0x3A0-0x3A1
OSCtxSwCtr          0x4            0x3A2-0x3A5
OSTCBFreeList      0x2            0x3A6-0x3A7
OSTaskCtr            0x1            0x3A8
OSTCBHighRdy       0x2            0x3A9-0x3AA
OSRdyGrp            0x1            0x3AB
OSRdyTbl            0x8            0x3AC-0x3B3
OSEventFreeList       0x2            0x3B4-0x3B5
OSIntNesting          0x1            0x3B6
OSTCBCur            0x2            0x3B7-0x3B8
OSTime               0x4            0x3B9-0x3BC
OSTaskIdleStk         0x40             0x3BD-0x3FC
OSEventTbl         0xdc             0x3FD-0x4D8
OSTCBTbl            0x309            0x4D9-0x7E1
OSTCBPrioTbl         0x80             0x7E2-0x8b1

(4) 错误出现在TaskTest任务的建立函数中,在执行voidOS_TaskStkClr (OS_STK *pbos, INT32U size, INT16U opt) 时,size大小在执行size--操作时,莫名其妙的改变了! pbos地址为0x2F4,size地址为0x2F6.
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_201615.jpg






工程文件:(avrstudio4.12+winavr20070525)
点击此处下载ourdev_201616.rar(文件大小:234K)
上边说明文档的doc格式:
点击此处打开ourdev_201617.doc(文件大小:116K)

sswanglei 发表于 2008-1-16 17:28:47

:( 没人帮忙啊~ 是我描述得不清楚吗?

TTLife 发表于 2008-1-16 22:50:36

问题找到了:
首先,栈分为硬件栈和软件栈.R0至R31还有SP等M128的寄存器全都分配到硬件栈,在任务间切换时,按OSTaskStkInit函数安排的顺序入栈;软件栈存放来自PUSH命令的数据.

先看二幅截图:
第一幅是TaskStart函数在初始化栈后的截图:
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_202112.JPG
我编译后分配的硬件栈地址为:0x311-0x333.

第二幅是准备运行TaskStart时的汇编截图:
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_202113.JPG
请注意SP的值   :)
可以看到SP在进入任务时,没有把它指向软件栈,也即0x310.
呵呵,硬件栈不保啊!!!!!!!

sswanglei 发表于 2008-1-17 15:34:07

多谢!

感觉分析的不是很对呢? 之所以在TaskStart开始时SP恢复到0x333,是因为以前入栈的寄存器已经完全出栈吧? 我晕了~~~唉。。。。


下边上传一个iar下的移植程序,比较完整,经过测试没有什么问题,而且有详细注释。
点击此处下载ourdev_202357.rar(文件大小:1.82M)

sswanglei 发表于 2008-1-22 09:44:07

顶起来~~
页: [1]
查看完整版本: ucosii-285在winavr20070525中移植问题求助!