TI-RTOS 之 事件同步(Event, 类似semaphore)

TI-RTOS 之 事件同步(Event, 类似semaphore)

Event 是类似Semaphore的存在,官方如下描述:

SYS/BIOS events are a means of communication between Tasks and other threads such as Hwis, Swis, and other Tasks, or between Tasks and other SYS/BIOS objects. Other SYS/BIOS objects include semaphores, mailboxes, message queues, etc. Only tasks can wait for events; whereas tasks, Hwis, Swis, or SYS/BIOS objects can post them.

重点是它可用来处理任务间,任务与中断间同步。主要的API有以下:

此前我们作GPIO中断演示时,曾在中断中为了消抖而非常勉强地使用一个函数 CPUdelay(), 这样可以实现我们的目标,不过CPU仍然要进行计算,而且是在中断之中,有可能会影响到其他Task的执行时间。同样也会增加系统的功耗。如果使用Event就能解决这类问题。

思路 是这样, 用一个任务专门来处理按键,在没有按键时,任务处于Sleep状态,当按键按下时,它的中断会唤醒这个任务,唤醒的方法就是使用Event, 唤醒之后,可以再次Sleep一小段时间,用于消抖,然后再去读按键的状态,之后再进行处理。

完整的演示代码如下:

/**************************************************************************************************

Filename:       keyDemo2.c

Editor:         Tome @ newbit

Revised:        $Date: 2016-8-11 11:20:02 +0800  $

Revision:       $Revision: 00001 $

Description:    了解 TI-RTOS的使用之,Event的使用,它用来同步任务,或者

Task - Hwis, Swis

History:

Notes:          要了解到这部分的接口,可阅读TI文档

1. TI-RTOS 2.20  User‘s Guide.pdf

2. Bios User Guide.pdf

硬件平台  CC1130_LAUNCHPAD Rev1.3

**************************************************************************************************/

/**************************************************************************************************

// INCLUDES

**************************************************************************************************/

/* XDCtools Header files */

#include <xdc/std.h>

#include <xdc/runtime/System.h>

/* BIOS Header files */

#include <ti/sysbios/BIOS.h>

#include <ti/sysbios/knl/Task.h>

#include <ti/sysbios/knl/Event.h>

/* TI-RTOS Header files */

#include <ti/drivers/PIN.h>

#include "Board.h"

/**************************************************************************************************

// TYPEDEF

**************************************************************************************************/

/**************************************************************************************************

// CONSTANTS

**************************************************************************************************/

#define TASKSTACKSIZE     768

/**************************************************************************************************

// LOCAL VERIABLE

**************************************************************************************************/

Task_Struct keyTaskStruct;

Char keyTaskStack[TASKSTACKSIZE];               // 本任务的栈空间,静态分配

/* Global memory storage for a PIN_Config table */

static PIN_State ledPinState;

static PIN_State buttonPinState;

PIN_Handle ledPinHandle;

PIN_Handle buttonPinHandle;

// 新建 Event, 它用来通知任务,按键已经按下

Event_Struct evtStruct;

Event_Handle evtHandle;

/*

* Initial LED pin configuration table

*   - LEDs Board_LED0 is on.

*   - LEDs Board_LED1 is off.

*/

PIN_Config ledPinTable[] = {

Board_LED0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,

Board_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW  | PIN_PUSHPULL | PIN_DRVSTR_MAX,

PIN_TERMINATE

};

/*

* Application button pin configuration table:

*   - Buttons interrupts are configured to trigger on falling edge.

*/

PIN_Config buttonPinTable[] = {

Board_BUTTON0  | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE,

Board_BUTTON1  | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE,

PIN_TERMINATE

};

/**************************************************************************************************

// FUNCTIONS DECLERATION

**************************************************************************************************/

Void keyFxn(UArg arg0, UArg arg1);

void buttonCallbackFxn(PIN_Handle handle, PIN_Id pinId);

/**************************************************************************************************

// FUNCTIONS

**************************************************************************************************/

/**************************************************************************************************

* @fn      keyTaskAdd

*

* @brief

*

* @param   void

*

* @return  void

**************************************************************************************************/

void keyTaskAdd(void)

{

Task_Params taskParams;

/* Construct BIOS objects */

Task_Params_init(&taskParams); // 创建任务所要的参数,都设置为默认值

taskParams.stackSize = TASKSTACKSIZE; // 栈空间

taskParams.stack = &keyTaskStack;     // 栈地址

// 向bios 传递参数,建立控制灯的任务

Task_construct(&keyTaskStruct, (Task_FuncPtr)keyFxn, &taskParams, NULL);

}

/*

*  ======== keyFxn ========

*  Task for this function is created statically. See keyTaskAdd().

*/

Void keyFxn(UArg arg0, UArg arg1)

{

uint_t ledState;

Event_Params evtParams;

Event_Params_init(&evtParams);

Event_construct(&evtStruct, &evtParams);

evtHandle = Event_handle(&evtStruct);

// 这里不是为了初始化,而是为了拿到操作的句柄 (handle)

// 函数说明:Allocate one or more pins for a driver or an application.

ledPinHandle = PIN_open(&ledPinState, ledPinTable);

if(!ledPinHandle) {

System_abort("Error initializing board LED pins\n");

}

// 得到按键IO的操作句柄

buttonPinHandle = PIN_open(&buttonPinState, buttonPinTable);

if(!buttonPinHandle) {

System_abort("Error initializing button pins\n");

}

/* Setup callback for button pins */

// 注册按键的中断回调函数

if (PIN_registerIntCb(buttonPinHandle, &buttonCallbackFxn) != 0) {

System_abort("Error registering button callback function");

}

//

while(1)

{

// 任务将在这里阻塞,直到有键按下

Event_pend(evtHandle,Event_Id_00, Event_Id_NONE, BIOS_WAIT_FOREVER );

// 任务休眠 20 ms 用于消抖

/* Debounce logic, only toggle if the button is still pushed (low) */

Task_sleep(20*100);

// 读取按键的状态,并控制灯

if ( !PIN_getInputValue(Board_BUTTON0))

{

ledState = PIN_getOutputValue(Board_LED0);

PIN_setOutputValue(ledPinHandle, Board_LED0, !ledState);

}

if ( !PIN_getInputValue(Board_BUTTON1))

{

ledState = PIN_getOutputValue(Board_LED1);

PIN_setOutputValue(ledPinHandle, Board_LED1, !ledState);

}

}

}

