ucosiii学习(1)

ucosiii属于可剥夺型内核,CPU总是运行多个任务中优先级最高的那个任务。当CPU正运行某个低优先级任务时,若有高优先级任务准备就绪,该高级别任务会将CPU使用权占为己有。

1.系统初始化及任务概念·

从存储上讲,一个任务包括任务控制块(记录任务的各个属性),任务堆栈(保存任务的工作环境)和任务程序代码(执行函数)。

任务状态包括:睡眠(没有任务控制块),就绪(有任务控制块但没有CPU控制权),运行(正在使用CPU),等待(有CPU控制权但因为需要等待某个信号而暂时交出CPU控制权),中断服务(有CPU控制权但因为中断而交出)。

2.系统初始化OS_Init(&err)·

系统初始化·函数OS_Init(&err)会初始化堆栈,清除中断计数,任务管理等,并依次创建空闲任务(优先级很低),时钟任务(优先级较高),统计任务,定时模块。

任务堆栈:后进先出(LIFO),cpu.h中定义了 任务堆栈和栈深的数据类型( typedef  CPU_INT32U    CPU_STK;   typedef  CPU_ADDR      CPU_STK_SIZE;    typedef  CPU_INT32U  CPU_ADDR; )。

任务堆栈初始化:OS_Init(&err)在创建空闲任务时会调用 OS_IdleTaskInit(p_err); 进行初始化(os_core.c中)。

void  OS_IdleTaskInit (OS_ERR  *p_err)
{
#if (OS_CFG_DBG_EN == DEF_ENABLED)
    OSIdleTaskCtr = 0u;
#endif                           /* --------------- CREATE THE IDLE TASK --------------- */
    OSTaskCreate(&OSIdleTaskTCB,
                 (CPU_CHAR   *)"uC/OS-III Idle Task",
                  OS_IdleTask,
                  DEF_NULL,
                 (OS_PRIO)(OS_CFG_PRIO_MAX - 1u),
                  OSCfg_IdleTaskStkBasePtr,
                  OSCfg_IdleTaskStkLimit,
                  OSCfg_IdleTaskStkSize,
                  0u,
                  0u,
                  DEF_NULL,
                 (OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR | OS_OPT_TASK_NO_TLS),
                  p_err);
}

任务控制块:os.h中定义了 typedef  struct  os_tcb       OS_TCB; 任务控制块为一个结构体

*StkPtr:指向当前栈顶的指针;*ExtPtr:指向控制块扩展中用户定义数据的指针;*NextPtr:指向控制块列表中的下个控制块;

*PrevPtr:指向控制块列表中的前一个控制块; TaskState:记录任务状态;  Prio:记录任务优先级

初始化优先级列表:OS_PrioInit();  在os_prio.c文件中,同时定义了优先级列表,优先及初始化函数,获取优先级函数等。

初始化就绪列表: OS_RdyListInit(); 在os_core.c中。

创建空闲任务:OS_IdleTaskInit(p_err)优先级为最后一位

创建tick task:OS_TickTaskInit(p_err); 优先级较高

创建统计任务: OS_StatTaskInit(p_err);

初始化时钟管理模块:OS_TmrInit(p_err);

3.任务的创建、挂起、恢复、删除等。

依次定义控制块,任务函数,任务优先级,任务栈大小。

#define START_TASK_PRIO 3u
#define START_STK_SIZE 128 
OS_TCB StartTaskTCB;
CPU_STK START_TASK_STK[START_STK_SIZE];
void Start_Task(void *p_arg);

#define TASK1_TASK_PRIO 6u
#define TASK1_STK_SIZE 128
OS_TCB TASK1_TCB;
CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];
void task1(void *p_arg);

在主函数中创建启动任务,在启动任务中创建其他任务。

    OSInit(&err);
	CPU_CRITICAL_ENTER();
	OSTaskCreate(
	            (OS_TCB *)    &StartTaskTCB,
	            (CPU_CHAR*)   "start_task",
	            (OS_TASK_PTR) Start_Task,
	            (void*)       0u,
	            ( OS_PRIO )   START_TASK_PRIO,
	            (CPU_STK *)   &START_TASK_STK[0],
	            (CPU_STK_SIZE)START_STK_SIZE/10,
	            (CPU_STK_SIZE)START_STK_SIZE,
	            (OS_MSG_QTY)  0u,
	            (OS_TICK)     0u,
	            (void*)       0u,
	            (OS_OPT)      OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR,
	            (OS_ERR*)     &err);
	CPU_CRITICAL_EXIT();							
	OSStart(&err);
	CPU_CRITICAL_ENTER();	
	OSTaskCreate(
	            (OS_TCB *)    &TASK1_TCB,
	            (CPU_CHAR*)   "task1",
	            (OS_TASK_PTR) task1,
	            (void*)       0u,
	            ( OS_PRIO )   TASK1_TASK_PRIO,
	            (CPU_STK *)   &TASK1_TASK_STK[0],
	            (CPU_STK_SIZE)TASK1_STK_SIZE/10,
	            (CPU_STK_SIZE)TASK1_STK_SIZE,
	            (OS_MSG_QTY)  0u,
	            (OS_TICK)     0u,
	            (void*)       0u,
	            (OS_OPT)      OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR,
	            (OS_ERR*)     &err);			
              printf("start task creat start task1!\n");
	CPU_CRITICAL_EXIT();	

在其他任务中定义用户代码,实现相关功能。

猜你喜欢

转载自blog.csdn.net/weixin_42480952/article/details/83009784