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();	

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值