(八)Z-Stack 添加自己任务
来源:互联网 发布:域名注册不用实名 编辑:程序博客网 时间:2024/05/16 11:00
{
OSALTaskId = taskId;
{
#define TEST_EVENT_EVT 0x0001 //测试事件触发与停止 事件二
{
(2)制定超时定时器的响应功能函数
{
HalLcdPutString16_8(0, 0, " Test Timer ", 12, 1);
debug_str( "respond TEST_TIMER_EVT event!\r\n");
osal_start_timerEx( OSALTaskId, TEST_TIMER_EVT, 3000 );//重新开启一个超时事件
return events ^ TEST_TIMER_EVT;
}
osal_stOP_timerEx(.....)
z 往内存块中存放事件值与指针
z 调用 osal_msg_send 向指定的任务发送信息
if( ptr != NULL )
{
msgCt ++;
ptr->events = MSG_SD_AND_RV;
ptr->msg = &msgCt;
osal_msg_send( OSALTaskId, (void *)ptr );
}
{
ptr = ( MSGS *)osal_msg_receive( OSALTaskId );
while( ptr )
{
switch( ptr->events )
{
case MSG_SD_AND_RV:
val = *ptr->msg;
bPtr[9] = val/100 + '0';
temp = val%100;
bPtr[10] = temp/10 + '0';
bPtr[11] = temp%10 + '0';
HalLcdPutString16_8(0, 0, bPtr, 12, 1);//显示记数
break;
}
osal_msg_deallocate( (uint8 *)ptr );//册除已经使用并分配的缓存区
ptr = ( MSGS *)osal_msg_receive( OSALTaskId ); //一次性收完所有需要接收的数据,也可以不一次接受
}
return (events ^ SYS_EVENT_MSG);//清除当前事件位
}
1.用户自己设计的任务代码在Zstack中的调用过程
(1).main() 执行(在ZMain.c中)
main() ---> osal_init_system()
(2). osal_init_system()调用osalInitTasks(), (在OSAL.c中)
osal_init_system() ---> osalInitTasks()
(3). osalInitTasks()调用SampleApp_Init() , (在OSAL_SampleApp.c中)
osalInitTasks() ---> SampleApp_Init()
在osalInitTasks()中实现了多个任务初始化的设置,其中macTaskInit( taskID++ )到ZDApp_Init( taskID++ )的几行代码表示对于几个系统运行初始化任务的调用,而用户自己实现的SampleApp_Init()在最后,这里taskID随着任务的增加也随之递增.所以用户自己实现的任务的初始化操作应该在osalInitTasks()中增加.
void osalInitTasks( void )
{
uint8 taskID = 0;
//这里很重要, 调用osal_mem_alloc()为当前OSAL中的各任务分配存储空间(实际上是一个任//务数组),并用tasksEvents指向该任务数组(任务队列).
tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt)); //将taskSEvents所指向的空间清零
macTaskInit( taskID++ );
nwk_init( taskID++ );
Hal_Init( taskID++ );
#if defined( MT_TASK )
MT_TaskInit( taskID++ );
#endif
APS_Init( taskID++ );
ZDApp_Init( taskID++ );
SampleApp_Init( taskID ); //用户自己需要添加的任务
}
2.任务处理调用的重要数据结构
这里要解释一下,在Zstack里,对于同一个任务可能有多种事件发生,那么需要执行不同的事件处理,为了方便,对于每个任务的事件处理函数都统一在一个事件处理函数中实现,然后根据任务的ID号(task_id)和该任务的具体事件(events)调用某个任务的事件处理函数,进入了该任务的事件处理函数之后,再根据events再来判别是该任务的哪一种事件发生,进而执行相应的事件处理.pTaskEventHandlerFn 是一个指向函数(事件处理函数)的指针,这里实现的每一个数组元素各对应于一个任务的事件处理函数,比如SampleApp_ProcessEvent对于用户自行实现的事件处理函数uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events ),所以这里如果我们实现了一个任务,还需要把实现的该任务的事件处理函数在这里添加.
const pTaskEventHandlerFn tasksArr[] = {
macEventLoop,
nwk_event_loop,
Hal_ProcessEvent,
#if defined( MT_TASK )
MT_ProcessEvent,
#endif
APS_event_loop,
ZDApp_event_loop,
SampleApp_ProcessEvent
};
//计算出任务的数量
const uint8 tasksCnt = sizeof( tasksArr ) / sizeof( tasksArr[0] );
uint16 *tasksEvents;
3. 对于不同事件发生后的任务处理函数的调用
osal_start_system() 很重要,决定了当某个任务的事件发生后调用对应的事件处理函数
void osal_start_system(void)
{
#if !defined ( ZBIT )
for(;;) // Forever Loop
#endif
{
//这里是轮训任务队列,并检查是否有某个任务的事件发生
- (八)Z-Stack 添加自己任务
- Z-stack中OSAL任务机制分析
- Z-stack中OSAL任务机制分析
- 自己对Z-stack的架构一些理解(仅作学习笔记,有错误希望大家能指出来,初学Z-Stack菜鸟一只)
- 深入浅出Z-Stack OSAL多任务资源分配机制
- 深入浅出Z-Stack OSAL多任务资源分配机制
- 深入浅出Z-Stack 2006 OSAL多任务资源分配机制
- 深入浅出Z-Stack 2006 OSAL多任务资源分配机制
- TI Z-stack协议栈学习-添加新任务
- TI Z-stack协议栈学习-添加新任务
- Z-Stack Compile Options (编译选项)
- (四)Z-Stack 软件架构分析
- u8g2 SSD1306(I2C) for Z-Stack
- ZigBee协议栈(3)-- Z-Stack寻址(Addressing in z-stack)
- Z-Stack中路由表的大小(Design Notes:Z-Stack routing table size)
- 在Z-Stack代码中使用常量(Using Constants in Code with Z-stack)
- 创建Z-Stack项目的工具(Create Z-Stack Project For IAR)
- 创建Zigbee Z-Stack 3.0.1 BSP(二)--Z-Stack协议栈目录结构
- Elasticsearch Java虚拟机配置详解
- 初探Oracle:表的管理命令简单介绍
- POJ1125——Stockbroker Grapevine
- 一些国外优秀的elasticsearch使用案例
- 二分法查找
- (八)Z-Stack 添加自己任务
- 第十一周项目4-特殊三位数
- C#中实现byte[]与任意对象互换(服务端通讯专用)
- makefile 总结
- 用VS2010创建三层架构开发模式及三层架构的研究
- C++创建对象的两种方法(C++用new和不用new创建类对象)
- spring mvc注解方式实现向导式跳转页面
- 《NoSQL精粹》读后感(一)
- [Unity3D]蓝港面试题