课后练习二十二之 UCOS 简单信号量

常见泽1   2012-6-28 17:19 楼主

课后练习二十二之 UCOS 简单信号量

 

 

1.信号量(摘自任哲老师的书)

信号量是一类事件。使用信号量最初目的,是为了给共享资源设立一个标志,该标志表示该共享资源被占用情况。这样,当一个任务在访问共享资源之前,就可以先对这个标志进行查询,从中而在了解资源被占用的情况之后,再来决定自己的行为

 

 

2. 信号量系统服务

1)“创建信号量”函数 :在使用一个信号量之前,必须首先调用“创建信号量”函数来创建这个信号量。

OS_EVENT *OSSemCreate(INT16U cnt);

cnt:信号量的初始值。

创建一个信号量,并对信号量的初始计数值赋值,该初始值为065,535之间的一个数;

例: OS_EVENT *Sem;

 

2)“发送信号量”函数:控制方通过调用“发送信号量”函数使信号量数值加1.如果信号量原来为0,则调用“发送信号量”函数后变成1

OSSemPost (OS_EVENT *pevent);

例:OSSemPost(Sem);

 

3)“等待信号量”函数:又称“请求信号量”函数或者“接收信号量”函数。被控制方通过调用“等待信号量”函数来获取信号量。如果当前信号量为0,则调用“等待信号量”函数后就会被系统挂起(进入等待状态),等待控制方发送信号量;如果当前信号量不为0,则调用“等待信号量”函数后就会将信号量减1,然后继续运行。

COSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err);

 

3.

信号量在多任务系统中的功能

(1)  实现对共享资源的互斥访问(包括单个共享资源或多个相同的资源)

(2)  实现任务之间的行为同步

必须在OS_CFG.H中将OS_SEM_EN开关常量置为1,这样μC/OS才能支持信号量。

1.jpg

 

 

4.

1.  应用

在中断里发送信号量,按下KEY,灯亮。复位之后,按下KEY,灯亮。

(本人也是菜鸟,采用最简单的方法)

课后练习二十二之UCOS 简单信号量.pdf (145.08 KB)
(下载次数: 76, 2012-6-28 17:19 上传)

回复评论 (1)

 

5. 部分程序(user.c)

  1. #include "includes.h"

    OS_EVENT *Sem1;
    OS_CPU_SR cpu_sr;
    INT8U err;

    void Task1(void *pdata)
    {
    pdata = pdata; // 无任何意义,防止编译器报警

    WDTCTL = WDT_ADLY_16; // 设置时钟节拍间隔为ACLK_16ms
    IE1 |= WDTIE; // 开看门狗定时器中断
    Sem1 = OSSemCreate(0); //创建信号量

    while (1)
    {
    OSSemPend(Sem1,0,&err); //等待信号量
    P1OUT |= BIT6;
    }
    }

    #pragma vector = PORT1_VECTOR //中断向量声明
    __interrupt void Key_interrput(void)
    {
    unsigned int i;
    for(i=0;i<0x1fff;i++); //消抖必不可少啊!!
    for(i=0;i<0x1fff;i++);


    if(P1IFG&BIT3) //判断是不是P1.3这个IO口产生了中断
    { //若产生中断P1IFG.3置1
    OSSemPost(Sem1); //发送信号量

    P1IFG = 0x00;
    }
    }






点赞  2012-6-28 17:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复