查看: 302|回复: 2
打印 上一主题 下一主题

【MAPS四色板试用】13 飞思卡尔四色板:uCOSII信号量操作

[复制链接] qrcode

31

主题

34

帖子

103

积分

注册会员

Rank: 2

积分
103
楼主
跳转到指定楼层
发表于 2016-3-12 09:47 PM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


一、 uCOSII信号量封装

1 信号量概念:
(1)为什么要使用信号量
    为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问 代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它, 也就是说信号量是用来调协进程对共享资源的访问的。其*享内存的使用就要用到信号量。
(2)信号量的工作原理
    由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的:
P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行
V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1.
    举个例子,就是两个进程共享信号量sv,一旦其中一个进程执行了P(sv)操作,它将得到信号量,并可以进入临界区,使sv减1。而第二个进程将被阻止进入临界区,因为当它试图执行P(sv)时,sv为0,它会被挂起以等待第一个进程离开临界区域并执行V(sv)释放信号量,这时第二个进程就可以恢复执行。

uCOSII信号量封装

    在ksdk_ucosii_lib库项目下的fsl_os_abstraction.h里,定义了4个信号量接口:

osa_status_t OSA_SemaCreate(semaphore_t *pSem, uint8_t initValue);
osa_status_t OSA_SemaWait(semaphore_t *pSem, uint32_t timeout);
osa_status_t OSA_SemaPost(semaphore_t *pSem);
osa_status_t OSA_SemaDestroy(semaphore_t *pSem);

    而在fsl_os_abstraction_ucosii.h文件中,进行了具体实现。下面是信号量创建的封装,调用了uCOSII中的OSSemCreate函数。

    

    下面是信号量等待的接口封装,其中调用了uCOSII中的OSSemAccept和OSSemPend函数。

    

    下面是信号量发送的封装,其中调用了uCOSII中的OSSemPost函数。

    

    下面是信号量销毁的函数,其中调用了uCOSII中的OSSemDel函数。


二、信号量示例

1 示例

    为了说明如何使用信号量实现任务间同步,假设有两个任务,一个任务让一个LED以一定的频率闪耀,另一个任务接收按键中断,每按键一次,LED闪耀一次。TaskLED为高优先级的任务。两个任务处理流程如下。


2 封装Key控制接口

    在maps工程模板中,找到key.c和key.h文件,定义如下两个函数,在keyInit中,将按键引脚初始化为中断输入,在keyDown函数,返回按键的值,如果为真,则按下。


3 主函数

在主函数中,初始化调用,然后分别创建两个任务,分别用来控制按键和Led灯。


4 Led任务

信号量控制Led任务,在该任务中,它创建信号量,并初始化为0,然后通过信号量来控制Led的状态。


5 Key任务

按键任务,首先初始化按键,然后通过判断按键来发送信号量。


6 效果

按一下按键,led闪灭一次

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

58

主题

366

帖子

618

积分

高级会员

Rank: 4

积分
618
沙发
发表于 2016-3-13 06:36 PM | 只看该作者
赞一个,呵呵,这个系列教程么?
回复 支持 反对

使用道具 举报

0

主题

73

帖子

6

积分

新手上路

Rank: 1

积分
6
板凳
发表于 2016-3-14 04:03 PM | 只看该作者
赞一个,呵呵,这个系列教程么?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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