zigbee协议栈学习(五)

简介:

下篇文张讲解一个无线控制LED案列,这章了解系统运行的结构。


第一Z-Stack 软件架构 

Z-Stack  由 main()函数开始执行,main()函数共做了 2 件事:一是系统初始
化,另外一件是开始执行轮转查询式操作系统, 
FS_Zstack\ZMain.c 
ZSEG int main( void ) 

   osal_int_disable( INTS_ALL );   // 关闭所有中断 
 
   HAL_BOARD_INIT();        // 初始化系统时钟 
 
   zmain_vdd_check();              // 检查芯片电压是否正常 
 
    zmain_ram_init();             // 初始化堆栈 
 
   InitBoard( OB_COLD );       // 初始化I/O,LED、Timer等 
 
    HalDriverInit();           // 初始化芯片各硬件模块 
 
   osal_nv_init( NULL );         // 初始化 Flash存储器 
   
   zmain_ext_addr();         // 确定 IEEE地址 
 
   zgInit();               //初始化非易失变量
 
   ZMacInit();             // 初始化MAC 层 
   
   osal_init_system();         //初始化操作系统
 
   osal_int_enable( INTS_ALL );   //使能全部中断 
 
   InitBoard( OB_READY );          //初始化按键 
 
   zmain_dev_info();             //显示设备信息 
 
   osal_start_system();          //执行操作系统 
 
}   

第二Z-Stack 操作系统初始化 
OSAL.c 
byte osal_init_system( void ) 

   osal_mem_init();    // Initialize the Memory Allocation System 
 
   osal_qHead = NULL;     // Initialize the message queue 
 
   osalTimerInit();    // Initiaize the timers 
   
   osal_pwrmgr_init();  // Initialize the Power Management System 
    
   osalInitTasks();    //初始化系统的任务 
     
    osal_mem_kick();    // Setup efficient search for the first free block of heap. 
 
   return ( ZSUCCESS ); 

着重分析初始化系统任务,需要考虑的是自己用的时候有些地方是需要修改的。
sapi .c 
void osalInitTasks( void ) 

   uint8 taskID = 0; 
//分配内存,返回指向缓冲区的指针 
    tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt); 
  //设置所分配的内存空间单元值为 0 
   osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt)); 
 
//任务优先级由高向低依次排列,高优先级对应 taskID 的值反而小 
  macTaskInit( taskID++ );    //macTaskInit(0),用户不需考虑 
  nwk_init( taskID++ );      //nwk_init(1),用户不需考虑 
  Hal_Init( taskID++ );      //Hal_Init(2),用户需考虑 
  APS_Init( taskID++ );      //APS_Init(3),用户不需考虑 
  ZDApp_Init( taskID++ );      //ZDApp_Init(4),用户需考虑
  SAPI_Init( taskID );       //SAPI_Init(5),用户需考虑 


第三操作系统执行过程 
Z-Stack 中操作系统是基于优先级的轮转查询式操作系统详细执行过程如下: 
FS_Zstack\OSAL.c 
void osal_start_system( void ) 

   for(;;)                        // 死循环 
   { 
        do { 
            if (tasksEvents[idx])       
            { 
                break;                  // 得到待处理的最高优先级任务索引号idx 
            } 
        } while (++idx < tasksCnt); 
 
        if (idx < tasksCnt) 

            HAL_ENTER_CRITICAL_SECTION(intState);  //进入临界区 
            events = tasksEvents[idx];          //提取需要处理的任务中的事件 
            tasksEvents[idx] = 0;                // 清除本次任务的事件 
            HAL_EXIT_CRITICAL_SECTION(intState);  //退出临界区 
 
            events = (tasksArr[idx])( idx, events );      //通过指针调用任务处理函数 
            HAL_ENTER_CRITICAL_SECTION(intState);  //进入临界区 
            tasksEvents[idx] |= events;              // 保存未处理的事件 
            HAL_EXIT_CRITICAL_SECTION(intState);  //退出临界区 
            } 
        } 

sapi .c 
const pTaskEventHandlerFn tasksArr[] = { 
  macEventLoop,        //用户不需要考虑 
   nwk_event_loop,        //用户不需要考虑 
   Hal_ProcessEvent,      //用户可以考虑 
    APS_event_loop,        //用户不需要考虑 
   ZDApp_event_loop,      //用户可以考虑 
   SAPI_ProcessEvent      //用户可以考虑 
}; 
目录
相关文章
|
25天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
116 9
|
16天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
22 1
|
3天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
22 5
|
18天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
28天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
21天前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
23天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
47 4
|
28天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
33 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
2月前
初步认识栈和队列
初步认识栈和队列
61 10