diff --git a/app/main.c b/app/main.c index bba3e03..789bc14 100644 --- a/app/main.c +++ b/app/main.c @@ -1,10 +1,87 @@ /* Includes ------------------------------------------------------------------*/ #include "main.h" +/*定义信号量*/ +OS_EVENT* ModbusReceived; /*接收到modbus请求报文*/ +OS_EVENT* ModbusAssembled; /*modbus响应帧组装完成*/ + +/*定义任务栈*/ +static OS_STK AppTaskStartStk[APP_TASK_START_STK_SIZE]; +static OS_STK AppTaskModbusParseStk[APP_TASK_MODBUS_PARSE_STK_SIZE]; +static OS_STK AppTaskModbusSendStk[APP_TASK_MODBUS_SEND_STK_SIZE]; + +/*定义任务主体函数*/ +void AppTaskStart (void *p_arg); +void AppTaskModbusParse (void *p_arg); +void AppTaskModbusSend (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); + ModbusAssembled = OSSemCreate(0); + + /* 创建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响应帧发送任务 */ + OSTaskCreateExt(AppTaskModbusSend, + (void *)0, + (OS_STK *)&AppTaskModbusSendStk[APP_TASK_MODBUS_SEND_STK_SIZE - 1], + (INT8U )APP_TASK_MODBUS_SEND_PRIO, + (INT16U )APP_TASK_MODBUS_SEND_PRIO, + (OS_STK *)&AppTaskModbusSendStk[0], + (INT32U )APP_TASK_MODBUS_SEND_STK_SIZE, + (void *)0, + (INT16U )(OS_TASK_OPT_STK_CHK + | OS_TASK_OPT_STK_CLR)); + + OSTaskDel(OS_PRIO_SELF); /* 删除启动任务自身 */ + + OS_EXIT_CRITICAL(); /* 关中断 */ +} + diff --git a/app/main.h b/app/main.h index 2c7c5f2..81b847a 100644 --- a/app/main.h +++ b/app/main.h @@ -9,6 +9,7 @@ #include "os.h" #include "app_cfg.h" #include "sys_cfg.h" +#include "modbus.h"