zoukankan      html  css  js  c++  java
  • 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有了一定的了解了吧!

    总结

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

  • 相关阅读:
    使用 requests 维持会话
    使用 requests 发送 POST 请求
    使用 requests 发送 GET 请求
    requests 安装
    使用 urllib 分析 Robots 协议
    使用 urllib 解析 URL 链接
    使用 urllib 处理 HTTP 异常
    使用 urllib 处理 Cookies 信息
    使用 urllib 设置代理服务
    按单生产程序发布
  • 原文地址:https://www.cnblogs.com/samuelwnb/p/4208876.html
Copyright © 2011-2022 走看看