Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 

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