• CC2530zigbee技术-简介协议栈


    前言

    说实话,我喜欢自己的原创,虽然我写得可能简单了,但我觉得自己在写博客的路途上,一点一点地积累知识,我也借鉴别人的东西,特别是在写这篇文章时所使用的是markdownpad2写的,原来我根本就不知道还有这个玩意,所以相信在园里的朋友们都会支持的,如果您知道了,或者懂了,就默默地无视小弟我写的博客,如果没有接触过呢,嘿嘿,我们一起研究进步!

    协议栈

    TI公司很牛,这是给我的感觉,它能把那些复杂的东西全部写好,就提供一些API来给我们使用,让用户更加方便,这个是我对它崇拜的地方,好了,不说废话了,进入正题。
    下面就是协议栈的框图了

    那么所谓的协议栈指的就是TI公司的Z-STACK,不得不说人们的智慧是无穷的,这样一个基于8051的芯片在上面写了一个操作系统其名为Z-stack
    采用的方法是任务轮回的方法,而且任务ID值越小,优先级越高!

    我们使用IAR打开TI公司提供的example 路径如下:

    C:Texas InstrumentsStack-CC2530-2.3.0-1.4.0ProjectszstackSamplesSampleAppCC2530DB

    可以看到非常清楚的工作目录。

    协议栈函数解析

    首先我们找到Zmain目录下的zmain.c,找到int main();没错,这就是传说中的主函数

    int main( void ){
          osal_int_disable( INTS_ALL );//关闭所有的中断
          HAL_BOARD_INIT();//初始化时钟信号
          zmain_vdd_check();//检查芯片电压
          InitBoard( OB_COLD );//初始化IO LED TIMER
          HalDriverInit();//初始化芯片各硬件模块 
          osal_nv_init( NULL );//初始化flash
         ZMacInit();//初始化MAC层
         zmain_ext_addr();//确定16位地址
         zgInit();//初始化非易失变量 
           #ifndef NONWK
         afInit();
          #endif
         osal_init_system();//初始化操作系统
         osal_int_enable( INTS_ALL );//使能全部中断
         InitBoard( OB_READY );//初始化按键
         zmain_dev_info();//显示设备信息
         #ifdef LCD_SUPPORTED
         zmain_lcd_init();//在LCD上显示设备信息
         #endif
         #ifdef WDT_IN_PM1
           WatchDogEnable( WDTIMX );
           #endif
           osal_start_system(); // No Return from here 进入操作系统后不再返回
           return 0;
         } 
        main()
    

    哈哈,我已经做了翻译工作,但是不一定是对的,因为毕竟是站在我的理解上写的!

    上述的代码基本上都是一些初始化的代码,一个硬件的启动必须要有各种各样的设定才行!
    下面分两个来讲,主要是讲两个函数:osal_init_system()和osal_start_system(),因为这两个函数可是重中之中啊!

    osal_init_system()函数分析

    在IAR中go to defintion就可以了,当然你也可以在OSAL.c这个文件中找到:

    	uint8 osal_init_system( void )
    	{
      		// Initialize the Memory Allocation System
      		osal_mem_init();//初始化内存分配系统
    
      		// Initialize the message queue
      		osal_qHead = NULL;//初始化消息队列
    
      		// Initialize the timers
      		osalTimerInit();//初始化定时器
    
      		// Initialize the Power Management System
     		 osal_pwrmgr_init();//初始化店里管理系统
    
     		 // Initialize the system tasks.
      		osalInitTasks();//初始化系统任务
    
      		// Setup efficient search for the first free block of heap.
      		osal_mem_kick();
    
      		return ( SUCCESS );
    	}
    

    osal_start_system()函数分析

    同样的道理,你也可以找到这个函数的定义

    	void osal_start_system( void )
    	{
    		#if !defined ( ZBIT ) && !defined ( UBIT )
     			 for(;;)  // Forever Loop永远循环
    		#endif
     	   {
        	uint8 idx = 0;
    
        	osalTimeUpdate();//扫描哪个事件被触发了,然后置相应的标志位
       	 	Hal_ProcessPoll();  // This replaces MT_SerialPoll() and osal_check_timer().
        
       		 do {
          		if (tasksEvents[idx])  // Task is highest priority that is ready.
         		 {
            		break;               //得到待处理的优先级最高的是任务ID  idx
         		 }
       		 } while (++idx < tasksCnt);
    
        		if (idx < tasksCnt)
       		 {
         			 uint16 events;
         			 halIntState_t intState;
    
         		 HAL_ENTER_CRITICAL_SECTION(intState);//进入临界区进行保护
         		 events = tasksEvents[idx];//提取需要处理的事件
         		 tasksEvents[idx] = 0;  // Clear the Events for this task.清楚事件
         		 HAL_EXIT_CRITICAL_SECTION(intState);//退出临界区保护
    
         		 events = (tasksArr[idx])( idx, events );//通过指针调用处理函数
    
         		 HAL_ENTER_CRITICAL_SECTION(intState);//进入临界区
          		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
      			}
    		}
    

    相信看了上面的注释,对于zigbee的z-stack有了一定的了解了吧!

    总结

    我们可以得出以下的大致流程:

  • 相关阅读:
    动态规划 ------最短路径问题
    回溯算法 ------回溯算法的设计思想和适用条件
    回溯算法 ------ 回溯算法的设计思想及适用条件
    回溯算法 ------回溯算法的几个例子
    纯css实现翻书效果
    从vue源码看props
    js循环中使用async/await踩过的坑
    js实现word转换为html
    从vue源码看Vue.set()和this.$set()
    微信、qq二次分享
  • 原文地址:https://www.cnblogs.com/samuelwnb/p/4208876.html
Copyright © 2020-2023  润新知