您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

127 行
5.1 KiB

  1. /* Includes ------------------------------------------------------------------*/
  2. #include "main.h"
  3. /*定义信号量*/
  4. OS_EVENT* ModbusReceived; /*接收到modbus请求报文*/
  5. OS_EVENT* ModbusWriteFlash; /*接收到modbus写入Flash请求报文*/
  6. OS_EVENT* ModbusConnect; /*已接收到modbus正确报文*/
  7. /*定义任务栈*/
  8. static OS_STK AppTaskStartStk[APP_TASK_START_STK_SIZE];
  9. static OS_STK AppTaskModbusParseStk[APP_TASK_MODBUS_PARSE_STK_SIZE];
  10. static OS_STK AppTaskModbusWriteFlashStk[APP_TASK_MODBUS_WRITE_FLASH_STK_SIZE];
  11. static OS_STK AppTaskModbusConnectStk[APP_TASK_MODBUS_CONNECT_STK_SIZE];
  12. /*定义任务主体函数*/
  13. static void AppTaskStart (void *p_arg);
  14. void AppTaskModbusParse (void *p_arg);
  15. void AppTaskModbusWriteFlash(void *p_arg);
  16. static void AppTaskModbusConnect(void *p_arg);
  17. int main()
  18. {
  19. Sys_Config(); /* stm32系统初始化配置 */
  20. ModbusHardwareInit(); /*外设初始化*/
  21. OSInit(); /* uCOS系统初始化 */
  22. /*创建初始启动任务*/
  23. OSTaskCreateExt(AppTaskStart, /* task:任务入口函数 */
  24. (void *)0, /* p_arg:传给任务的用户参数;不用时传 NULL */
  25. (OS_STK *)&AppTaskStartStk[APP_TASK_START_STK_SIZE - 1], /* ptos:向低地址增长时的初始栈顶,使用数组高地址端 */
  26. (INT8U )APP_TASK_START_PRIO, /* prio:唯一优先级,也是 II 管理任务时最常用的标识 */
  27. (INT16U )APP_TASK_START_PRIO, /* id:用户任务编号;不参与调度,一般与任务优先级相同 */
  28. (OS_STK *)&AppTaskStartStk[0], /* pbos:栈底;栈检查从此处识别未使用区域 */
  29. (INT32U )APP_TASK_START_STK_SIZE, /* stk_size:OS_STK 元素个数,不是字节数。总大小为OS_STK大小(1/2/4字节) * 任务堆栈大小 */
  30. (void *)0, /* pext:用户 TCB 扩展区指针;不用时传 NULL */
  31. (INT16U )(OS_TASK_OPT_STK_CHK /* opt:允许栈使用量检查 */
  32. | OS_TASK_OPT_STK_CLR)); /* 创建时清零栈,为检查提供已知填充值 */
  33. OSStart(); /*启动操作系统,开始系统调度*/
  34. }
  35. /*初始启动任务*/
  36. void AppTaskStart(void *p_arg)
  37. {
  38. OS_CPU_SR cpu_sr; /*关中断前必须进行的操作*/
  39. (void)p_arg; /*防止编译器警告*/
  40. OS_CPU_SysTickInit(); /*配置滴答定时器*/
  41. OS_ENTER_CRITICAL(); /* 关中断 */
  42. /*创建信号量*/
  43. ModbusReceived = OSSemCreate(0);
  44. ModbusWriteFlash = OSSemCreate(0);
  45. ModbusConnect = OSSemCreate(0);
  46. /*读取flash中的数据*/
  47. ModbusRegReadFlash();
  48. ModbusCoilReadFlash();
  49. /* 创建modbus协议帧解析任务 */
  50. OSTaskCreateExt(AppTaskModbusParse,
  51. (void *)0,
  52. (OS_STK *)&AppTaskModbusParseStk[APP_TASK_MODBUS_PARSE_STK_SIZE - 1],
  53. (INT8U )APP_TASK_MODBUS_PARSE_PRIO,
  54. (INT16U )APP_TASK_MODBUS_PARSE_PRIO,
  55. (OS_STK *)&AppTaskModbusParseStk[0],
  56. (INT32U )APP_TASK_MODBUS_PARSE_STK_SIZE,
  57. (void *)0,
  58. (INT16U )(OS_TASK_OPT_STK_CHK
  59. | OS_TASK_OPT_STK_CLR));
  60. /* 创建modbus线圈写入flash任务 */
  61. OSTaskCreateExt(AppTaskModbusWriteFlash,
  62. (void *)0,
  63. (OS_STK *)&AppTaskModbusWriteFlashStk[APP_TASK_MODBUS_WRITE_FLASH_STK_SIZE - 1],
  64. (INT8U )APP_TASK_MODBUS_WRITE_FLASH_PRIO,
  65. (INT16U )APP_TASK_MODBUS_WRITE_FLASH_PRIO,
  66. (OS_STK *)&AppTaskModbusWriteFlashStk[0],
  67. (INT32U )APP_TASK_MODBUS_WRITE_FLASH_STK_SIZE,
  68. (void *)0,
  69. (INT16U )(OS_TASK_OPT_STK_CHK
  70. | OS_TASK_OPT_STK_CLR));
  71. /* 创建modbus判断连接断开任务 */
  72. OSTaskCreateExt(AppTaskModbusConnect,
  73. (void *)0,
  74. (OS_STK *)&AppTaskModbusConnectStk[APP_TASK_MODBUS_CONNECT_STK_SIZE - 1],
  75. (INT8U )APP_TASK_MODBUS_CONNECT_PRIO,
  76. (INT16U )APP_TASK_MODBUS_CONNECT_PRIO,
  77. (OS_STK *)&AppTaskModbusConnectStk[0],
  78. (INT32U )APP_TASK_MODBUS_CONNECT_STK_SIZE,
  79. (void *)0,
  80. (INT16U )(OS_TASK_OPT_STK_CHK
  81. | OS_TASK_OPT_STK_CLR));
  82. OSTaskDel(OS_PRIO_SELF); /* 删除启动任务自身 */
  83. OS_EXIT_CRITICAL(); /* 开中断 */
  84. }
  85. static void AppTaskModbusConnect(void *p_arg)
  86. {
  87. OS_ERR err;
  88. while(1)
  89. {
  90. OSSemPend(ModbusConnect, (3 * OS_TICKS_PER_SEC), &err);
  91. /*正常接收*/
  92. if(err == OS_ERR_NONE)
  93. {
  94. /*灭灯*/
  95. GPIO_SetBits(GPIOF, GPIO_Pin_6);
  96. }
  97. /*超时未接收到,判断为连接断开*/
  98. else
  99. {
  100. /*点灯*/
  101. GPIO_ResetBits(GPIOF, GPIO_Pin_6);
  102. }
  103. }
  104. }