网站大量收购独家精品文档,联系QQ:2885784924

osal详解.doc

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
osal详解

Zstack OSAL详解 ? 1. void osal_start_system( void ) 所有应用程序,无论是自己写的最简单的测试程序还是复杂的OSAL操作系统,都必须从main( )来入口。所谓的OS操作系统,我们不妨这样想像:自己写一个最简单的main( ),里面就一句打印“Hello, World”.如果需要加入Key, LED这样的输入输出功能,那么就需要扩充main( ),加入Key, LED的驱动,如果要实现多线程调度,就要加入Timer驱动等等。其实操作系统就是这么来的,简单吧:)。 一般在OS中都会有个死循环,在这个循环中去处理各种各样的事件。在Zstack OSAL中,这个死循环就存在于osal_start_system()这个函数中。下面来详细分析在这个死循环中到底在做哪些事情。 ? 2. OSAL的“心跳” 在OSAL的死循环中,各个事件只是在某些特定的情况下发生,如果OSAL一刻不停去轮询去处理这些应用程序,迟早会累死(热量,功耗,寿命…),这样做是完全没有必要的。所以这里就引入了心跳的概念,也就是OS的时钟节奏。在Zstack OSAL中这个节奏定义为1ms, 由8 bits HW_TIMER4来控制,当然这些都可以由程序员来修改,后面就以系统的默认值来讲述。在void InitBoard( byte level )这个函数中有下面这段代码就是在定义系统的心跳Timer。 HalTimerConfig (OSAL_TIMER, HAL_TIMER_MODE_CTC,????????????????? HAL_TIMER_CHANNEL_SINGLE, HAL_TIMER_CH_MODE_OUTPUT_COMPARE, ????????????????? OnboardTimerIntEnable, ????????????????? Onboard_TimerCallBack); 在OSAL的Timer定义好了以后,就要启动Timer, 至于如何启动Timer, 请自行查阅2430 Spec, 我这里想说的是,在一步步跟踪源码到死循环开始,都没有发现启动OSAL Timer的代码,最后通过观察Timer相关的控制寄存器,发现,在网络层初始化函数nwk_init( taskID++ )执行完毕后Timer启动了,也就是说在网络层初始化函数中有启动Timer的语句,因为网络层初始化是不开源的,无从去看源代码验证,总之,Timer启动了就好。 每当1ms心跳来临时,Timer4的中断标志置位,这样在OSAL的死循环中检测到这个标志置位后,就去轮询处理各事件。没有检测到这个标志位则继续死循环。在死循环的开始有调用Hal_ProcessPoll()这条语句,实际上就是在查询中断标志并作相应的处理。 ? 3. OSAL的“心跳??来临后的处理 上节提到Hal_ProcessPoll()这条语句,实际上就是在查询中断标志并作相应的处理。那么当1ms心跳来临时,我们跟踪进这个函数看看它到底干了些什么。 当判断到中断标志,表明1ms心跳来临了,就去调用Timer4相应的回调函数。这个回调函数由HalTimerConfig()的最后一个参数来定义,请回看上节,OSAL Timer的回调函数就是Onboard_TimerCallBack(),一步步跟进,最终调用osalTimerUpdate()这个函数。在这个函数中会去轮询Timer事件链表。 Timer事件链表是下面这样一个结构,next指向下一个Timer事件,timeout值表明本Timer事件还需要timeout个心跳才需要被处理,因为此处心跳是1ms,所以也就是说还需要timeout个ms才处理。所谓的处理也就是检测timeout是否小于1ms,如果小于1ms, 则发出event_flag这个消息到消息队列,这个消息隶属于task_id这个任务。如果大于1ms,说明该Timer事件还不到处理的时候,则Timeout = Timeout-1,然后继续耐心等待下一次心跳。注:Timer事件链表的维护是通过osal_start_timerEx()这个函数来实现的。 typedef struct { void *next; UINT16 timeout; UINT16 event_flag; byte task_id; } osalTimerRec_t; ? 4. 消息发出后的处理 上节讲到在心跳中发出任务的事件消息到消息队列。那么这个消息由谁来处理?回头再看osal_start_system( )中的死循环,有检测消息队列的语句,当发现有消息时,判断该消息隶属于哪个任务就去调用对应于该任务的消息处理函数。各任务的消息处理函数是在tasksArr[]这个常量

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档