/* Includes ------------------------------------------------------------------*/ #include "main.h" /*定义信号量*/ OS_EVENT* ModbusReceived; /*接收到modbus请求报文*/ OS_EVENT* ModbusWriteFlash; /*接收到modbus写入Flash请求报文*/ OS_EVENT* ModbusConnect; /*已接收到modbus正确报文*/ /*定义任务栈*/ static OS_STK AppTaskStartStk[APP_TASK_START_STK_SIZE]; static OS_STK AppTaskModbusParseStk[APP_TASK_MODBUS_PARSE_STK_SIZE]; static OS_STK AppTaskModbusWriteFlashStk[APP_TASK_MODBUS_WRITE_FLASH_STK_SIZE]; static OS_STK AppTaskModbusConnectStk[APP_TASK_MODBUS_CONNECT_STK_SIZE]; /*定义任务主体函数*/ static void AppTaskStart (void *p_arg); void AppTaskModbusParse (void *p_arg); void AppTaskModbusWriteFlash(void *p_arg); static void AppTaskModbusConnect(void *p_arg); int main() { Sys_Config(); /* stm32系统初始化配置 */ ModbusHardwareInit(); /*外设初始化*/ OSInit(); /* uCOS系统初始化 */ /*创建初始启动任务*/ OSTaskCreateExt(AppTaskStart, /* task:任务入口函数 */ (void *)0, /* p_arg:传给任务的用户参数;不用时传 NULL */ (OS_STK *)&AppTaskStartStk[APP_TASK_START_STK_SIZE - 1], /* ptos:向低地址增长时的初始栈顶,使用数组高地址端 */ (INT8U )APP_TASK_START_PRIO, /* prio:唯一优先级,也是 II 管理任务时最常用的标识 */ (INT16U )APP_TASK_START_PRIO, /* id:用户任务编号;不参与调度,一般与任务优先级相同 */ (OS_STK *)&AppTaskStartStk[0], /* pbos:栈底;栈检查从此处识别未使用区域 */ (INT32U )APP_TASK_START_STK_SIZE, /* stk_size:OS_STK 元素个数,不是字节数。总大小为OS_STK大小(1/2/4字节) * 任务堆栈大小 */ (void *)0, /* pext:用户 TCB 扩展区指针;不用时传 NULL */ (INT16U )(OS_TASK_OPT_STK_CHK /* opt:允许栈使用量检查 */ | OS_TASK_OPT_STK_CLR)); /* 创建时清零栈,为检查提供已知填充值 */ OSStart(); /*启动操作系统,开始系统调度*/ } /*初始启动任务*/ void AppTaskStart(void *p_arg) { OS_CPU_SR cpu_sr; /*关中断前必须进行的操作*/ (void)p_arg; /*防止编译器警告*/ OS_CPU_SysTickInit(); /*配置滴答定时器*/ OS_ENTER_CRITICAL(); /* 关中断 */ /*创建信号量*/ ModbusReceived = OSSemCreate(0); ModbusWriteFlash = OSSemCreate(0); ModbusConnect = OSSemCreate(0); /*读取flash中的数据*/ ModbusRegReadFlash(); ModbusCoilReadFlash(); /* 创建modbus协议帧解析任务 */ OSTaskCreateExt(AppTaskModbusParse, (void *)0, (OS_STK *)&AppTaskModbusParseStk[APP_TASK_MODBUS_PARSE_STK_SIZE - 1], (INT8U )APP_TASK_MODBUS_PARSE_PRIO, (INT16U )APP_TASK_MODBUS_PARSE_PRIO, (OS_STK *)&AppTaskModbusParseStk[0], (INT32U )APP_TASK_MODBUS_PARSE_STK_SIZE, (void *)0, (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); /* 创建modbus线圈写入flash任务 */ OSTaskCreateExt(AppTaskModbusWriteFlash, (void *)0, (OS_STK *)&AppTaskModbusWriteFlashStk[APP_TASK_MODBUS_WRITE_FLASH_STK_SIZE - 1], (INT8U )APP_TASK_MODBUS_WRITE_FLASH_PRIO, (INT16U )APP_TASK_MODBUS_WRITE_FLASH_PRIO, (OS_STK *)&AppTaskModbusWriteFlashStk[0], (INT32U )APP_TASK_MODBUS_WRITE_FLASH_STK_SIZE, (void *)0, (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); /* 创建modbus判断连接断开任务 */ OSTaskCreateExt(AppTaskModbusConnect, (void *)0, (OS_STK *)&AppTaskModbusConnectStk[APP_TASK_MODBUS_CONNECT_STK_SIZE - 1], (INT8U )APP_TASK_MODBUS_CONNECT_PRIO, (INT16U )APP_TASK_MODBUS_CONNECT_PRIO, (OS_STK *)&AppTaskModbusConnectStk[0], (INT32U )APP_TASK_MODBUS_CONNECT_STK_SIZE, (void *)0, (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); OSTaskDel(OS_PRIO_SELF); /* 删除启动任务自身 */ OS_EXIT_CRITICAL(); /* 开中断 */ } static void AppTaskModbusConnect(void *p_arg) { OS_ERR err; while(1) { OSSemPend(ModbusConnect, (3 * OS_TICKS_PER_SEC), &err); /*正常接收*/ if(err == OS_ERR_NONE) { /*灭灯*/ GPIO_SetBits(GPIOF, GPIO_Pin_6); } /*超时未接收到,判断为连接断开*/ else { /*点灯*/ GPIO_ResetBits(GPIOF, GPIO_Pin_6); } } }