当前位置: 首页 > 编程日记 > 正文

CC2540 OSAL 学习其中原理,以及 给任务 添加 一个事件(定时发送串口消息)

参考学习大神博客: http://blog.csdn.net/feilusia/article/details/51083953

        : http://blog.csdn.net/xiaoleiacmer/article/details/41723583

1、TI 的 CC2540跑了一个  OSAL   (Operating System Abstraction Layer)

心得:大概 就是 一个循环查看任务 是否 产生事件,产生就 处理事件,每个任务有16个事件,其实就是一个16位的宏定义,每一位代表一个事件,其中0x8000 是固定 的代表 SYS_EVENT_MSG。(这句话看不懂,可以往下看)

(sdk的安装请百度,工程路径:C:\Texas Instruments\BLE-CC254x-1.4.1.43908\Projects\ble\SimpleBLEObserver\CC2540DB)

2、在 TI 提供 的 SDK  中 ,打开 一个 观察者工程,找到任务初始化的地方。(可通过 菜单->Edit->Find and Replace->Find in Files 这个全局查找 功能 进行找到这个函数osalInitTasks)

这里 有很多任务 的初始化 ,按顺序执行,每个任务 有一个 对应 一个 事件处理函数任务产任务生事件,就去执行这个事件处理函数),这句话很重要哦,一定要理解,记住。

 任务列表:

任务对应的 事件处理 函数 :如下

3、前面的任务 都不管 ,现在我 们值关心 最后一个任务(因为这个任务 是  应用任务 ,TI 就是做这个任务 就是供我们使用的。)

/* Application */
SimpleBLEObserver_Init( taskID );

对应 的事件处理函数是:

SimpleBLEObserver_ProcessEvent( uint8 task_id, uint16 events );

4、先看看这个任务SimpleBLEObserver_Init的初始化都做了什么。

5、看看这个任务的 事件处理函数SimpleBLEObserver_ProcessEvent 都 做了什么。

6、我们要在这个应用任务中添加一个事件(定时处理某些事情,比如LED灯 比如定时检测传感器数据等等)做法如下。

第一步:在这个任务中,添加一个事件,名称叫:(其实就是添加一个宏定义)

(因为事件 的变量(16位) 每一位代表一个事件,因此事件的可能值 只能是2^16,2^15,2^14,2^13,2^12,2^11,2048,1024,512,256, 128,64,32,16,8,4,2,1)

#define SBO_PERIODIC_EVT                                  0x0004//至于为啥是 0x0004 而不是0x0002 因为0x0002 已经存在了

添加结果如下:

第二步:在事件处理函数中,添加这个事件的处理:结果如下。

具体的 处理函数 如下:

/********************************************************************** @fn      performPeriodicTask 执行 周期 任务** @brief   输出一个任务正在执行的语句。**          2017年4月17日13:57:35,GXP** @param   none** @return  none*/
static void performPeriodicTask( void )
{printf("定时器任务正在运行。\r\n");
}

事件添加好了:怎么启动这个事件 ,或者意思 是说怎么让系统执行这个事件那。下面就讲两种方法:(我也就会这两种目前,2017年4月17日20:24:25)

第一种方法:

把这个事件设置为就绪状态,这样下次轮询任务时就会看这个应用任务 产生了一个 事件,具体调用的API 是


  osal_set_event( task_id, SBO_PERIODIC_EVT);//第一个 参数是任务ID ,第二个参数是事件名称。

因为我们这个事件 就是定时处理某些事情,因此要使用到系统的软件定时器,第二个办法就是使用系统软件定时来启动这个事件。

// Set timer for first periodic event
osal_start_timerEx( task_id, SBO_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );

下面 我 们 要 打开  CC2540 的 串口 ,进行收发数据: 参考博客:  http://blog.csdn.net/feilusia/article/details/47431659

1、第一步  在 工程 的 属性 里 ,添加  HAL_UART=TRUE,进行 使能 串口

      