/**************************************************************************************************

* @fn      buttonCallbackFxn

*

* @brief   按键中断的回调函数

*

* @param   PIN_Handle handle, PIN_Id pinId

*

* @return  void

**************************************************************************************************/

void buttonCallbackFxn(PIN_Handle handle, PIN_Id pinId)

{

// 解除任务的阻塞

Event_post(evtHandle, Event_Id_00 );

}

/**************************************************************************************************

Copyright 2016 Newbit Studio. All rights reserved.

**************************************************************************************************/

时间: 2024-08-25 11:34:40

TI-RTOS 之 事件同步(Event, 类似semaphore)的相关文章

Cocos2d-X3.0 刨根问底(七)----- 事件机制Event源码分析

这一章,我们来分析Cocos2d-x 事件机制相关的源码, 根据Cocos2d-x的工程目录,我们可以找到所有关于事件的源码都存在放在下图所示的目录中. 从这个event_dispatcher目录中的文件命名上分析 cocos2d-x与事件相关的类一共有四种, Event, EventListener,EventDispatcher, Touch分别为 事件,事件侦听器,事件分发器,触摸 我们先从Event类开始. 打开CCEvent.h文件 /** * Base class of all ki

事件问题 Event

Event事件可以理解为在异步过程中实现同步的操作.但是要注意不要过分的使用Event,否则异步就失去了意义. 直接通过代码来说明: #include #include using namespace std; //进程内部 线程通知 异步 ->同步 UINT32 __stdcall CallBack(LPVOID lParam); HANDLE g_Event[2] = {0}; int main() { g_Event[0] = CreateEvent(NULL,TRUE,FALSE,NUL

使用事件同步----Kithara RTS

Kithara RTS的事件机制,和windows编程中的事件机制比较像,如果有部分不明白,可以参考windows编程的这部分知识.事件在windows中是一种内核对象.事件主要用来实现任务之间的同步,同步并不是同时进行的意思,而是让整个软件的逻辑按照指定的顺序运行. 以下文章是拆字Kithara RTS官网,这里笔者给出翻译和部分编程经验. Synchronization with events Synchronization with events 事件同步 Events are very

JavaScript:事件对象Event和冒泡

本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 绑定事件的两种方式 我们在上一篇文章 DOM操作详解 中已经讲过事件的概念.这里讲一下注册事件的两种方式,我们以onclick事件为例. 方式一:onclick 举例: <body> <button>点我</button> <script> var btn = document.getElementsByTagName("

【Unity|C#】基础篇(8)——委托(Delegate)/ 事件(Event)

[学习资料] > 在线文档 官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/ 菜鸟教程(高级教程):https://www.runoob.com/csharp/csharp-tutorial.html > 视频教程 腾讯学院.Siki学院         > 书籍 <C#图解教程>(第13~14章):https://www.cnblogs.com/moonache/p/7687551.html [学习内容] > 菜

node.js事件循环 event loop

Nodejs事件循环 (event loop) node.js 事件循环的概念 当node.js 启动的时候会初始化eventloop ,每一个evnet loop 都会包含如下6个循环阶段,node.js 事件循环和浏览器事件循环完全不一样. 官网文档:https://nodejs.org/zh-cn/docs/guides/event-loop-timers-and-nexttick/ timers pending callbacks (I/O callbakcs) idle, prepar

jacascript 事件对象event

前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 在触发DOM上的某个事件时,会产生一个事件对象 event,这个对象中包含着所有与事件有关的信息.所有浏览器都支持 event 对象,但有兼容性问题. 获取事件对象 一般地,event 对象是事件程序的第一个参数.IE8及以下浏览器不支持: 另一种方法是直接使用 event 变量,firefox 浏览器不支持: 获取事件对象的常见兼容写法: <div id="box" style=&qu

C#事件(Event)学习日记

event 关键字的来由,为了简化自定义方法的构建来为委托调用列表增加和删除方法. 在编译器处理 event 关键字的时候,它会自动提供注册和注销方法以及任何必要的委托类型成员变量. 这些委托成员变量总是声明为私有的,因此不能直接从触发事件对象访问它们. 温馨提示:如果您对于委托不是很了解,您可以先看 C#委托(Delegate) ,这对您理解本章会有所帮助. 定义一个事件的步骤: 需要定义一个委托,它包含事件触发时将要调用方法 通过 event 关键字用相关委托声明这个事件 话不多说,我们来看

TI C66x DSP硬件信号量 - 3(Direct Semaphore)

jeecg v3.0入门视频 链接: http://pan.baidu.com/s/1bnrMfiJ密码: 8q0k MiniDao持久层 入门视频 链接: http://pan.baidu.com/s/1eQGc4W6 密码: stst JEECG-OnlineCoding<企业招聘系统> 视频 链接:http://pan.baidu.com/s/1sjHHVM9 密码: os7b JEECG公开课视频 链接: http://pan.baidu.com/s/1pJFeiiJ 密码: cr75