查看: 1788|回复: 0
打印 上一主题 下一主题

stm32f107vc金龙开发板 uC/OS-II 介绍

[复制链接]
跳转到指定楼层
沙发
发表于 2015-5-20 20:30:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本节我们主要介绍的是uC/OS-II及其任务创建与删除。
1uC/OS-II介绍


对于操作系统的学习,创建任务和删除任务是最为基础的工作,uC/OS-II源代码的形式发布,是开源软件, 但并不意味着它是免费软件。可以将其用于教学和私下研究;但是如果将其用于商业用途,那么必须通过Micrium获得商用许可。
uC/OS-II属于抢占式内核,最多可以支持64个任务,分别对应优先级063每个任务只能对应唯一的优先级,其中0为最高优先级。63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。
uC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。
系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整型变量做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当前cpu的利用率。
μC/OS-II可管理多达63个应用任务,并可以提供如下服务,本章将针对以下服务分别以例程的方式来介绍
1信号量
2互斥信号量
3事件标识
4消息邮箱
5消息队列
6任务管理
7固定大小内存块管理
8时间管理
2、任务创建与删除


        想让uC/OS-II管理用户的任务,用户必须要先建立任务,在开始多任务调度(即调用OSStart())前,用户必须建立至少一个任务。uC/OS-II提供了两个函数来创建任务:OSTaskCreate()OSTaskCreateExt()可以使用其中任意一个即可,其函数原型如下:
INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)
INT8U OSTaskCreateExt (void(*task)(void *pd),void *pdata,SD_STK *ptos,INT8U prio,INT16U                                                 id,OS_STK *pbos,INT32U stk_size,void *pext,INT16U opt)
task:任务代码指针
pdata:任务的参数指针
ptos:任务的堆栈的栈顶指针
prio:任务优先级
id:任务特殊的标识符(uC/OS-II中还未使用)
pbos:任务的堆栈栈底的指针(用于堆栈检验)
stk_size:堆栈成员数目的容量(宽度为4字节)
pext:指向用户附加的数据域的指针
opt:是否允许堆栈检验,是否将堆栈清零,任务是否要进行浮点操作等等
删除任务,是说任务将返回并处于休眠状态,任务的代码不再被uC/OS-II调用,而不是删除任务代码。删除任务主要是把任务控制块从OSTCBList链表中移到OSTCBFreeListuC/OS-II提供了两个函数来删除任务:OSTaskDel()OSTaskDelReq()
INT8U OSTaskDel (INT8U prio)        //删除任务
INT8U RequestorTask (INT8U prio)        //请求删除其他任务
prio:需要删除任务的优先级
3、实验分析


本次实验创建两个任务,任务一每隔两秒秒打印一次“AppTask1”,任务二每隔1s打印一次“AppTask2”,打印6次后打印“删除任务2”并删除任务。其源代码如下:
int  main (void)
{
        SysTick_Configuration();         //系统定时器初始化
        USART_Configuration();          //串口初始化
        LED_Configuration();
        OSInit();              //usos ii初始化
        AppTaskCreate();//创建任务
        OSStart();      //开始任务调度
}

static  void  AppTaskCreate(void)
{
INT8U  err;
OSTaskCreateExt(AppTask1,(void*)0,(OS_STK )&AppTask1Stk[APP_TASK1_STK_SIZE-1],APP_TASK1_PRIO,APP_TASK1_PRIO,(OS_STK )&AppTask1Stk[0],APP_TASK1_STK_SIZE,(void )0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);                //创建任务1
OSTaskNameSet(APP_TASK1_PRIO, "AppTask1", &err);
OSTaskCreateExt(AppTask2,(void*)0,(OS_STK )&AppTask2Stk[APP_TASK2_STK_SIZE-1],APP_TASK2_PRIO,APP_TASK2_PRIO,(OS_STK )&AppTask2Stk[0],APP_TASK2_STK_SIZE,(void*)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);                //创建任务2
OSTaskNameSet(APP_TASK2_PRIO, "AppTask2", &err);
}

//任务1
static  void  AppTask1 (void *p_arg)
{
while(1)
{
        printf("\n\rAppTask1\r\n");
        LED1(0);
        OSTimeDlyHMSM(0,0,1,0);
        LED1(1);
        OSTimeDlyHMSM(0,0,1,0);
}
}

//任务2
static  void  AppTask2 (void *p_arg)
{
        INT8U i;
        for(i=0;i<6;i++)
        {
                printf("\n\rAppTask2 \r\n");
                OSTimeDlyHMSM(0,0,0,1);      
        }
        printf("\n\r删除任务2\r\n");
        OSTaskDel(APP_TASK2_PRIO);        //删除任务2
}
如下图是串口打印的数据:
[size=0.83em]图片1.png (11.41 KB, 下载次数: 0)
下载附件  [url=]保存到相册[/url]
[color=rgb(153, 153, 153) !important]前天 13:59 上传





            

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入因仑

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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