2、添加头文件(npi.c中), #include "OSAL.h"

3、新增两个串口发送函数(npi.c中)

/********************************************************************** @fn      NPI_PrintString** @brief   打印字符串**          2017年4月20日16:22:27,GXP** @param    str:字符串 ** @return  none*/void NPI_PrintString(uint8 *str)  
{  NPI_WriteTransport(str, osal_strlen((char*)str));
}/********************************************************************** @fn      NPI_PrintValue 打印指定的格式的数值** @brief  打印指定的格式的数值**         2017年4月20日16:22:27,GXP** @param    title:前缀字符串  *           value:需要显示的数值   *           format:需要显示的进制,10或16** @return  none*/void NPI_PrintValue(char *title, uint16 value, uint8 format)  
{  uint8 tmpLen;  uint8 buf[128];  uint32 err;  tmpLen = (uint8)osal_strlen( (char*)title );  osal_memcpy( buf, title, tmpLen );  buf[tmpLen] = ' ';  err = (uint32)(value);  _ltoa( err, &buf[tmpLen+1], format );  NPI_PrintString(buf);       
}

4、函数声明(npi.h中)

extern void NPI_PrintValue(char *title, uint16 value, uint8 format);
extern void NPI_PrintString(uint8 *str);

5、关闭低功耗模式,顺便关掉 LCD,2017年4月20日16:39:44

6、因为要在simpleBLEObserver.c中调用 上面添加 的 两个串口打印函数,因此 需要 在 simpleBLEObserver.c中 添加#include "npi.h"

#include "npi.h" //SuoZhang,ADD,2017年4月20日16:42:58

7、定义并声明一个串口回调函数,在 simpleBLEObserver.c中,这个回调函数什么时候进入那?

答:

1)正常串口端无发送、无接收时,是不会进回调函数的。如果这种情况会进回调函数,TX、RX端外接上拉电阻稳定电平。

2)如果接收端有数据,立马就会进回调。事件是“接收超时事件”。

3)2541 or 2540 发送端发送完数据,会进回调函数。事件是“发送缓冲区空事件”。

/********************************************************************** @fn      NPI_SerialCallback** @brief   串口回调函数,2016年12月15日08:59:13,GXP*          *            1、如果接收端有数据,立马就会进回调。事件是“接收超时事件”。*            2、2541 or 2540 发送端发送完数据,会进回调函数。事件是“发送缓冲区空事件”。** @param   port: 串口1 还是串口2*            events: 事件类型(“接收超时事件”,“发送缓冲区空事件”)** @return  none*/
static void NPI_SerialCallback( uint8 port, uint8 events )  
{  (void)port;//加个 (void),是未了避免编译告警,明确告诉缓冲区不用理会这个变量  if (events & (HAL_UART_RX_TIMEOUT | HAL_UART_RX_FULL))   //串口有数据  
    {  uint8 numBytes = 0;  numBytes = NPI_RxBufLen();           //读出串口缓冲区有多少字节  if(numBytes == 0)  {  return;  }  else  {  //申请缓冲区buffer  uint8 *buffer = osal_mem_alloc(numBytes);  if(buffer)  {  //读取读取串口缓冲区数据,释放串口数据     
                NPI_ReadTransport(buffer,numBytes);     //把收到的数据发送到串口-实现回环   
                NPI_WriteTransport(buffer, numBytes);    //释放申请的缓冲区  
                osal_mem_free(buffer);  }  }  }  
}

8、添加上面 串口回调函数的声明,simpleBLEObserver.c中

static void NPI_SerialCallback( uint8 port, uint8 events );//SuoZhang,ADD,2017年4月20日16:55:25

9、新增初始化代码simpleBLEObserver.c的SimpleBLEObserver_Init中

