当前位置: 首页 > news >正文

摄影网站设计论文百度端口开户推广

摄影网站设计论文,百度端口开户推广,国外优秀vi设计网站,织梦网站根目录在哪里OSAL运行原理 蓝牙协议栈PROFILE、所有的应用程序、驱动等都是围绕着OSAL组织运行的。OSAL#xff08;Operating System Abstraction Layer#xff09;操作系统抽象层#xff0c;它不是一个真正的操作系统#xff08;它没有 Context Switch 上下文切换功能#xff09;Operating System Abstraction Layer操作系统抽象层它不是一个真正的操作系统它没有 Context Switch 上下文切换功能但它巧妙地组织各任务支持任务优先级任务之间可以通过事件和消息来通信为任务提供软定时器和动态内存分配。要避免的陷阱是应用任务的单个函数运行时间不能太长 如操作大批量数据的 Flash 写否则它无法及时调度高优先级的 LLLink Layer任务而导致蓝牙通信中断。 OSAL 为每一个任务函数分配了一个 16 位的EVENT 事件每一位代表一个事件其中最高位代表的事件为 SYS_EVENT_MSG这个事件被 OSAL 系统保留其他的 15 位可以由用户定义OSAL 在主循环里运行每次都会检查每个任务函数的是否有事件发生事件置位如果有事件发生将通过 taskid 来调用发生事件的任务函数并将发生的事件传递到该函数中去由任务函数处理对应的事件。 为什么要将返回值设置到tasksEvents中就是因为其本质是一个单任务循环如果某个子任务时间执行过长会影响更高优先级的任务的响应变慢影响整体性能。因此如果一个任务执行比较长宜进行分割在返回值那里设置继续处理事件然后返回大循环看看有没有更高优先级的任务需要执行。 事件和任务对应关系 事件和任务的事件处理函数是如何关联起来的呢 建立一个事件表保存各个任务对应的事件。【uint16 *tasksEvents;】。tasksEvents为指向一个内存分配的事件数组的指针。比如tasksEvents[0]为第0个任务的事件变量short int。 建立另一个函数表保存各个任务事件处理函数的地址。【const pTaskEventHandlerFn tasksArr[] 】将会根据tasksArr[x]去执行对应的回调函数。 然后将这两张表建立某种对应关系【void osalInitTasks( void )初始化task_id和tasksArr[]的函数指针对应关系】【uint8 osal_set_event( uint8 task_id, uint16 event_flag )设置事件发生】蓝牙协议栈也会调用并设置任务具体的实现已经被封装起来了。 当某一事件发生时则查找函数表找到对应的事件处理函数即可。【events (tasksArr[idx])( idx, events );调用idx变好的函数指针回调函数】 //定义了一个函数指针 /** Event handler function prototype*/ typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short event );//这是一个数组该数组的每一项都是一个函数指针指向了事件处理函数 // The order in this table must be identical to the task initialization calls below in osalInitTask. const pTaskEventHandlerFn tasksArr[] {LL_ProcessEvent, // task 0Hal_ProcessEvent, // task 1HCI_ProcessEvent, // task 2 #if defined ( OSAL_CBTIMER_NUM_TASKS )OSAL_CBTIMER_PROCESS_EVENT( osal_CbTimerProcessEvent ), // task 3 #endifL2CAP_ProcessEvent, // task 4GAP_ProcessEvent, // task 5GATT_ProcessEvent, // task 6SM_ProcessEvent, // task 7GAPRole_ProcessEvent, // task 8GAPBondMgr_ProcessEvent, // task 9GATTServApp_ProcessEvent, // task 10SimpleBLEPeripheral_ProcessEvent // task 11 };//该变量保存了任务的总个数 const uint8 tasksCnt sizeof( tasksArr ) / sizeof( tasksArr[0] );//这是一个指针指向了事件表的首地址事件表实际上是一个内存分配的数组 uint16 *tasksEvents;OSAL是一种事件驱动的轮询式操作系统。事件驱动是指发生事件后采取相应的事件处理方法轮询指的是不断地查询是否有事件发生。 tasksEvents (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt); osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt)); 在系统初始化时将所有任务的事件初始化为0。通过taskEvents[idx]是否为0来判断是否有事件发生【if (tasksEvents[idx])】。如果有事件发生则查找函数对应的事件处理函数对事件进行处理【events (tasksArr[idx])( idx, events );】。 事件表使用数组来实现数组的每一项对应任务的事件每一位表示一个事件函数表使用函数指针数据来实现数组的每一项是一个函数指针指向了事件处理函数。 OSAL提供的API 总体而言大致可以分为10个方面 1.消息管理 2.任务同步 3.时间管理 4.中断管理 5.任务管理 6.内存管理 7.电源管理 8.非易失性闪存管理 9.时钟管理 10.其他常用 事件 OSAL为每个任务函数分配了一个16位的事件变量每一位代表一个事件。最高位0x8000保留为系统事件SYS_ENENT_MSG。其余的15位留给用户自定义需要的事件。通常事件由定时器启动比如2s后我要点亮LED1这就需要发送一个点亮LED1的事件然后等待当2s后接收到点亮LED1事件的时候调用HAL层开关LED1的函数开启LED1。 消息 MAG是比EVENT事件更具体并且可以携带数据的一种通信方式。而且MSG的标记是按数值而不是按位。比如0x02和0x03是两个不同的消息但是对于事件0x03则是0x01和0x02事件的组合。MSG收发使用osal_mag_send()和osal_msg_receive()当调用osal_msg_send()发送一个MSG的同时会在EVENT列表中触发一个message ready event。为了降低消息传递的开支通常传递指向消息的指针。 消息与事件的区别 讲解消息队列之前需要讲解一下消息与事件的区别。 事件是驱动任务去执行某些操作的条件当系统中产生了一个事件OSAL 将这个事件传递给相应的任务后任务才能执行一个相应的操作调用事件处理函数去处理。 通常某些事件发生时又伴随着一些附加信息的产生例如主机 GATT 接收到数据后会产生 GATT_MSG_EVENT 消息但是任务的事件处理函数在处理这个事件的时候还需要得到所收到的数据。 因此这就需要将事件和数据封装成一个消息将消息发送到消息队列osal_msg_send然后在事件处理函数中就可以使用 osal_msg_receive 从消息队列中得到该消息。这里需要说明一点消息一般用于不同任务函数之间的数据传递因为不同的任务具有各自的堆栈空间。在同一任务中使用全局函数或者用户事件完全能够胜任。当然消息也可以在同一个任务中传递数据。 EVENT用于同一任务函数传递命令而MSG则用于不同的任务函数传递命令数据。 这里需要说明一点消息一般用于不同任务函数之间的数据传递因为不同的任务具有各自的堆栈空间。在同一任务中使用全局函数或者用户事件完全能够胜任。当然消息也可以在同一个任务中传递数据。 事件处理 消息处理 OSAL 维护了一个消息队列每一个消息都会被放到这个消息队列中去当任务接收到事件后可以从消息队列中获取属于自己的消息然后调用消息处理函数进行相应的处理即可。 Osal_msg_allocate()为消息分配缓存空间分配之后可以填充消息然后通过osal_msg_send( ) 将消息发送出去然后任务函数中通过 osal_msg_reveive()函数接收属于 自己的消息并处理最后调用osal_msg_deallocate() 函数销毁由Osal_msg_allocate()分配的内存空间。 下面是按键的消息处理过程按键的消息最终将会发送到第一次注册的任务中去。 这里需要说明一点消息一般用于不同任务函数之间的数据传递因为不同的任务具有各自的堆栈空间。在同一任务中使用全局函数或者用户事件完全能够胜任。当然消息也可以在同一个任务中传递数据。 事实上它只是发了一个KEY_CHANGE事件而键值是以MSG消息的形式发到系统的消息队列而该消息也会带上目标taskId的标识。 如下代码可以从消息队列中得到一个消息pMsg osal_msg_receive( registeredKeysTaskID)) 时间管理 时间管理API用于开启和关闭定时器定时时间一般为毫秒级定时。 osal_start_reload_timer()和osal_start_timerEx()功能一样但是本接口还多了一个功能就是定时时间到后相应事件被执行并重新加载定时器也就是又重新设置了定时器继续进行定时工作除非调“osal_stop_timerEx()”接口否则一直循环定时操作。
http://www.huolong8.cn/news/298626/

