搜索
bottom↓
回复: 2

在Atmega128上移植ucOS-ii后的任务切换问题

[复制链接]

出0入0汤圆

发表于 2007-9-28 15:40:52 | 显示全部楼层 |阅读模式
点击此处下载ourdev_174726.txt(文件大小:2K)
点击此处下载ourdev_174727.txt(文件大小:11K)

在Atmega128上移植过ucOS-ii之后,我通过定时器溢出中断发送消息邮箱给任务,现在能进入任务,
但是进入任务后,在任务的最后一条语句OSTimeDly(10)中单步执行到任务切换函数OSCtxSw(在os_cpu_a.s文件中)
的最后一条指令RET后,任务就直接跳到main函数处重新运行了。
问题应该出现在任务切换函数中,不过我用从Micrium网上下载的os_cpu_a.s试过,还是这个问题,大家帮忙解决一下。

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

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

出0入0汤圆

发表于 2007-9-30 10:52:44 | 显示全部楼层
兄弟,你的问题我是解决不了。你能不能把UCOS移植到MEGA128上的代码给我们看看,我移植了好长时间都没搞定。

出0入0汤圆

发表于 2007-9-30 11:10:14 | 显示全部楼层
多任务初始化是需要步骤的.............

第一步必须OSInit(),你不是,这是我写的主函数:
void main(void)
{
    #if (OS_TASK_NAME_SIZE > 14) && (OS_TASK_STAT_EN > 0)
    INT8U  err;
    #endif
   
    OSTaskStkSize     = OS_TASK_IDLE_STK_SIZE;
    OSTaskStkSizeHard = OS_TASK_IDLE_STK_SIZE_HARD;
    OSInit();<---------------------------------------------------------------------这是先要干的伙,位置很关键
    //调整空闲任务堆栈尺寸
    OSTCBPrioTbl[OS_IDLE_PRIO]->OSTCBStkSize   = OSTaskStkSize - OSTaskStkSizeHard;
    OSTCBPrioTbl[OS_IDLE_PRIO]->OSTCBStkBottom = &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE_HARD];
    //调整统计任务堆栈尺寸
    #if OS_TASK_STAT_EN > 0
    OSTCBPrioTbl[OS_STAT_PRIO]->OSTCBStkSize   = OSTaskStkSize - OSTaskStkSizeHard;
    OSTCBPrioTbl[OS_STAT_PRIO]->OSTCBStkBottom = &OSTaskStatStk[OS_TASK_STAT_STK_SIZE_HARD];
    #endif
    //设置空闲任务名称
    #if OS_TASK_NAME_SIZE > 14
    OSTaskNameSet(OS_IDLE_PRIO, "uC/OS-II Idle", &err);
    #endif
    //设置统计任务名称
    #if (OS_TASK_NAME_SIZE > 14) && (OS_TASK_STAT_EN > 0)
    OSTaskNameSet(OS_STAT_PRIO, "uC/OS-II Stat", &err);
    #endif
   
    //用任务建立任务,<-----------------------------------------------------一般都这样用,用一个任务建立多任务开始多任务系统
    OSTaskStkSize     = OS_TASK_START_STK_SIZE;
    OSTaskStkSizeHard = OS_TASK_START_STK_SIZE_HARD;
    OSTaskCreateExt(OSTaskStart,                                          //void (*task)(void *pd) 任务首地址
                    (void *)0,                                            //void *pdata            数据指针
                    &OSTaskStartStk[OS_TASK_START_STK_SIZE - 1],          //OS_STK *ptos           指向任务堆栈栈顶的指针
                    OS_TASK_START_PRIO,                                   //INT8U prio             任务优先级
                    OS_TASK_START_ID,                                     //INT16U id              任务的ID号
                    &OSTaskStartStk[OS_TASK_START_STK_SIZE_HARD],         //OS_STK *pbos           指向任务堆栈栈底的指针
                    OS_TASK_START_STK_SIZE - OS_TASK_START_STK_SIZE_HARD, //INT32U stk_size        堆栈容量
                    (void *)0,                                            //void *pnext            数据指针
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);           //INT16U opt             设定OSTaskCreateExt的选项

    OSTaskNameSet(OS_TASK_START_PRIO, "Task-Start", &err);

    OSStart();
}


static void OSTaskStart(void *pdata)
{
    pdata = pdata;
   
    //目标板初始化,启动系统Tick
    Target_Init();<--------------------------------------这个位置又很关键

    //统计任务初始化
    #if OS_TASK_STAT_EN > 0
    OSStatInit();
    #endif

    //系统事件的建立
    #if OS_EVENT_EN > 0
    CreateEvents();
    #endif

    //系统多任务的建立
    CreateMultiTask();<---------------------------------------这正建立多任务
   
    //开始任务自动挂起
    OSTaskSuspend(OS_PRIO_SELF);
    while(1)
    {
        OSTimeDly(OS_TICKS_PER_SEC);
        OSTaskSuspend(OS_PRIO_SELF);
    }
}