/********************************************************************** @fn      SimpleBLEObserver_Init** @brief   Initialization function for the Simple BLE Observer App Task.*          This is called during initialization and should contain*          any application specific initialization (ie. hardware*          initialization/setup, table initialization, power up*          notification).** @param   task_id - the ID assigned by OSAL.  This ID should be*                    used to send messages and set timers.** @return  none*/
void SimpleBLEObserver_Init( uint8 task_id )
{simpleBLETaskId = task_id;//初始化串口0,作为串口打印数据使用,2017年4月20日16:57:31
  {//注册串口回调函数  
    NPI_InitTransport(NPI_SerialCallback);// 按长度输出测试//NPI_WriteTransport("SimpleBLETest_Init\r\n", 20);// 按字符串输出    NPI_PrintString("SimpleBLEObserver_Init.\r\n");  // 可以输出一个值,用10进制表示    NPI_PrintValue("测试10进制输出 = ", 168, 10);    NPI_PrintString("\r\n");      // 可以输出一个值,用16进制表示NPI_PrintValue("测试16进制输出  = 0x", 0x88, 16);    NPI_PrintString("\r\n");   }// Setup Observer Profile
  {uint8 scanRes = DEFAULT_MAX_SCAN_RES;GAPObserverRole_SetParameter ( GAPOBSERVERROLE_MAX_SCAN_RES, sizeof( uint8 ), &scanRes );}// Setup GAP
  GAP_SetParamValue( TGAP_GEN_DISC_SCAN, DEFAULT_SCAN_DURATION );GAP_SetParamValue( TGAP_LIM_DISC_SCAN, DEFAULT_SCAN_DURATION );// Register for all key events - This app will handle all key events
  RegisterForKeys( simpleBLETaskId );// makes sure LEDs are offHalLedSet( (HAL_LED_1 | HAL_LED_2), HAL_LED_MODE_OFF );// Setup a delayed profile startup
  osal_set_event( simpleBLETaskId, START_DEVICE_EVT );
}

10、关闭流控(流控是用于防止串口阻塞的,需要多两根线用于流控。),通常串口只使用三根线 TX,RX,GND, (npi.h中)

#if !defined( NPI_UART_FC )
#define NPI_UART_FC                    FALSE //TRUE  
#endif // !NPI_UART_FC

11、编译并且接上串口0,波特率115200,结果如下:(不清楚问什么 汉子乱码)

转载于:https://www.cnblogs.com/suozhang/p/6722075.html

相关文章:

Strategy_Level3

以下代码是“策略模式”的第六个例子:

SDK开发日积月累(二)

WM_NOTIFY消息和WM_COMMAND消息在一个对话框中,子控件可以有两种方式与父对话框通信。1.向父对话框发送WM_COMMAND消息,但这种消息传递的信息量比较少。2.向父对话框发送WM_NOTIFY消息,信息量比较大。idCtrl (int) wParam; pnmh (LPNMHDR) …

关于IP地址的分类

我们说过因特网是把全世界的无数个网络连接起来的一个庞大的网间网,每个网络中的计算机通过其自身的IP地址而被唯一标识的,据此我们也可以设想,在INTERNET上这个庞大的网间网中,每个网络也有自己的标识符。这与我们日常生活中的电…

Visual Studio UML Activity Diagram(1)

数理系LSGO软件技术团队能够存活下来,并形成战斗力的根本原因,归结为我们的价值观。我们“只问收获,不问耕耘”,对知识是贪婪的,我们会把所学的知识放到场景中去应用,我们一定要做出成品。我们强调“要构建…

VMware 克隆Linux后找不到eth0

VMware 克隆Linux,ifconfig 不出现eth0解决方案:1)删除 /etc/udev/rules.d/70-persistent-net.rules/rm -rf /etc/udev/rules.d/70-persistent-net.rules2)重启init 6 3)ifconfig 查看转载于:https://blog.51cto.com/ictedu/1917185

笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)

议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任何节点的键值大于等于该节点左子树中的所…

定义自定义的异常

首先我们建立自己的异常类CustomException,它要继承自ApplicationException类(这是一个在发生非致命的应用程序错误时抛出的通用异常,它又继承于更为通用的Exception类),将其用作为应用程序定义的任何自定义异常的基类…

