初识ucos
ucos是什么
款源代码开放的,抢占式多任务实时操作系统。
ucos怎么用
- osinit() /* 初始化"uC/OS-III"内核 */
- CreateTask
- OSStart(&err); /* 启动多任务系统,控制权交给uC/OS-III */
osinit()
- 有两个任务是一定会被创建的:OS_IdleTaskInit(),OS_TickTaskInit()。
- 三个任务是可选的:OS_TmrTask(定时),OS_IntQTask(中断),OS_StaTask(统计信息) 备注:通过宏来设置其是否可选。
任务状态及转换
任务状态 | 描述 |
---|---|
休眠态 | 声明了任务,但任务尚未被OSTASKCreate()函数创建,该任务不受系统uc/os管理。 |
就绪态 | 任务被正式创建,并且以及插入就绪列表,一旦获取CPU使用权,就可以运行。 |
运行态 | 任务占有CPU,正在运行。 |
等待态 | 任务被延时执行,需要等待某个事件(内核对象),或者被强制挂起时,就会进入等待态。 |
中断服务态 | 正在运行的任务突然被中断打断,CPU被中断服务程序占有,该任务就进入了中断服务态。 |
/*
************************************************************************************************************************
* INITIALIZATION
*
* Description: This function is used to initialize the internals of uC/OS-III and MUST be called prior to
* creating any uC/OS-III object and, prior to calling OS_Start().
*
* Arguments : p_err is a pointer to a variable that will contain an error code returned by this function.
*
* OS_ERR_NONE Initialization was successful
* Other Other OS_ERR_xxx depending on the sub-functions called by OSInit().
* Returns : none
************************************************************************************************************************
*/
// 空闲任务
OS_IdleTaskInit(p_err); /* Initialize the Idle Task */
if (*p_err != OS_ERR_NONE) {
return;
}
/*$PAGE*/
/*
************************************************************************************************************************
* INITIALIZE THE IDLE TASK
*
* Description: This function initializes the idle task
*
* Arguments : p_err is a pointer to a variable that will contain an error code returned by this function.
*
* Returns : none
*
* Note(s) : 1) This function is INTERNAL to uC/OS-III and your application MUST NOT call it.
************************************************************************************************************************
*/
void OS_IdleTaskInit (OS_ERR *p_err)
{
#ifdef OS_SAFETY_CRITICAL
if (p_err == (OS_ERR *)0) {
OS_SAFETY_CRITICAL_EXCEPTION();
return;
}
#endif
OSIdleTaskCtr = (OS_IDLE_CTR)0;
/* ---------------- CREATE THE IDLE TASK ---------------- */
OSTaskCreate((OS_TCB *)&OSIdleTaskTCB,
(CPU_CHAR *)((void *)"uC/OS-III Idle Task"),
(OS_TASK_PTR)OS_IdleTask,
(void *)0,
(OS_PRIO )(OS_CFG_PRIO_MAX - 1u),
(CPU_STK *)OSCfg_IdleTaskStkBasePtr,
(CPU_STK_SIZE)OSCfg_IdleTaskStkLimit,
(CPU_STK_SIZE)OSCfg_IdleTaskStkSize,
(OS_MSG_QTY )0u,
(OS_TICK )0u,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)p_err);
}
// 时间基准
OS_TickTaskInit(p_err); /* Initialize the Tick Task */
if (*p_err != OS_ERR_NONE) {
return;
}
/*
************************************************************************************************************************
* INITIALIZE TICK TASK
*
* Description: This function is called by OSInit() to create the tick task.
*
* Arguments : p_err is a pointer to a variable that will hold the value of an error code:
*
* OS_ERR_TICK_STK_INVALID if the pointer to the tick task stack is a NULL pointer
* OS_ERR_TICK_STK_SIZE indicates that the specified stack size
* OS_ERR_PRIO_INVALID if the priority you specified in the configuration is invalid
* (There could be only one task at the Idle Task priority)
* (Maybe the priority you specified is higher than OS_CFG_PRIO_MAX-1
* OS_ERR_?? other error code returned by OSTaskCreate()
*
* Returns : none
*
* Note(s) : This function is INTERNAL to uC/OS-III and your application should not call it.
************************************************************************************************************************
*/
void OS_TickTaskInit (OS_ERR *p_err)
{
#ifdef OS_SAFETY_CRITICAL
if (p_err == (OS_ERR *)0) {
OS_SAFETY_CRITICAL_EXCEPTION();
return;
}
#endif
OSTickCtr = (OS_TICK)0u; /* Clear the tick counter */
OSTickTaskTimeMax = (CPU_TS)0u;
OS_TickListInit(); /* Initialize the tick list data structures */
/* ---------------- CREATE THE TICK TASK ---------------- */
if (OSCfg_TickTaskPrio >= (OS_CFG_PRIO_MAX - 1u)) { /* Only one task at the 'Idle Task' priority */
*p_err = OS_ERR_PRIO_INVALID;
return;
}
OSTaskCreate((OS_TCB *)&OSTickTaskTCB,
(CPU_CHAR *)((void *)"uC/OS-III Tick Task"),
(OS_TASK_PTR )OS_TickTask,
(void *)0,
(OS_PRIO )OSCfg_TickTaskPrio,
(CPU_STK *)OSCfg_TickTaskStkBasePtr,
(CPU_STK_SIZE)OSCfg_TickTaskStkLimit,
(CPU_STK_SIZE)OSCfg_TickTaskStkSize,
(OS_MSG_QTY )0u,
(OS_TICK )0u,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)p_err);
}