文章目录
ZStack+IAR 任务的创建、串口编程
1.任务的创建
1.更改模板工程
- 更改一下两个目录内的文件名称为你自己的工程名称
- 在以下文件中,将所有的的
GenericApp
换成你的工程名称,将所有的GENERICAPP
替换成你的工程名称的大写
2.创建自己的任务
1.创建文件并添加到工程中
- 创建自己的
.c
和.h
文件,然后添加到工程中
2.编写文件
-
.h文件
#ifndef __MYMINITASK_H__ #define __MYMINITASK_H__ #include "ZComDef.h" #define EVENT_FLAG_TIMEOUT (1<<0) #define TIMEOUTVALUE 1000 extern void MyMiniTaskInit(byte taskId); extern UINT16 MyMiniTaskProssEvent(byte taskId, UINT16 events); #endif
-
.c文件
#include "MyMiniTask.h" #include "OSAL.h" #include "ZComDef.h" #include "hal_uart.h" #include "stdio.h" byte myMiniTaskId; static void MyMiniTaskSerialCallBack(uint8 portNumber, uint8 events); static bool isTimerRunning = TRUE; void MyMiniTaskInit(byte taskId) { halUARTCfg_t uartCfg; //根据大课讲义添加代码对uartCfg进行初始化:波特率115200,没有流控,指定串口接收回调MyMiniTaskSerialCallBack uartCfg.baudRate = HAL_UART_BR_115200; uartCfg.flowControl = false; uartCfg.callBackFunc = MyMiniTaskSerialCallBack; myMiniTaskId = taskId; if (HalUARTOpen(0, &uartCfg) == ZSUCCESS) { HalUARTWrite(0, "Uart0 is opened\r\n", osal_strlen("Uart0 is opened\r\n")); if (ZSUCCESS == osal_start_timerEx(taskId, EVENT_FLAG_TIMEOUT, TIMEOUTVALUE)) { //添加启动定时器:溢出时的事件标志为EVENT_FLAG_TIMEOUT,定时时间间隔为TIMEOUTVALUE,已在任务的头文件中定义 char buffer[100]; sprintf(buffer, "A timer(EVENT_FLAG=0x%x,Time out value=%dms) is started!\r\n", EVENT_FLAG_TIMEOUT, TIMEOUTVALUE); //添加串口发送语句:向串口0发送buffer中的内容 } } } UINT16 MyMiniTaskProssEvent(byte taskId, UINT16 events) { (void)taskId; if (events & EVENT_FLAG_TIMEOUT) { //添加表达式判断是否发生了定时器溢出 HalUARTWrite(0, "Hello,world\r\n", osal_strlen("Hello,world\r\n")); if (TRUE == isTimerRunning) osal_start_timerEx(myMiniTaskId, EVENT_FLAG_TIMEOUT, TIMEOUTVALUE); else HalUARTWrite(0, "Timer is stoped!\r\n", osal_strlen("Timer is stoped!\r\n")); return events ^ EVENT_FLAG_TIMEOUT; } return 0; } void MyMiniTaskSerialCallBack(uint8 portNumber, uint8 events) { if (portNumber == 0) { if ((events & HAL_UART_RX_TIMEOUT) || (events & HAL_UART_RX_ABOUT_FULL) || (events & HAL_UART_RX_FULL)) { char buffer[51]; char count = HalUARTRead(0, buffer, 51); ; //添加读串口的代码 if (count > 0) { if (buffer[0] == 0) isTimerRunning = FALSE; else { isTimerRunning = TRUE; osal_start_timerEx(myMiniTaskId, EVENT_FLAG_TIMEOUT, TIMEOUTVALUE); } } } } }
3.将初始化函数和事件放到OSAL
文件中
-
添加头文件
#include "ZComDef.h" #include "hal_drivers.h" #include "OSAL.h" #include "OSAL_Tasks.h" #include "MyMiniTask.h"//自己定义的.h文件 #if defined ( MT_TASK )
-
添加事件函数
// The order in this table must be identical to the task initialization calls below in osalInitTask. const pTaskEventHandlerFn tasksArr[] = { macEventLoop, nwk_event_loop, Hal_ProcessEvent, MyMiniTaskProssEvent,//自己定义的事件处理函数 #if defined( MT_TASK )
-
初始化函数
void osalInitTasks( void ) { uint8 taskID = 0; tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt); osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt)); macTaskInit( taskID++ ); nwk_init( taskID++ ); Hal_Init( taskID++ ); MyMiniTaskInit(taskID++);//自己定义的初始化函数 #if defined( MT_TASK )
2.串口编程
-
初始化函数
- 初始化串口
halUARTCfg_t uartCfg; //串口配置变量 uartCfg.baudRate = HAL_UART_BR_115200; //波特率设置为115200 uartCfg.flowControl = false; //关闭控制流 uartCfg.callBackFunc = MyMiniTaskSerialCallBack; //回调函数,用于接收数据 HalUARTOpen(0, &uartCfg); //打开串口0
osal_start_timerEx(taskId, EVENT_FLAG_TIMEOUT, TIMEOUTVALUE)//开启定时器
// 初始化函数 void MyMiniTaskInit(byte taskId) { myMiniTaskId = taskId; halUARTCfg_t uartCfg; //串口配置变量 uartCfg.baudRate = HAL_UART_BR_115200; //波特率设置为115200 uartCfg.flowControl = false; //关闭控制流 uartCfg.callBackFunc = MyMiniTaskSerialCallBack; //回调函数,用于接收数据 if (HalUARTOpen(0, &uartCfg) == ZSUCCESS) { HalUARTWrite(0, "Uart0 is opened\r\n", osal_strlen("Uart0 is opened\r\n"));//往串口中输出 if (ZSUCCESS == osal_start_timerEx(taskId, EVENT_FLAG_TIMEOUT, TIMEOUTVALUE)) { //添加启动定时器:溢出时的事件标志为EVENT_FLAG_TIMEOUT,定时时间间隔为TIMEOUTVALUE,已在任务的头文件中定义 char buffer[100]; // 如果定时器开启成功,就执行以下 sprintf(buffer, "A timer(EVENT_FLAG=0x%x,Time out value=%dms) is started!\r\n", EVENT_FLAG_TIMEOUT, TIMEOUTVALUE); } } }
-
事件处理函数
// 事件处理函数 UINT16 MyMiniTaskProssEvent(byte taskId, UINT16 events) { (void)taskId; if (events & EVENT_FLAG_TIMEOUT)// 判断是否溢出 { osal_start_timerEx(myMiniTaskId, EVENT_FLAG_TIMEOUT, TIMEOUTVALUE);//重新开启定时器 return events ^ EVENT_FLAG_TIMEOUT; } return 0; }
-
串口回调函数
// 串口回调函数 void MyMiniTaskSerialCallBack(uint8 portNumber, uint8 events) { if (portNumber == 0) { if ((events & HAL_UART_RX_TIMEOUT) || (events & HAL_UART_RX_ABOUT_FULL) || (events & HAL_UART_RX_FULL)) { char buffer[51]; char count = HalUARTRead(0, buffer, 51); //添加读串口的代码 if (count > 0) { if (buffer[0] == 0) isTimerRunning = FALSE;//定时器设置为关闭,在下一个定时器的时候不会再重新启动了 else { isTimerRunning = TRUE; osal_start_timerEx(myMiniTaskId, EVENT_FLAG_TIMEOUT, TIMEOUTVALUE);//重新开启定时器 } } } }
3.注意事项
-
下载了跟没下一样,要选择
Texas Instruments