python3 的 round 函数的 练习

python3 的 round 函数感觉很别扭,其运算结果与习惯不相符。特记录下来: 代码 python 3的 round 函数 是“四舍六入五成双”的https://www.zhihu.com/question/20128906print(python 3的 round 函数:四舍六入五成双)print(\nround(-3.5) , …

Visual Studio UML Activity Diagram(2)

昨天的图文介绍了Visual Studio UML Activity Diagram中所涉及的对象,今天图文我们来介绍这些对象的属性部分并给出UML关于Activity Diagram的元模型类图。通常情况下,我们在做一套软件系统的时候,对甲方业务流程并不熟悉,如果直接…

Go 语言中手动内存管理

2019独角兽企业重金招聘Python工程师标准>>> Go 语言是自带GC的, 相对C语言等的手动内存管理省事很多, 弊端便是会消耗更多的内存, 以及在GC时导致整个程序的停顿. 在某些特殊场合, 如果能够可选地手动进行内存管理, 效果会好不少. Go 目前的 GC 实现比较简单(mark-…

依赖倒转原则(Dependency Inversion Principle,DIP)

前面两篇图文介绍了“开闭原则”和“里氏替换原则”。开发出对扩展开放,对修改封闭的系统是程序员的目标,而今天所介绍的“依赖倒转原则”正是实现这一目标的途径之一,而“里氏替换原则”为这一途径提供了保证。大家或许发现,我写…

细说浏览器特性检测(2)-通用事件检测

在上一篇中介绍了jQuery1.4版本新增的几个浏览器特性检测方案和具体的目的,本文将以事件为中心,介绍一个较为完整、通用的事件检测方案。 事件检测,即检测某一事件在不同的浏览器中是否存在(可用),这在编写…

robot简单功能测试脚本设计(例子)

以学生管理系统的添加一个学生信息为例子页面对象:editbox(姓名),button(添加)数据要求:1 姓名不能为空2 姓名不能重复程序结构1 点button,弹出对话框“姓名不能为空”2 输入姓名,点…

里氏替换原则(Liskov Substitution Principle,LSP)

昨天图文介绍了软件设计的一个基本原则“开闭原则”,而“开闭原则”的核心就是通过抽象把需求变化进行隔离,这种想法可以通过“里氏替换原则”进行保证。理解“里氏替换原则”也是理解面向对象中“运行时多态”的关键。希望大家仔细体会。

在IIS7里配置 ISAPI,运行dll程序,总提示下载dll

在IIS7里配置 ISAPI,运行dll程序,总提示下载dll,只需要把对应站点应用程序池里面的高级设置里的启用32位应用程序,设为“true"即可。

MySQL数据库高可用集群搭建-PXC集群部署

Percona XtraDB Cluster(下文简称PXC集群)提供了MySQL高可用的一种实现方法。集群是有节点组成的,推荐配置至少3个节点,但是也可以运行在2个节点上。 PXC原理描述: 分布式系统的CAP理论: C:一致…

搭建Jupyter学习环境

python notebook是一个基于浏览器的python数据分析工具,使用起来非常方便,具有极强的交互方式和富文本的展示效果。jupyter是它的升级版,它的安装也非常方便,一般Anaconda安装包中会自带。安装好以后直接输入jupyter notebook便可…

[转贴]2006十大经典语句

1. 骑白马的不一定是王子,他可能是唐僧; 2. 带翅膀的也不一定是天使,他可能是鸟人。 3. 站的更高,尿的更远。 4. 穿别人的鞋,走自己的路,让他们找去吧, 5. 我不是随便的人。我随便起来不是人 6.…

开放-封闭原则(The Open-Closed Principle,OCP)

自己设计的软件系统“易于维护”、“扩展性好”、“可重用”、“具有灵活性”,这是每位程序员所追求的目标。“开闭原则”为我们指明了方向,即我们所设计的软件尽量满足“开闭原则–对扩展开放,对修改关闭”,这样就能降低需求不断…

Interesting visualization tools for profiling.

Interesting visualization tools for profiling. http://dtrace.org/blogs/brendan/2012/03/17/linux-kernel-performance-flame-graphs/ http://dtrace.org/blogs/brendan/2013/07/01/detecting-outliers/转载于:https://www.cnblogs.com/kungfupanda/p/3245651.html

javascript网页开发 第二章

HTML高级部分 2.1. 表格标签 2.1.1 <table></table> Bgcolor 设置表格的背景色 Border 设置边框的宽度 Bordercolor 设置边框的颜色 Bordercolorlight 设置边框明亮部分的颜色 Bordercolordark 设置边框昏暗部分的颜色 Cellspacing 设置单元格之间的间隔大小 Cel…

ORACLE JET BASIC TABLE

转载于:https://blog.51cto.com/feitai/1917581

Visual Studio UML Use Case Diagram(1)

前几天我们介绍了Visual Studio UML Activity Diagram&#xff0c;今天我们介绍Visual Studio UML Use Case Diagram的内容。通常RUP按照动态划分&#xff0c;分为周期、阶段、里程碑、迭代&#xff0c;按照静态划分&#xff0c;分为角色、制品、工作流、活动&#xff0c;在Wor…

可以左右移动多选下拉列表的javaScipt(可以兼容IE和firefox)

自己在项目业余时间总结了一份可以左右移动&#xff08;Add和remove&#xff09;多选下拉列表的javaScipt,可以兼容IE和firefox,并且经过测试&#xff0c;只是代码略显臃肿&#xff0c;希望各位网友参考后给一些指点&#xff0c;特别是在简化代码方面。我在让其兼容 firefox很是…

OLAP和OLTP的区别(基础知识)

联机分析处理 (OLAP) 的概念最早是由关系数据库之父E.F.Codd于1993年提出的&#xff0c;他同时提出了关于OLAP的12条准则。OLAP的提出引起了很大的反响&#xff0c;OLAP作为一类产品同联机事务处理 (OLTP) 明显区分开来。当今的数据处理大致可以分成两大类&#xff1a;联机事务…

如何让phpmyadmin输入密码再进入

分类&#xff1a;wamp对于很多不熟悉PHP环境安装的朋友来说&#xff0c;用集成环境可以更快的上手&#xff0c;更方便的搭建PHP的运行环境&#xff0c;但是&#xff0c;WAMP的集成环境仅仅是将底层基础工作做好了&#xff0c;有些个别关键的配置操作并没有集成到环境安装中&…

Visual Studio UML Use Case Diagram(2)

Use Case Model是捕获用户需求确定系统边界最流行的方法。Use Case Model由两部分组成Use Case Diagram和Use Case Specification&#xff0c;对于不方便描述的部分可以放在Supplementary Specification中&#xff0c;通过Glossary统一大家的用词规范。昨天我们介绍了Visual St…

Delphi下利用WinIo模拟鼠标键盘详解

本文最早在编程论坛上发表&#xff0c;文章地址&#xff1a;http://programbbs.com/bbs/view12-17207-1.htm&#xff0c;相关文件可以在上述地址的页面中下载。转载时请注明出处。 前言 一日发现SendInput对某程序居然无效&#xff0c;无奈只好开始研究WinIo。上网查了很多资料…

在vs2005中使用Jmail发送邮件问题

jmail.Message Jmail new jmail.Message(); DateTime t DateTime.Now; String Subject " From EMail .net"; String body "你好科学12:15"; String FromEmail "jsyxo163.com"; String ToEmail…

nginx学习之静态内容篇(五)

1.根目录和索引文件 server {root /www/data;location / {}location /images/ {}location ~ \.(mp3|mp4) {root /www/media;} } root指令能放置的位置是&#xff1a;http&#xff0c;server&#xff0c;location。 上面的意思是&#xff1a;我所有的location定义都是基于根目录…