|
- /* 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);
-
- //extern uint8_t ModbusCoil[1250]; /*10000/8=1250*/
- //extern uint16_t ModbusReg[10000];
-
-
- 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();
-
- //memset(ModbusCoil, 0, sizeof(ModbusCoil));
- //memset(ModbusReg, 0, sizeof(ModbusReg));
-
-
- /* 创建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(); /* 开中断 */
- }
-
- /*判断modbus是否连接任务*/
- 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);
- }
- }
- }
|