6lowpan怎么读在zigbee基础上做了什么改进

■ &■ &&1■
星期一, 4月 13日, 2015 (台北)
達盛電子推出全面優化的 2.4 GHz RF晶片支援ZigBee、6LowPAN、ISA100、WirelessHART、WIA-PA多種標準-陳瑋洋&&
達盛電子(UBEC)推出全面優化的2.4GHz RF晶片UZ2400,可支援最新版的IEEE802.15.4-2006。UZ2400的工作頻率涵蓋2400MHz 至2485MHz,並提供1MHz的頻道解析度,使其在頻道選擇上更為彈性。此外在資料傳輸速率上,UZ2400也特別提供了除標準的250kbps之外更高的1Mbps以及2Mbps。由於UZ2400支援完整的IEEE802.15.4-2006,使其在無線網路堆疊的開發上,可支援多種標準如ZigBee、6LowPAN、ISA100、WirelessHART、WIA-PA等,達到更廣泛的應用範圍,如家庭自動化控制、大樓自動化、廠房監控、環境監測、個人醫療、保全監控等應用,結合感測器等模組,創造更多附加價值。UZ2400整合2.4GHz頻帶的RF收發器、PHY層的Baseband和MAC層架構,並提供多種休眠模式,以達到低系統功耗目標。由於UZ2400的高整合設計,使其外部零件數降至最低,因此,無論在物料及生產成本的降低以及硬體的簡易設計上,都更有競爭力。此外,彈性地結合不同的微控制器(MCU)如ARM、8051等,可針對包括家庭自動化、消費電子、PC周邊設備、玩具、工業自動化等無線應用,來提供最佳化的系統解決方案。以IEEE 802.15.4標準為無線技術平台,結合各式各樣的感測(Sensor)及制動(Actuator)元器件,透過各種無線網路通訊標準如ZigBee、6LowPAN、ISA100、WirelessHART、WIA-PA等的連結,使得無線感測網路(Wireless Sensor Network;WSN)的發展在過去的2至3年間已逐漸形成一個完整的生態鏈。近來更結合網際網路及雲端的發展,成為物聯網(IoT)中一個非常關鍵的技術,如物聯網中對節能減碳與提高能源效率等需求的智慧電網應用,未來包括家中的空調、電視、冰箱、洗衣機等家電設備,甚至電動車等都將連上智慧電網,其中連結各種電子裝置與智慧電網之間的無線技術,即為無線感測網路(WSN)的應用範疇,這些電子裝置與節點能在任意時刻透過UZ2400與不同微控制器(MCU)所控制的終端感測或制動器相互通訊,並且利用閘道器(Gateway)結合異質網路,如乙太網路(Ethernet)、無線區域網路(Wi-Fi)或行動通訊網路等,連接上網際網路,將資料傳送到後端的伺服器,執行運算、判斷及儲存等,進而對各節點執行預定的控制行程。 UZ2400採用6 x 6 mm2 QFN-40L封裝已量產供貨,並提供UZ2400評估及開發所需軟/硬體套件或參考設計,使客戶可立即著手開發。達盛電子股份有限公司(UBEC)是國際性的無線IC設計公司,總部設於台灣新竹市,致力於發展無線感測網路應用所需的晶片及完整系統解決方案。
議題精選-智慧電網專輯關鍵字   
案例與方案
隨著競爭越來越激烈,零售業者若要留住客戶的心,就必須提升使用者的購物體驗、增加來客數量與客單價,以及加強門店管理效率...
&白皮書下載 NEW!
Elo Surface Acoustic Wave touchscreen technology delivers superior image clarity, resolution, light transmission, and reliability because it utilizes clear glass that continues to work even if scratched. There are no coatings, p...
DIGITIMES e-paper專區
Market Place
本網站內之全部圖文,係屬於大椽股份有限公司所有,非經本公司同意不得將全部或部分內容轉載於任何形式之媒體&&&DIGITIMES Inc. 版權所有查看: 1563|回复: 0
注册时间最后登录阅读权限100积分1330精华0帖子
本帖最后由 eva 于
11:44 编辑
摘要:&&本文深入源码,详细分析Contiki启动一个进程的过程。先是总结了process_start()都做了些什么事,进而跟踪代码进行详细分析。
引言& & process_start函数用于启动一个进程,将进程加入进程链表(事先验证参数,确保进程不在进程链表中),初始化进程(将进程状态设为运行状态及lc设为0)。给进程传递一个PROCESS_EVENT_INIT事件,让其开始执行(事先参数验证,确保进程已被设为运行态并且进程的函数指针thread不为空),事实上是执行进程结构体中的thread函数指针所指的函数,而这恰恰是PROCESS_THREAD(name, ev, data)函数的实现。判断执行结果,如果返回值表示退出、结尾或者遇到PROCESS_EVENT_EXIT,进程退出,否则进程被挂起,等待事件。
& & 理解系统最好的方法就是阅读源码,分享Linus的一句话,接下来跟踪代码详细分析Contiki系统是如何启动一个进程的。& & Read the Fucking Source Code --Linus Torvalds 整个调用过程如下:&b&&font color=&#0000ff&&process_start ——&&&process_post_synch ——& call_process&&——& exit_process&/font&&/b&复制代码一、process_start函数& & 将进程加入进程链表(事先验证参数,确保进程不在进程链表中),初始化进程(将进程状态设为运行状态及lc设为0)。给进程传递一个PROCESS_EVENT_INIT事件,让其开始执行。/*******启动一个进程********/
void process_start(struct process *p, const char *arg) //可以传递arg给进程p,也可以不传,直接“NULL”
{
& & struct process *q;
& & /*参数验证:确保进程不在进程链表中*/
& & for(q = process_ q != p && q != NULL; q = q-&next);
& & if(q == p)
& & {
& && &&&
& & }
& & /*把进程加到进程链表首部*/
& & p-&next = process_
& & process_list =
& & p-&state = PROCESS_STATE_RUNNING;
& & PT_INIT(&p-&pt); //将p-&pt-&lc设为0,使得进程从case 0开始执行
& & PRINTF(&process: starting '%s'\n&, PROCESS_NAME_STRING(p));
& & //给进程传递一个PROCESS_EVENT_INIT事件,让其开始执行
& & process_post_synch(p, PROCESS_EVENT_INIT, (process_data_t)arg);
}复制代码二、process_post_synch函数& & process_post_synch()直接调用call_process(),期间需要保存process_corrent,这是因为当调用call_process执行这个进程p时,process_current就会指向当前进程p,而进程p可能会退出或者被挂起等待一个事件[1]。//process_post_synch(p, PROCESS_EVENT_INIT, (process_data_t)arg);
void process_post_synch(struct process *p, process_event_t ev, process_data_t data) //typedef void * process_data_t;
{
& & struct process *caller = process_ //相当于PUSH,保存现场process_current
& & call_process(p, ev, data);
& & process_current = //相当于POP,恢复现场process_current
}复制代码三、call_process函数& & 如果进程process的状态为PROCESS_STATE_RUNNING,并且进程中的thread函数指针(相当于该进程的主函数)不为空的话,就执行该进程。如果返回值表示退出、结尾或者遇到PROCESS_EVENT_EXIT,进程退出,否则进程被挂起,等待事件。//call_process(p, PROCESS_EVENT_INIT, (process_data_t)arg);
static void call_process(struct process *p, process_event_t ev, process_data_t data)
{
& &
#if DEBUG
& & if(p-&state == PROCESS_STATE_CALLED)
& & {
& && &&&printf(&process: process '%s' called again with event %d\n&, PROCESS_NAME_STRING(p), ev);
& & }
#endif /* DEBUG */
& & if((p-&state & PROCESS_STATE_RUNNING) && p-&thread != NULL) //thread是函数指针
& & {
& && &&&PRINTF(&process: calling process '%s' with event %d\n&, PROCESS_NAME_STRING(p), ev);
& && &&&process_current =
& && &&&p-&state = PROCESS_STATE_CALLED;
& && &&&ret = p-&thread(&p-&pt, ev, data); //才真正执行PROCESS_THREAD(name, ev, data)定义的内容
& && &&&if(ret == PT_EXITED || ret == PT_ENDED || ev == PROCESS_EVENT_EXIT)
& && &&&{
& && && && &exit_process(p, p); //如果返回值表示退出、结尾或者遇到PROCESS_EVENT_EXIT,进程退出
& && &&&} else
& && &&&{
& && && && &p-&state = PROCESS_STATE_RUNNING; //进程挂起等待事件
& && &&&}
& & }
}复制代码PT四种状态 #define PT_WAITING 0 /*被阻塞,等待事件发生*/
#define PT_YIELDED 1 /*主动让出*/
#define PT_EXITED&&2 /*退出*/
#define PT_ENDED& &3 /*结束*/复制代码进程状态#define PROCESS_STATE_NONE& && && &0&&/*类似于Linux系统的僵尸状态,进程已退出,只是还没从进程链表删除*/
#define PROCESS_STATE_RUNNING& && && &1&&/*进程正在执行*/
#define PROCESS_STATE_CALLED& && && &2&&/*被阻塞,运行?*/复制代码
四、exit_process函数&&&&先进行参数验证,确保进程在进程链表中并且不是PROCESS_STATE_NONE状态,向所有进程发一个同步事件PROCESS_EVENT_EXITED,通知他们将要退出,让与该进程相关的进程进行相应处理。& & 用[1]中的一个例子:如果一个程序要退出的话,就会给etimer_process进程发送一个PROCESS_EVENT_EXITED事件,那么收到这个事件之后,etimer_process就会查找timerlist看看哪个timer是与这个进程相关的,就把它从timerlist中清除。//struct process *p 指要退出的进程
//struct process *fromprocess 指当前的进程 ?
//exit_process(p, p)
static void exit_process(struct process *p, struct process *fromprocess)
{
& & register struct process *q;
& & struct process *old_current = process_
& & PRINTF(&process: exit_process '%s'\n&, PROCESS_NAME_STRING(p));
& & /*参数验证:确保要退出的进程在进程链表中*/
& & for(q = process_ q != p && q != NULL; q = q-&next);
& & if(q == NULL)
& & {
& && &&&
& & }
& & if(process_is_running(p)) //return p-&state != PROCESS_STATE_NONE;
& & {
& && &&&p-&state = PROCESS_STATE_NONE;
& && &&&/*向所有进程发一个同步事件PROCESS_EVENT_EXITED,通知他们将要退出,使得与该进程相关的进程进行相应处理*/
& && &&&for(q = process_ q != NULL; q = q-&next)
& && &&&{
& && && && &if(p != q)
& && && && &{
& && && && && & call_process(q, PROCESS_EVENT_EXITED, (process_data_t)p);
& && && && &}
& && &&&}
& && &&&if(p-&thread != NULL && p != fromprocess) /*退出的进程不是当前进程*/
& && &&&{
& && && && &/* Post the exit event to the process that is about to exit. */
& && && && &process_current =
& && && && &p-&thread(&p-&pt, PROCESS_EVENT_EXIT, NULL); //给进程p传递一个PROCESS_EVENT_EXIT事件,通常用于退出死循环(如PROCESS_WAIT_EVENT函数),从而使其从主体函数退出
& && &&&}
& & }
& & /*将进程p从进程链表删除*/
& & if(p == process_list) //进程p恰好在进程链表首部
& & {
& && &&&process_list = process_list-&
& & }
& & else //进程p不在进程链表首部
& & {
& && &&&for(q = process_ q != NULL; q = q-&next) //遍历进程链表,寻找进程p,删除之
& && &&&{
& && && && &if(q-&next == p)
& && && && &{
& && && && && & q-&next = p-&
& && && && && &
& && && && &}
& && &&&}
& & }
& & process_current = old_
}复制代码参考资料:[1]贴子《》
Powered by 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
6LoWPAN与ZigBee+Pro适配系统的研究与开发
下载积分:1998
内容提示:
文档格式:PDF|
浏览次数:4|
上传日期: 13:04:54|
文档星级:
该用户还上传了这些文档
6LoWPAN与ZigBee+Pro适配系统的研究与开发.PDF
官方公共微信Zigduino开发板Contiki/Arduino/Zigbee/TinyOS/6LoWPAN开发利器
两个月内最低:一年内最低:
手机扫码拿到手价
未安装一淘客户端请扫码下载
手机购买享更多优惠
增值电信业务经营许可证:浙B2-
s003016.cm6&&&&0

我要回帖

更多关于 6lowpan协议栈 的文章

 

随机推荐