Ztack学习笔记(3)-系统启动分析

一 系统启动

//OSAL.cvoid osal_start_system( void )
{
#if !defined ( ZBIT ) && !defined ( UBIT )
  for(;;)  // Forever Loop
#endif
  {
    osal_run_system();
  }
}

二 操作系统运行

//OSAL.cvoid osal_run_system( void )
{
  uint8 idx = 0;

  osalTimeUpdate();
  Hal_ProcessPoll();//轮询TIMERUART

  do {
    if (tasksEvents[idx])  // Task is highest priority that is ready.
    {
      break;
    }
  } while (++idx < tasksCnt);
初始化时由osal_memset()设为0只要不为空类型NULL,即有相对应任务事件发生,就break跳出循环体,通过下面的程序进行任务事件处理。如果为空,执行判断语句,即idx自增,再返回轮询有无各层的任务事件发生。如果执行完循环语句都没有检测到有事件发生,idx=7(任务初始化时,最下面的 SampleApp_Init( taskID )为task=6,即最大为6,进入睡眠。
  if (idx < tasksCnt)
  {
    uint16 events;
    halIntState_t intState;

    HAL_ENTER_CRITICAL_SECTION(intState);//中断临界状态:保存先前中断状态,然后关中断,见备注1
    events = tasksEvents[idx];//对应有事件发生的任务的数组
    tasksEvents[idx] = 0;  // Clear the Events for this task.//取出任务事件后,清除此任务数据的事件
    HAL_EXIT_CRITICAL_SECTION(intState);//跳出中断临界状态:恢复先前中断状态 

    activeTaskID = idx;
    events = (tasksArr[idx])( idx, events ); //调用相对应的任务事件处理函数处理,各类事件处理函M(task_id,event)返回的都是这个任务未被处理的事件。
    activeTaskID = TASK_NO_TASK;

    HAL_ENTER_CRITICAL_SECTION(intState); //把刚才返回未处理的任务事件添加加当前任务中再进行处理,跳出此if(idx < tasksCnt)循环再进行if (tasksEvents[idx])判断并处理)
    tasksEvents[idx] |= events;  // Add back unprocessed events to the current task.
    HAL_EXIT_CRITICAL_SECTION(intState);
  }
#if defined( POWER_SAVING )
  else  // Complete pass through all task events with no activity?
  {
    osal_pwrmgr_powerconserve();  // Put the processor/system into sleep
  }
#endif

  /* Yield in case cooperative scheduling is being used. */
#if defined (configUSE_PREEMPTION) && (configUSE_PREEMPTION == 0)
  {
    osal_task_yield();
  }
#endif
}

三  事件机制

events = (tasksArr[idx])( idx, events );任务idx的事件处理函数

以上代码是响应具体的事件函数,其中tasksArr定义为如下:

//OSAL_SampleApp.cconst pTaskEventHandlerFn tasksArr[ ] =
{
    macEventLoop,   //MAC层任务事件处理函数
    nwk_event_loop,  //NWK层任务事件处理函数
    Hal_ProcessEvent,  //PHY层事件处理函数
    #if defined( MT_TASK )
    MT_ProcessEvent, //MT任务事件处理函数
    #endif
    APS_event_loop,  //APS层任务事件处理函数
    ZDApp_event_loop,  //ZDO任务事件处理函数
    SampleApp_ProcessEvent  //用户应用任务事件处理函数
};

而pTaskEventHandlerFn又定义为

//OSAL_Tasks.h
typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short event );

即:pTaskEventHandlerFn声明为一种函数指针,该函数指针指向M(task_id,event)这种类型的函数,而tasksArr是一个指针数组,数组里面的元素的类型为pTaskEventHandlerFn,就是函数指针,这样tasksArr[ ]就是一个按照idx顺序排列的函数数组。如果调用tasksArr中相对应的函数,直接使用 tasksArr[idx](task_id,event)就行了。在osal_run_system中,调用events = (tasksArr[idx])( idx, events ),执行由idx相对应的事件任务。

四 参考链接

【1】zstack sampleApp程序分析3

备注1

1 #define HAL_ENABLE_INTERRUPTS()         st( EA = 1; )
2 #define HAL_DISABLE_INTERRUPTS()        st( EA = 0; )
3 #define HAL_INTERRUPTS_ARE_ENABLED()    (EA)
4
5 typedef unsigned char halIntState_t;
6 #define HAL_ENTER_CRITICAL_SECTION(x)   st( x = EA;  HAL_DISABLE_INTERRUPTS(); )
7 #define HAL_EXIT_CRITICAL_SECTION(x)    st( EA = x; )
8 #define HAL_CRITICAL_STATEMENT(x)       st( halIntState_t _s; HAL_ENTER_CRITICAL_SECTION(_s); x; HAL_EXIT_CRITICAL_SECTION(_s); )

时间: 2024-12-15 19:26:34

Ztack学习笔记(3)-系统启动分析的相关文章

cocos2dx游戏开发学习笔记3-lua面向对象分析