void  CreateMultiTask (void)
{

    #if (OS_TASK_NAME_SIZE > 31)
    INT8U  err;
    #endif
   
    //*********************************************************************************************************
    //************************************  射频感应通讯  *****************************************************
    //*********************************************************************************************************
    //传递堆栈尺寸
    OSTaskStkSize     = APP_TASK_RF_STK_SIZE;
    OSTaskStkSizeHard = APP_TASK_RF_STK_SIZE_HARD;
    //建立任务
    OSTaskCreateExt(AppTask_RF,
                    (void *)0,
                    &AppTaskRF_Stk[APP_TASK_RF_STK_SIZE - 1],
                    APP_TASK_RF_PRIO,
                    APP_TASK_RF_ID,
                    &AppTaskRF_Stk[APP_TASK_RF_STK_SIZE_HARD],
                    OSTaskStkSize - OSTaskStkSizeHard,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
    //设置任务名称
    OSTaskNameSet(APP_TASK_RF_PRIO, "AppTask-RF", &err);

    //*********************************************************************************************************
    //************************************** USB 任务 *********************************************************
    //*********************************************************************************************************
    //传递堆栈尺寸
    OSTaskStkSize     = APP_TASK_USB_STK_SIZE;
    OSTaskStkSizeHard = APP_TASK_USB_STK_SIZE_HARD;
    //建立任务
    OSTaskCreateExt(AppTask_USB,
                    (void *)0,
                    &AppTaskUSB_Stk[APP_TASK_USB_STK_SIZE - 1],
                    APP_TASK_USB_PRIO,
                    APP_TASK_USB_ID,
                    &AppTaskUSB_Stk[APP_TASK_USB_STK_SIZE_HARD],
                    OSTaskStkSize - OSTaskStkSizeHard,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
    //设置任务名称
    OSTaskNameSet(APP_TASK_USB_PRIO, "AppTask-USB", &err);
    //*********************************************************************************************************
    //********************************    主界面显示时间的任务    *********************************************
    //*********************************************************************************************************
    //传递堆栈尺寸
    OSTaskStkSize     = APP_TASK_UpdateTime_STK_SIZE;
    OSTaskStkSizeHard = APP_TASK_UpdateTime_STK_SIZE_HARD;
    //建立任务
    OSTaskCreateExt(AppTask_UpdateTime,
                    (void *)0,
                    &AppTaskUpdateTime_Stk[APP_TASK_UpdateTime_STK_SIZE - 1],
                    APP_TASK_UpdateTime_PRIO,
                    APP_TASK_UpdateTime_ID,
                    &AppTaskUpdateTime_Stk[APP_TASK_UpdateTime_STK_SIZE_HARD],
                    OSTaskStkSize - OSTaskStkSizeHard,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
    //设置任务名称
    OSTaskNameSet(APP_TASK_UpdateTime_PRIO, "AppTask-UpdateTime", &err);
    //*********************************************************************************************************
    //***********************************  键盘扫描任务  ******************************************************
    //*********************************************************************************************************
    //传递堆栈尺寸
    OSTaskStkSize     = APP_TASK_ScanKey_STK_SIZE;
    OSTaskStkSizeHard = APP_TASK_ScanKey_STK_SIZE_HARD;
    //建立任务
    OSTaskCreateExt(AppTask_ScanKey,
                    (void *)0,
                    &AppTaskScanKey_Stk[APP_TASK_ScanKey_STK_SIZE - 1],
                    APP_TASK_ScanKey_PRIO,
                    APP_TASK_ScanKey_ID,
                    &AppTaskScanKey_Stk[APP_TASK_ScanKey_STK_SIZE_HARD],
                    OSTaskStkSize - OSTaskStkSizeHard,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
    //设置任务名称
    OSTaskNameSet(APP_TASK_ScanKey_PRIO, "AppTask-ScanKey", &err);
    //*********************************************************************************************************
    //**********************************  系统菜单管理任务  ***************************************************
    //*********************************************************************************************************
    //传递堆栈尺寸
    OSTaskStkSize     = APP_TASK_MENU_STK_SIZE;
    OSTaskStkSizeHard = APP_TASK_MENU_STK_SIZE_HARD;
    //建立任务
    OSTaskCreateExt(AppTask_MENU,
                    (void *)0,
                    &AppTaskMENU_Stk[APP_TASK_MENU_STK_SIZE - 1],
                    APP_TASK_MENU_PRIO,
                    APP_TASK_MENU_ID,
                    &AppTaskMENU_Stk[APP_TASK_MENU_STK_SIZE_HARD],
                    OSTaskStkSize - OSTaskStkSizeHard,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
    //设置任务名称
    OSTaskNameSet(APP_TASK_MENU_PRIO, "AppTask-MENU", &err);
}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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

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