main.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. #include "gd32f4xx_libopt.h"
  2. #include "bsp_enet.h"
  3. #include "bsp_print.h"
  4. #include "bsp_flash.h"
  5. #include "bsp_rtc.h"
  6. #include "bsp_cas.h"
  7. #include "bsp_ctrl.h"
  8. #include "bsp_sensor.h"
  9. #include "bsp_lcd.h"
  10. #include "bsp_watchdog.h"
  11. #include "systick.h"
  12. #include "FreeRTOS.h"
  13. #include "task.h"
  14. #include "arch/netconf.h"
  15. #include "semphr.h"
  16. #include "lfs_file.h"
  17. #include "modbus.h"
  18. #include "power.h"
  19. #include "snmp.h"
  20. #include "paras.h"
  21. #include "sensor.h"
  22. #include "beep.h"
  23. #include "cascade.h"
  24. #include "web.h"
  25. #include "menu.h"
  26. #include "event_groups.h"
  27. typedef uint8_t u8;
  28. #define START_TASK_PRIO 4
  29. #define START_STK_SIZE 256
  30. TCM_DATA static StackType_t START_Task_Stack[START_STK_SIZE];
  31. TCM_DATA static StaticTask_t START_Task_TCB;
  32. TaskHandle_t StartTask_Handler;
  33. void start_task(void *pvParameters);
  34. #define LWIP_DMEO_TASK_PRIO 5
  35. #define LWIP_DMEO_STK_SIZE 2048
  36. TaskHandle_t LWIP_Task_Handler;
  37. TCM_DATA static StackType_t LWIP_Task_Stack[LWIP_DMEO_STK_SIZE];
  38. TCM_DATA static StaticTask_t LWIP_Task_TCB;
  39. void lwip_demo_task(void *pvParameters);
  40. #define CASCADE_TASK_PRIO 6
  41. #define CASCADE_STK_SIZE 1024
  42. TaskHandle_t CASCADE_Task_Handler;
  43. TCM_DATA static StackType_t CASCADE_Task_Stack[CASCADE_STK_SIZE];
  44. TCM_DATA static StaticTask_t CASCADE_Task_TCB;
  45. void cascade_query_task(void *pvParameters);
  46. #define CASCADE_SCAN_PRIO 6
  47. #define CASCADE_SCAN_STK_SIZE 512
  48. TaskHandle_t CASCADE_SCAN_Task_Handler;
  49. TCM_DATA static StackType_t CASCADE_SCAN_Task_Stack[CASCADE_SCAN_STK_SIZE];
  50. TCM_DATA static StaticTask_t CASCADE_SCAN_Task_TCB;
  51. void cascade_scan_task(void *pvParameters);
  52. #define POWER_STK_SIZE 1024
  53. #define POWER_TASK_PRIO 6
  54. TaskHandle_t POWER_Task_Handler;
  55. TCM_DATA static StackType_t POWER_Task_Stack[POWER_STK_SIZE];
  56. TCM_DATA static StaticTask_t POWER_Task_TCB;
  57. void power_demo_task(void *pvParameters);
  58. #define SENSOR_STK_SIZE 1024
  59. #define SENSOR_TASK_PRIO 8
  60. TaskHandle_t SENSOR_Task_Handler;
  61. TCM_DATA static StackType_t SENSOR_Task_Stack[SENSOR_STK_SIZE];
  62. TCM_DATA static StaticTask_t SENSOR_Task_TCB;
  63. void sensor_task(void *pvParameters);
  64. #define LCD_STK_SIZE 2048
  65. #define LCD_TASK_PRIO 7
  66. TaskHandle_t LCD_Task_Handler;
  67. TCM_DATA static StackType_t LCD_Task_Stack[LCD_STK_SIZE];
  68. TCM_DATA static StaticTask_t LCD_Task_TCB;
  69. void lcd_task(void *pvParameters);
  70. #define WEB_STK_SIZE 2048
  71. #define WEB_TASK_PRIO 5
  72. TaskHandle_t WEB_Task_Handler;
  73. TCM_DATA static StackType_t WEB_Task_Stack[WEB_STK_SIZE];
  74. TCM_DATA static StaticTask_t WEB_Task_TCB;
  75. void web_task(void *pvParameters);
  76. #define DEFAULT_DOG 0X3F
  77. __IO uint32_t ini_flag = 0;
  78. __IO uint32_t cascade_flag = 0;
  79. __IO uint32_t lcd_init_flag = 0;
  80. #define TASK_WEB_BIT (1 << 0)
  81. #define TASK_SENSOR_BIT (1 << 1)
  82. #define TASK_CASCADE_SCAN_BIT (1 << 2)
  83. #define TASK_CASCADE_QUERY_BIT (1 << 3)
  84. #define TASK_LCD_BIT (1 << 4)
  85. #define TASK_POWER_BIT (1 << 5)
  86. #define ALL_TASKS_BITS (TASK_WEB_BIT | TASK_SENSOR_BIT | TASK_CASCADE_SCAN_BIT | TASK_CASCADE_QUERY_BIT | TASK_LCD_BIT | TASK_POWER_BIT)
  87. EventGroupHandle_t xWatchdogEventGroup;
  88. int main(void)
  89. {
  90. __IO int i = 0;
  91. nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
  92. systick_config();
  93. bsp_print_init(115200);
  94. bsp_rtc_init();
  95. bsp_ctrl_init();
  96. bsp_sensor_init();
  97. bsp_lcd_init();
  98. enet_phy_init();
  99. W25qxx_Init();
  100. bsp_watchdog_init();
  101. /* start_taskÈÎÎñ */
  102. StartTask_Handler = xTaskCreateStatic( (TaskFunction_t )start_task,
  103. (const char* )"start_task",
  104. (uint16_t )START_STK_SIZE,
  105. (void* )NULL,
  106. (UBaseType_t )START_TASK_PRIO,
  107. (StackType_t *)START_Task_Stack,
  108. (StaticTask_t *)&START_Task_TCB);
  109. vTaskStartScheduler(); /* ¿ªÆôÈÎÎñµ÷¶È */
  110. while(1)
  111. {
  112. i ++;
  113. }
  114. return 0;
  115. }
  116. void start_task(void *pvParameters)
  117. {
  118. taskENTER_CRITICAL();
  119. xWatchdogEventGroup = xEventGroupCreate();
  120. POWER_Task_Handler = xTaskCreateStatic( (TaskFunction_t )power_demo_task,
  121. (const char* )"power_demo_task",
  122. (uint16_t )POWER_STK_SIZE,
  123. (void* )NULL,
  124. (UBaseType_t )POWER_TASK_PRIO,
  125. (StackType_t *)POWER_Task_Stack,
  126. (StaticTask_t *)&POWER_Task_TCB);
  127. LWIP_Task_Handler = xTaskCreateStatic( (TaskFunction_t )lwip_demo_task,
  128. (const char* )"lwip",
  129. (uint16_t )LWIP_DMEO_STK_SIZE,
  130. (void* )NULL,
  131. (UBaseType_t )LWIP_DMEO_TASK_PRIO,
  132. (StackType_t *)LWIP_Task_Stack,
  133. (StaticTask_t *)&LWIP_Task_TCB);
  134. CASCADE_Task_Handler = xTaskCreateStatic( (TaskFunction_t )cascade_query_task,
  135. (const char* )"cascade_query_task",
  136. (uint16_t )CASCADE_STK_SIZE,
  137. (void* )NULL,
  138. (UBaseType_t )CASCADE_TASK_PRIO,
  139. (StackType_t *)CASCADE_Task_Stack,
  140. (StaticTask_t *)&CASCADE_Task_TCB);
  141. CASCADE_SCAN_Task_Handler = xTaskCreateStatic( (TaskFunction_t )cascade_scan_task,
  142. (const char* )"cascad_scan_task",
  143. (uint16_t )CASCADE_SCAN_STK_SIZE,
  144. (void* )NULL,
  145. (UBaseType_t )CASCADE_SCAN_PRIO,
  146. (StackType_t *)CASCADE_SCAN_Task_Stack,
  147. (StaticTask_t *)&CASCADE_SCAN_Task_TCB);
  148. LCD_Task_Handler = xTaskCreateStatic( (TaskFunction_t )lcd_task,
  149. (const char* )"lcd_task",
  150. (uint16_t )LCD_STK_SIZE,
  151. (void* )NULL,
  152. (UBaseType_t )LCD_TASK_PRIO,
  153. (StackType_t *)LCD_Task_Stack,
  154. (StaticTask_t *)&LCD_Task_TCB);
  155. WEB_Task_Handler = xTaskCreateStatic( (TaskFunction_t )web_task,
  156. (const char* )"web_task",
  157. (uint16_t )WEB_STK_SIZE,
  158. (void* )NULL,
  159. (UBaseType_t )WEB_TASK_PRIO,
  160. (StackType_t *)WEB_Task_Stack,
  161. (StaticTask_t *)&WEB_Task_TCB);
  162. SENSOR_Task_Handler = xTaskCreateStatic( (TaskFunction_t )sensor_task,
  163. (const char* )"sensor_task",
  164. (uint16_t )SENSOR_STK_SIZE,
  165. (void* )NULL,
  166. (UBaseType_t )SENSOR_TASK_PRIO,
  167. (StackType_t *)SENSOR_Task_Stack,
  168. (StaticTask_t *)&SENSOR_Task_TCB);
  169. vTaskDelete(StartTask_Handler);
  170. taskEXIT_CRITICAL();
  171. }
  172. void web_task(void *pvParameters)
  173. {
  174. while(ini_flag == 0)
  175. {
  176. vTaskDelay(10);
  177. }
  178. web_init();
  179. web_query();
  180. vTaskDelete( WEB_Task_Handler );
  181. }
  182. void lcd_task(void *pvParameters)
  183. {
  184. while(ini_flag == 0)
  185. {
  186. vTaskDelay(10);
  187. }
  188. menu_init();
  189. lcd_init_flag = 1;
  190. int i = 0;
  191. while(1)
  192. {
  193. menu_handle();
  194. xEventGroupSetBits(xWatchdogEventGroup, TASK_LCD_BIT);
  195. vTaskDelay(100);
  196. }
  197. vTaskDelete(LCD_Task_Handler);
  198. }
  199. void sensor_task(void *pvParameters)
  200. {
  201. while(ini_flag == 0 || lcd_init_flag == 0)
  202. {
  203. vTaskDelay(10);
  204. }
  205. sensor_init();
  206. while(1)
  207. {
  208. sensor_query();
  209. xEventGroupSetBits(xWatchdogEventGroup, TASK_SENSOR_BIT);
  210. vTaskDelay(1000);
  211. }
  212. vTaskDelete(SENSOR_Task_Handler);
  213. }
  214. void cascade_scan_task(void *pvParameters)
  215. {
  216. while(ini_flag == 0 || cascade_flag == 0)
  217. {
  218. vTaskDelay(10);
  219. }
  220. while(1)
  221. {
  222. cas_scan_query();
  223. xEventGroupSetBits(xWatchdogEventGroup, TASK_CASCADE_SCAN_BIT);
  224. vTaskDelay(1000);
  225. }
  226. vTaskDelete(CASCADE_SCAN_Task_Handler);
  227. }
  228. void cascade_query_task(void *pvParameters)
  229. {
  230. while(ini_flag == 0)
  231. {
  232. vTaskDelay(10);
  233. }
  234. cascade_init();
  235. cascade_flag = 1;
  236. while(1)
  237. {
  238. cas_query();
  239. xEventGroupSetBits(xWatchdogEventGroup, TASK_CASCADE_QUERY_BIT);
  240. vTaskDelay(10);
  241. }
  242. vTaskDelete(CASCADE_Task_Handler);
  243. }
  244. void power_demo_task(void *pvParameters)
  245. {
  246. while(ini_flag == 0 || lcd_init_flag == 0)
  247. {
  248. vTaskDelay(10);
  249. }
  250. power_init();
  251. while(1)
  252. {
  253. power_thread();
  254. xEventGroupSetBits(xWatchdogEventGroup, TASK_POWER_BIT);
  255. vTaskDelay(200);
  256. }
  257. vTaskDelete(POWER_Task_Handler);
  258. }
  259. void print_freertos_heap(void) {
  260. // size_t total = configTOTAL_HEAP_SIZE;
  261. // size_t free_now = xPortGetFreeHeapSize();
  262. // size_t min_ever = xPortGetMinimumEverFreeHeapSize();
  263. // size_t used = total - free_now;
  264. // size_t peak_used = total - min_ever;
  265. // fr_printf("========== FreeRTOS HEAP ==========\r\n");
  266. // fr_printf("Total size: %u bytes (%u KB)\r\n", total, total / 1024);
  267. // fr_printf("Free now: %u bytes (%u KB)\r\n", free_now, free_now / 1024);
  268. // fr_printf("Used now: %u bytes (%u KB)\r\n", used, used / 1024);
  269. // fr_printf("Peak used: %u bytes (%u KB)\r\n", peak_used, peak_used / 1024);
  270. // fr_printf("Min ever free:%u bytes (%u KB)\r\n", min_ever, min_ever / 1024);
  271. // fr_printf("===================================\r\n");
  272. }
  273. void lwip_demo_task(void *pvParameters)
  274. {
  275. int i = 0;
  276. EventBits_t uxBits;
  277. uint8_t addr[6] = {0};
  278. l_file_init();
  279. paras_init();
  280. lwip_stack_init();
  281. ini_flag = 1;
  282. snmp2_init();
  283. while(1)
  284. {
  285. enet_mac_address_get(ENET_MAC_ADDRESS0,addr);
  286. // fr_printf("\r\n");
  287. // for(i=0;i < 6;i++)
  288. // {
  289. // fr_printf("0x%02X ",addr[i]);
  290. // }
  291. // fr_printf("\r\n");
  292. print_freertos_heap();
  293. lwip_check();
  294. uxBits = xEventGroupWaitBits(xWatchdogEventGroup, ALL_TASKS_BITS, pdFALSE, pdTRUE, pdMS_TO_TICKS(10));
  295. if ((uxBits & ALL_TASKS_BITS) == ALL_TASKS_BITS) {
  296. bsp_watchdog_feed();
  297. xEventGroupClearBits(xWatchdogEventGroup, ALL_TASKS_BITS);
  298. }
  299. vTaskDelay(1000);
  300. }
  301. vTaskDelete( LWIP_Task_Handler );
  302. }