您的位置:首页
μCOS-II系统之事件(event)的使用规则及Semaphore实例
2017-08-13 08:17
447 查看
***************************************************************************************************************************
作者:EasyWave 时间:2014.05.31
类别:μC/OS-II-操作系统 声明:转载。请保留链接
注意:如有错误。欢迎指正。这些是我学习的日志文章......
***************************************************************************************************************************
一:μC/OS-II系统Semaphore事件简单介绍
在实时多任务系统中,信号量被广泛用于:任务间对共享资源的相互排斥、任务和中断服务程序之间的同步、任务之间的同步。
当任务调用OSSemPost()函数发送信号量时:
当信号量值大于0,任务调用OSSemPend()函数接收信号量时:
当信号量值等于0。任务调用OSSemPend()函数接收信号量时:
注意:μC/OS-II不同意在中断服务程序中等待信号量。
1):任务间同步
在实际的应用中。 经常使用信号量实现任务间的同步,OSSemPend()和OSSemPost()会出如今不同任务的不同函数中。但不一定成对出现。
注意:在实际的应用中。还有多对多、一对多信号量操作的情况,但非常不常见。建议读者不要设计出这种操作方式,由于这样会带来非常多的麻烦。
2): 资源同步
在嵌入式系统中。常常使用信号量訪问共享资源来实现资源同步。在使用时,注意发送信号量函数OSSemPost()与等待信号量函数OSSemPend()必须成对出如今同一个任务调用的函数中。才干实现资源同步。
二:Semaphore实例及代码
以下以演示样例来说明怎样现实ISR与任务间同步。如果定时器1中断服务程序发送信号量,任务完毕了信号量的创建并在接收到信号量后让蜂鸣器响一声。
处理流程例如以下:
中断服务程序ISR演示样例代码例如以下:
以下以Nuvoton的NUC140为例说明Semaphore的使用:
主函数里面仅仅有做一些简单的初始化和OS环境建立。以下是Semaphore的实例代码:
代码的意思,自行分析吧,这个博文已经分析的非常清楚了。
作者:EasyWave 时间:2014.05.31
类别:μC/OS-II-操作系统 声明:转载。请保留链接
注意:如有错误。欢迎指正。这些是我学习的日志文章......
***************************************************************************************************************************
一:μC/OS-II系统Semaphore事件简单介绍
在实时多任务系统中,信号量被广泛用于:任务间对共享资源的相互排斥、任务和中断服务程序之间的同步、任务之间的同步。
当任务调用OSSemPost()函数发送信号量时:
当信号量值大于0,任务调用OSSemPend()函数接收信号量时:
当信号量值等于0。任务调用OSSemPend()函数接收信号量时:
注意:μC/OS-II不同意在中断服务程序中等待信号量。
1):任务间同步
在实际的应用中。 经常使用信号量实现任务间的同步,OSSemPend()和OSSemPost()会出如今不同任务的不同函数中。但不一定成对出现。
注意:在实际的应用中。还有多对多、一对多信号量操作的情况,但非常不常见。建议读者不要设计出这种操作方式,由于这样会带来非常多的麻烦。
2): 资源同步
在嵌入式系统中。常常使用信号量訪问共享资源来实现资源同步。在使用时,注意发送信号量函数OSSemPost()与等待信号量函数OSSemPend()必须成对出如今同一个任务调用的函数中。才干实现资源同步。
二:Semaphore实例及代码
以下以演示样例来说明怎样现实ISR与任务间同步。如果定时器1中断服务程序发送信号量,任务完毕了信号量的创建并在接收到信号量后让蜂鸣器响一声。
处理流程例如以下:
中断服务程序ISR演示样例代码例如以下:
以下以Nuvoton的NUC140为例说明Semaphore的使用:
主函数里面仅仅有做一些简单的初始化和OS环境建立。以下是Semaphore的实例代码:
#ifndef _TASK_C #define _TASK_C /*-----------------------------------------------------------------------------------------*/ /* */ /* Copyright (c) EasyWave. All rights reserved. */ /* */ /*-----------------------------------------------------------------------------------------*/ //=========================================================================================== // INCLUDE FILES //=========================================================================================== #include "SYS_Header.H" #include "BSP_Header.H" #include "DRV_Header.H" #include "UOS_Header.H" #include "Task.H" /* *************************************************************************************** */ /* PUBLIC VARIABLE */ /* *************************************************************************************** */ #define TASK1_PRIO 1 // TASK1_PRIO < OS_LOWEST_PRIO #define TASK2_PRIO 2 // TASK2_PRIO < OS_LOWEST_PRIO OS_STK Task1Stack[OS_MAX_STACK]; // for task1 stack size OS_STK Task2Stack[OS_MAX_STACK]; // for task2 stack size OS_EVENT *SemSync;; /* *************************************************************************************** */ /* DEBUG MARCO */ /* *************************************************************************************** */ #ifdef ENABLE_DEBUG #define TASK_DEBUG(x) x #else #define TASK_DEBUG(x) #endif /*-----------------------------------------------------------------------------------------*/ /* PUBLIC FUNCTION */ /*-----------------------------------------------------------------------------------------*/ //=========================================================================================== // Function : OSTaskInitial // Purpose : None // Input : None // Rteurn : None // External : None // History : EasyWave 2011-11-16 Create // // Modify : None //=========================================================================================== VOID OSTaskInitial(VOID) { OSTaskCreate( MainTask1, (void*)0, &Task1Stack[OS_MAX_STACK-1], TASK1_PRIO ); OSTaskCreate( MainTask2, (void*)0, &Task2Stack[OS_MAX_STACK-1], TASK2_PRIO ); } //=========================================================================================== // Function : MainTask1 // Purpose : None // Input : None // Rteurn : None // External : None // History : EasyWave 2011-11-16 Create // // Modify : None //=========================================================================================== VOID MainTask1(VOID *pdata) { SemSync = OSSemCreate(0); //Create semaphore with Zero tokens while(TRUE) { OSTimeDly(50); TASK_DEBUG(DrvSIO_printf("Semaphore Release.\r\n")); OSSemPost(SemSync); } } //=========================================================================================== // Function : MainTask2 // Purpose : None // Input : None // Rteurn : None // External : None // History : EasyWave 2011-11-16 Create // // Modify : None //=========================================================================================== VOID MainTask2(VOID *pdata) { INT8U err; while(TRUE) { TASK_DEBUG(DrvSIO_printf("Semaphore Get.\r\n")); OSTimeDly(50); OSSemPend(SemSync, INFINITE, &err); } } #endif //_TASK_C
代码的意思,自行分析吧,这个博文已经分析的非常清楚了。
相关文章推荐
- μCOS-II系统之事件(event)的使用规则及Semaphore实例
- μCOS-II系统之事件(event)的使用规则及Semaphore的互斥量用法
- μCOS-II系统之事件(event)的使用规则及MUTEX实例
- UCOS-II 事件(event)的使用规则及MUTEX实例整理
- libevent使用event事件触发服务端实例
- 【实例】javascript中使用event.target获取触发该事件标签的相关数据而不是通过document
- 基于UC/COSII系统的STM32F103系列单片机外部中断按键的一种使用方法
- SaltStack Event事件系统使用指南
- JS注册事件 JS:attachEvent和addEventListener 使用方法
- 转:使用.net下的系统事件增强应用程序
- 演示事件(Event)怎样使用以及怎样为用户控件添加一个事件(示例代码下载)
- 文件系统管理 之 实例解说 fdisk 使用方法
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
- 数据库实例-学生名册管理系统(DAO的使用实验)
- 数据库-学生选课系统实例(关系查询的使用方法)
- 当您使用 SQL 事件探查器实例中执行客户端跟踪事件的时 SQL Server 的实例执行速度很慢
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEvent
- 使用ADS 移植mC/OS-II的实例分析
- c#中ListView使用实例(简单的网吧计费系统)
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEvent