CC2530zigbee技术-简介协议栈
前言
说实话,我喜欢自己的原创,虽然我写得可能简单了,但我觉得自己在写博客的路途上,一点一点地积累知识,我也借鉴别人的东西,特别是在写这篇文章时所使用的是markdownpad2写的,原来我根本就不知道还有这个玩意,所以相信在园里的朋友们都会支持的,如果您知道了,或者懂了,就默默地无视小弟我写的博客,如果没有接触过呢,嘿嘿,我们一起研究进步!
协议栈
TI公司很牛,这是给我的感觉,它能把那些复杂的东西全部写好,就提供一些API来给我们使用,让用户更加方便,这个是我对它崇拜的地方,好了,不说废话了,进入正题。
下面就是协议栈的框图了
那么所谓的协议栈指的就是TI公司的Z-STACK,不得不说人们的智慧是无穷的,这样一个基于8051的芯片在上面写了一个操作系统其名为Z-stack
采用的方法是任务轮回的方法,而且任务ID值越小,优先级越高!
我们使用IAR打开TI公司提供的example 路径如下:
C:\Texas Instruments\ZStack-CC2530-2.3.0-1.4.0\Projects\zstack\Samples\SampleApp\CC2530DB
可以看到非常清楚的工作目录。
协议栈函数解析
首先我们找到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有了一定的了解了吧!
总结
我们可以得出以下的大致流程:
CC2530zigbee技术-简介协议栈的更多相关文章
- 常见爬虫/BOT 对抗技术简介(二)
上一篇文章分别从网络协议,Robots文件,JS渲染,行为分析等多方面讲了些“反爬虫”,“反-反爬虫”技术. 点击查看:<常见爬虫/BOT 对抗技术简介(一)> 本文将主要介绍各种IP地址 ...
- Java Servlet 技术简介
Java Servlet 技术简介 Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么 ...
- 【转】Android 防破解技术简介
http://www.cnblogs.com/likeandroid/p/4888808.html Android 防破解技术简介 这几年随着互联网的不断发展,Android App 也越来越多!但是 ...
- InfiniBand技术简介
InfiniBand技术简介 转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese 介绍 随着CPU和通讯处理速度的 ...
- Windows NT 技术简介
Windows NT 技术简介 NT:New Technoly(新技术,因比DOS.WIN9X采用了很多新技术而得名) Windows NT基本介绍 WindowsNT是Microsoft推出的面向工 ...
- CSS border三角、圆角图形生成技术简介
http://www.zhangxinxu.com/wordpress/?p=794 一.前言 利用CSS的border属性可以生成一些图形,例如三角或是圆角.纯粹的CSS2的内容,没有兼容性的问题, ...
- FC总线技术简介
FC是由美国标准化委员会(ANSI)的X3T11小组于1988年提出的高速串行传输总线,解决了并行总线SCSI遇到的技术瓶颈,并在同一大的协议平台框架下可以映射更多FC-4上层协议.FC具备通道和网络 ...
- P2P技术简介
P2P技术简介 NAT( Network Address Translation)穿越(俗称打洞)技术 前言: p2p已经存在于我们生活的方方面面:我们通过下载在工具(比如迅雷,bitorent,各种 ...
- 【CUDA并行程序设计系列(1)】GPU技术简介
http://www.cnblogs.com/5long/p/cuda-parallel-programming-1.html 本系列目录: [CUDA并行程序设计系列(1)]GPU技术简介 [CUD ...
随机推荐
- spark-streming 中调用spark-sql时过程遇到的问题
在spark-streming 中调用spark-sql时过程遇到的问题 使用版本:spark-2.1.0 JDK1.8 1. spark-sql中对limit 的查询结果使用sum() 聚合操作不生 ...
- Selenium窗口切换-----Selenium快速入门(六)
有时候,我们打开多个窗口,进行多窗口操作,那么窗口间该如何切换呢? 切换的方法有两个,一个是通过窗口标题来验证,另一个是通过窗口特定的内容来验证,这两个方法都要求得到的标题或内容是唯一的. 用到的相关 ...
- EF一对多的表,模糊查询2个表的数据!
如用户表和电话表,要求搜索时可以模糊查询姓名和号码.都可以找到包含该字符的所有用户. /// <summary> /// 模糊查询姓名和电话号码,并按姓名排序返回 /// </sum ...
- 「HEOI2014」南园满地堆轻絮
题目链接 戳我 题目出处 菩萨蛮·南园满地堆轻絮 温庭筠 南园满地堆轻絮,愁闻一霎清明雨.雨后却斜阳,杏花零落香 ...
- 【12c OCP】最新CUUG OCP-071考试题库(51题)
------------------------------------------------------- 51.(12-10)choose the best answer: Evaluate t ...
- HDP Spark2 HIVE3.1 的问题
HDP 上安装了 Hive3.1 和 Spark2, 提交 Spark 作业时,报找不到 Hive 中表的问题 但是查一了下 hive 表,明明是存在这个表的.查看日志,注意到如下的一段日志. 没修改 ...
- php全局变量漏洞 $GLOBALS
在Discuz代码中有这么一段: if (isset($_REQUEST[‘GLOBALS’]) OR isset($_FILES[‘GLOBALS’])) { exit(‘Request tain ...
- Apache Flume入门指南[翻译自官方文档]
声明: 根据官方文档选择性的翻译了下,不对请指正 https://flume.apache.org/FlumeUserGuide.html
- Struts2运行原理
一个请求在Struts2框架中的处理大概分为以下几个步骤: 1 客户端发送请求:2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤 ...
- oracle中表空间的相关操作
Oracle 创建表空间 注意点: 1.如果在PL/SQL 等工具里打开的话,直接修改下面的代码中[斜体加粗部分]执行 2.确保路径存在,比如[E:\app\Quentin\oradata\orcl] ...