搜索
bottom↓
回复: 4

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

[复制链接]

出0入0汤圆

发表于 2008-1-15 10:51:15 | 显示全部楼层 |阅读模式
目标CPU:  m128
问题概述:
(1)若在main函数中建立所有的任务,如下:
int main(void)
{
    TargetInit();
       
        OSInit();
   
    OSTaskCreateExt(TaskStart,
                    (void *)0,
                    &TaskStartStk[OS_TASK_START_STK_SIZE - 1],
                    TaskStartPrio,
                    TaskStartPrio,
                    &TaskStartStk[0],
                    OS_TASK_START_STK_SIZE,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR );
     OSTaskCreateExt(TaskTest0,
                   (void *)0,
                    &TaskTestStk0[OS_TASK_STK_SIZE - 1],
                    TaskTest0Prio,
                    TaskTest0Prio,
                    &TaskTestStk0[0],
                    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[OS_TASK_STK_SIZE - 1],
                    TaskTest0Prio,
                    TaskTest0Prio,
                    &TaskTestStk0[0],
                    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空间如下:


(3) 该工程共3个任务,TaskStart堆栈为300,TaskTest为100,IdleTask为64;
编译后改任务占ram空间为1890个字节,从0x100--0x861;

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任务的建立函数中,在执行void  OS_TaskStkClr (OS_STK *pbos, INT32U size, INT16U opt) 时,size大小在执行size--操作时,莫名其妙的改变了! pbos地址为0x2F4,size地址为0x2F6.







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

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2008-1-16 17:28:47 | 显示全部楼层
:( 没人帮忙啊~ 是我描述得不清楚吗?

出0入0汤圆

发表于 2008-1-16 22:50:36 | 显示全部楼层
问题找到了:
首先,栈分为硬件栈和软件栈.R0至R31还有SP等M128的寄存器全都分配到硬件栈,在任务间切换时,按OSTaskStkInit函数安排的顺序入栈;软件栈存放来自PUSH命令的数据.

先看二幅截图:
第一幅是TaskStart函数在初始化栈后的截图:

我编译后分配的硬件栈地址为:0x311-0x333.

第二幅是准备运行TaskStart时的汇编截图:

请注意SP的值   :)
可以看到SP在进入任务时,没有把它指向软件栈,也即0x310.
呵呵,硬件栈不保啊!!!!!!!

出0入0汤圆

 楼主| 发表于 2008-1-17 15:34:07 | 显示全部楼层
多谢!

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


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

出0入0汤圆

 楼主| 发表于 2008-1-22 09:44:07 | 显示全部楼层
顶起来~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 17:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表