2) OS_CPU_C.C文件。在OS_CPU_C.C定义的C函数中,OSTaskStkInit()函数与处理器相关,所以移植代码需要修改该函数。其程序为(初始化任务时调用此函数初始化任务使用的堆栈)。
OS_STK * OSTaskStkInit (void (*task) (void
*p_arg),void *p_arg,OS_STK *ptos,INT16U opt)
{
OS_STK *stk;
(void) opt; //防止编译警告
stk=ptos; //装载栈顶指针, 即堆栈数组最后的地址模拟中断发生的堆栈情况
*(stk)=(INT32U)0x01000000L; //xPSR
*(stk)=(INT32U)task; //PC, 任务入口
*(stk)=(INT32U)0xFFFFFFFEL; //R14(LR)
*(stk)=(INT32U)0x12121212L; //R12
*(stk)=(INT32U)0x03030303L; //R3
*(stk)=(INT32U)0x02020202L; //R2
*(stk)=(INT32U)0x01010101L; //R1
* (stk) =(INT32U)p_arg; //R0, 输入参数p_arg 模拟任务进程, 保存其他寄存器到堆栈
*(stk)=(INT32U)0x11111111L; //R11
*(stk)=(INT32U)0x10101010L; //R10
*(stk)=(INT32U)0x09090909L; //R9
*(stk)=(INT32U)0x08080808L; //R8
*(stk)=(INT32U)0x07070707L; //R7
*(stk)=(INT32U)0x06060606L; //R6
*(stk)=(INT32U)0x05050505L; //R5
*(stk)=(INT32U)0x04040404L; /R4
return(stk);
}
3) OS_CPU_A.ASM 文件。μC/OSII 的移植需要编写5 个简单的汇编语言函数。
OS_ENTER _CRITICAL (): 关闭中断源;
OS_EXIT_CRITICAL (): 重开中断源;
OSStartHighRdy (): 运行当前优先级最高的任务;
OSCtxSw (): 一个任务放弃CPU 使用权时调用;
OSIntCtxSw (): 在退出中断服务函数OSIntExit() 中被调用, 实现中断级任务切换。
LPC1758使用OSPendSV()函数快捷地进行上下文切换。OSPendSV()的C语言表述程序为OSPendSV: 关中断;
if (PSP ! =NULL)
{
//保存R4~R11 到任务堆栈SP_process;
OSTCBCur>OSTCBStkPtr = SP_process;
}
OSTaskSwHook ();
OSPrioCur = OSPrioHighRdy;
OSTCBCur = OSTCBHighRdy;
PSP = OSTCBHighRdy>OSTCBStkPtr;
//从新任务堆栈中恢复R4~R11;
/恢复中断;
//异常返回;
完成上述工作后, 只要再根据目标板的实际情况编写Target 目录中的3 个文件, μC/OSII 就可以运行在处理器上了。
3 重点解决数字显示模块的组网问题
1) 角色介绍。ZigBee 标准网络定义了3 种角色, 分别是协作员、路由和端节点。
协作员(coordinator) 负责启动整个网络, 它是网络的第一个设备, 协作员选择一个信道和一个网络ID, 随后就可以启动网络。
路由(router) 的功能是允许其他设备加入网络, 协助网络中其他终端设备通信。
端节点(end device) 没有特定的维持网络结构的责任, 它可以选择睡眠或唤醒两种工作状态, 功耗小, 可使用电池供电。
2) 网络拓扑。ZigBee 网络有星型网、簇型网和网状网3 种组网方式(见图3)。如果直接使用IEEE 802.15.4 底层的还有点对点模式和点对多点模式两种组网方式(见图4)。
智能家居系统综合运用了星型网和点对多点模式的组网方式。由坞站作为路由, 负责管理整个家居系统构建的ZigBee 网络, 其他低功耗无线传感器、无线控制设备和数字显示终端作为端节点。其中低功耗无线传感器、数字显示终端与坞站采用星型网组网方式, 数字显示终端和无线控制设备采用点对多模式(见图5)。
4 结束语
数字显示终端通过采用ZigBee 技术和USB OTG技术, 实现了室内低功耗无线设备的稳定监控和数据采集及存储, 并以友好的用户界面和便携性能改进了智能家居系统和用户的交流方式, 使用户能更加方便地监控到家用低功耗无线设备的工作状态和查询抄表数据。