相关文章:

  • .mil域名的网站网站建设项目采购合同
  • 网站服务器租赁费用表格wordpress登入后台没反应
  • 宁波网站优化建站公司网页设计教程文字与图片
  • 天气网站建设网站建设购买数据库的流程图
  • 企业网站制作公司合肥微商手机网站制作公司
  • 滑县网站建设报价建立网站有哪些步骤
  • 旅行社静态模板网站中天建设集团有限公司广西分公司
  • 表格模板免费下载网站家装室内设计培训班哪里
  • 网站建设构造学习wordpress布局模板
  • 福州cms模板建站有什么图片做视频的网站吗
  • 做视频用的网站骨干校建设专题网站
  • 网站产品链接怎么做南宁网站seo推广优化公司
  • 视频收费网站怎么做积分商城平台
  • 建设网站的建设费用包括哪些内容做招聘和求职都需要哪些网站
  • 富阳区建设工程质监站网站做电影网站会有什么惩罚
  • 沈阳网站推广排名方案google官方下载app
  • 购物网站模版洛阳建设网站公司
  • 哪家手机网站建设用vs2013做网站案例
  • 建网站的公司服务wordpress新数据库
  • 杨凌做网站网址自己做的网站改变字体
  • 展示产品的网站 个人备案还是企业网站备案太久了
  • 杭州网站怎么做seowordpress去掉顶部工具栏
  • 休闲网站建设长沙河东做网站
  • 怎么建网站锦州智慧旅游网站开发与设计与实现
  • 网站SEM优化如何做营销网络图
  • 微页制作网站模板导购网站建设需求模版
  • 秦皇岛做网站wordpress微信分享代码
  • dede如何制作网站地图wordpress搬家出问题
  • 昌平网站建设公司借助网络
  • 四川网站建设免费咨询seo新人培训班