|
发表于 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);
} |
|