OSAL传输机制.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
OSAL传输机制

一概述  OSAL (Operating System Abstraction Layer),翻译为“操作系统抽象层”。OSAL就是一种支持多任务运行的系统资源分配机制。OSAL与标准的操作系统还是有很大的区别的。简单而言,OSAL实现了类似操作系统的某些功能,但并不能称之为真正意义上的操作系统。二、OSAL任务运行方式?????????我们以TI1.2.1的BLE协议栈中的SimpleBLEPeripheral为例,分析一下OSAL。其中有一个simpleBLEPeripheral.c文件,里面有2个比较重要的函数:SimpleBLEPeripheral_Init和SimpleBLEPeripheral_ProcessEvent。SimpleBLEPeripheral_Init是任务的初始化函数,而SimpleBLEPeripheral_ProcessEvent则负责处理传递给此任务的事件。大概浏览一下SimpleBLEPeripheral_ProcessEvent这个函数,我们可以发现,此函数的主要功能是判断由参数传递的事件类型,然后执行相应的事件处理函数。由此,可以推断出BLE协议栈应用程序的运行机制如下图所示:?当有一个事件发生的时候,OSAL负责将此事件分配给能够处理此事件的任务,然后此任务判断事件的类型,调用相应的事件处理程序进行处理。明白了这个问题,新的问题又摆在了我们的面前:OSAL是如何传递事件给任务的。三、OSAL的事件传递机制在试图弄清楚这个问题之前,我们需要弄清楚另外一个十分基础而重要的问题。那就是如何向我们的应用程序中添加一个任务。  我们先来看看simpleBLEPeripheral.c是如何添加任务的。  我们打开OSAL_SimpleBLEPeripheral.c文件。这里我们可以找到一个很重要的数组tasksArr和一个同样很重要的函数osalInitTasks。  TaskArr这个数组里存放了所有任务的事件处理函数的地址,在这里事件处理函数就代表了任务本身,也就是说事件处理函数标识了与其对应的任务。  osalInitTasks是OSAL的任务初始化函数,所有任务的初始化工作都在这里面完成,并且自动给每个任务分配一个ID。  要添加新任务,我们需要编写新任务的事件处理函数和初始化函数,然后将事件处理函数的地址加入此数组。然后在osalInitTasks中调用此任务的初始化函数。在此例中,我们此前提到过的SimpleBLEPeripheral_ProcessEvent这个函数被添加到了数组的末尾,?SimpleBLEPeripheral_Init这个函数在osalInitTasks中被调用。值得注意的是,TaskArr数组里各任务函数的排列顺序要与osalInitTasks函数中调用各任务初始化函数的顺序必须一致,只有这样才能够保证每个任务能够通过初始化函数接收到正确的任务ID。  另外,为了保存任务初始化函数所接收的任务ID,我们需要给每一个任务定义一个全局变量来保存这个ID。在SimpleBLEPeripheral中SimpleBLEPeripheral.c中定义了一个全局变量SimpleBLEPeripheral_TaskID;并且在SimpleBLEPeripheral_Init函数中进行了赋值  {    ????????  SimpleBLEPeripheral_TaskID = task_id;  }  这条语句将分配给SimpleBLEPeripheral的任务ID保存了下来。  到此,我们就给应用程序中完整的添加了一个任务。  我们回到OSAL如何将事件分配给任务这个问题上来  在OSAL_SimpleBLEPeripheral.c这个文件中,在定义TaskArr这个数组之后,又定义了两个全局变量。  tasksCnt这个变量保存了当前的任务个数。  tasksEvents是一个指向数组的指针,此数组保存了当前任务的状态。在任务初始化函数中做了如下操作  {??????? tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);??????? osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));  }?/*osal_mem_alloc()为当前OSAL中的各任务分配存储空间(实际上是一个任务数组),??函数返回指向任务缓冲区的指针,因此tasksEvents指向该任务数组(任务队列).注意??tasksEvents和后面谈到的tasksArr[]里的顺序是一一对应的, tasksArr[ ]中的第i个??事件处理函数对应于ta

文档评论(0)

hhuiws1482 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档