在lua中,可以通过元表来实现类.对象.继承等.与元表相关的方法有setmetatable().__index.getmetatable().__newindex. 具体什么是元表在这里就不细说了,网上很多介绍,这里主要讲与cocos2dx相关联的部分. 在lua-binding库中extern.lua里,有如下方法: --Create an class. function class(classname, super) local superType = type(super) local c

Time, Delays, and Deferred Work &lt;LDD3&gt; 学习笔记 + jiffies.h 分析

Time, Delays, and Deferred Work Dealing with time involves the following tasks, in order of increasing complexity: ? Measuring time lapses and comparing times ? Knowing the current time ? Delaying operation for a specified amount of time ? Scheduling

Ztack学习笔记(2)-系统初始化分析

一 系统初始化 1 uint8 osal_init_system( void ) 2 { 3 // Initialize the Memory Allocation System 4 osal_mem_init(); 5 6 // Initialize the message queue 7 osal_qHead = NULL; 8 9 // Initialize the timers 10 osalTimerInit(); 11 12 // Initialize the Power Manag

Linux学习笔记:系统启动引导过程

Linux系统启动引导过程 最近发现自己在只是掌握上有几个比较硬的伤: 一.知识体系碎片,比如Linux,这学点那学点,结果没有成体系,串不起来: 二.记忆时间短暂,很多的内容学了就忘,最后的结果是遇见一个知识点就能想起来自己的确学过,但是现在记不起来了. 三.理解程度浅显,比如说今天要整理关于Linux引导的内容,之前大体是知道的,不能称之为理解,我认为在学着一个知识点的时候至少要能系统有条理地讲出来,而不是有个模模糊糊的大体认识. 个别名词解释 1.BIOS(Basic Input Outp

传智播客c/c++公开课学习笔记--黑客代码分析与预防

黑客代码分析与预防 笔记 [课程简介] C/C++语言是除了汇编之外,最接近底层的计算机语言,目前windows,linux,iOS,Android等主流操作系统都是用C/C++编写的,所以很多病毒.木马也都是用C/C++实现的.课程的目的就是通过C语言揭秘木马和各种远程控制软件的实现原理以及如何防护. [课程知识点] 1.木马入侵系统的方式: 2.木马入侵到宿主目标后的关键行为分析: 3.可信任端口以及端口扫描技术: 4.远程控制的实现代码实现: 5.恶意代码中使用TCP.UDP协议与防火墙穿

LR学习笔记2-LoadRunner目录分析

1.为什么要做目录分析?对于初学者来说:安装完软件,只是傻瓜式应用,那么就会忽略掉LR自带的分析方法和方式,学习这个可以帮助我们更好的掌握. 主要学习完本节要做到: --了解软件安装后目录结构的必要性 --简单分析主要目录 2.下面进入重点内容: --analysis templates--分析模板,我的在安装目录在:D:\Program Files (x86)\HP\LoadRunner\AnalysisTemplates\DefaultTemplate1 --bin目录,可执行程序注意这里的

项目管理学习笔记之三.绩效分析

项目管理个人能力培养--绩效分析越给高层看的东西, 越要清晰和简洁.领导希望的是迅速地了解项目的当前状态.当然,如果他有兴趣了解更多,他也需要能提供.这时,采用颜色来标识项目的进度就是一种很好的方法,如,绿色表示正常,黄色表示有问题,但还不严重:红色表示严重,希望高层引起注意. 在绩效汇报中,基本要领是:第一.不仅要如实表现当前的项目状态:每二.要把项目的趋势表现出来,是往上还是往下,变化的情况怎么样,这个是很重要的内容. 我们在坐飞机时,飞机里有个频道,是如实播放当前飞机的状态,速度,经过的地

LR学习笔记5-LR界面分析3

本次最后一次介绍LR的界面了,这次学完,LR的三大组件就有了一定的了解了. --Analysis基础知识 --了解Analysis报告 --Analysis分析基础 --IP欺诈 1.Analysis基础知识 (1)创建会话 在运行方案时,数据将存储在结果文件中,扩展名为.lrr.Analysis将活动图的显示信息和布局设置存储在扩展名为.lra的文件中: (2)启动Analysis LR选择"Analysis"程序.也可以从Controller打开. (3)整理结果 方案执行之后,这

ArcGIS API for JavaScript 4.2学习笔记[26] 缓冲区分析【基于geometryEngine工具类】

要说GIS空间分析最经典的例子,就是缓冲区分析了. 本例使用geometryEngine来绘制缓冲区环.因为官方给的例子有3D和2D场景,所以就会显得比较复杂. 当鼠标在视图上点击时,就会生成一个缓冲区环(以点击的点为中心): 当鼠标拖拽时,若不是漫游状态,则缓冲区环也会跟着一起动. 我会把生成缓冲区的核心代码用大标题红色标出,各位可以直接跳到那里学缓冲区的生成. 首先了解一下,缓冲区是以什么样的东西存在的? 在桌面GIS里,缓冲区就是一个面要素,可以是要素类也可以是shp文件. 在AJS里,缓