application.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. /*****************************************************************************
  2. * Copyright (c) 2019, Nations Technologies Inc.
  3. *
  4. * All rights reserved.
  5. * ****************************************************************************
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions are met:
  9. *
  10. * - Redistributions of source code must retain the above copyright notice,
  11. * this list of conditions and the disclaimer below.
  12. *
  13. * Nations' name may not be used to endorse or promote products derived from
  14. * this software without specific prior written permission.
  15. *
  16. * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY NATIONS "AS IS" AND ANY EXPRESS OR
  17. * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  18. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  19. * DISCLAIMED. IN NO EVENT SHALL NATIONS BE LIABLE FOR ANY DIRECT, INDIRECT,
  20. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  21. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  22. * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  23. * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  24. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  25. * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. * ****************************************************************************/
  27. /**
  28. * @file application.c
  29. * @author Nations
  30. * @version v1.0.0
  31. *
  32. * @copyright Copyright (c) 2019, Nations Technologies Inc. All rights reserved.
  33. */
  34. #include <rtthread.h>
  35. #include <string.h>
  36. #include "gpio.h"
  37. #include "iwdg.h"
  38. #include "application.h"
  39. #include "log.h"
  40. #include "drv_hwtimer.h"
  41. #include "usart.h"
  42. #include "algorithm.h"
  43. #include "dri_Flash.h"
  44. #include "dri_can.h"
  45. /////////////////////////////////////////////////////////////////////
  46. ALIGN( RT_ALIGN_SIZE )
  47. #define RADAR_SOFTWARE_VERSION 260623
  48. #define FRONT_OBSTACLE_ACK_ID (0xA81302) //4D前避障雷达参数配置回复 Can ID
  49. #define REAR_OBSTACLE_ACK_ID (0xB81302) //4D后避障雷达参数配置回复 Can ID
  50. #define LEFT_OBSTACLE_ACK_ID (0xC81302) //4D左避障雷达参数配置回复 Can ID
  51. #define RIGHT_OBSTACLE_ACK_ID (0xD81302) //4D右避障雷达参数配置回复 Can ID
  52. #define FRONT_OBSTACLE_RECEIVE_ID (0xA81300) //4D前避障雷达参数配置接收 Can ID
  53. #define REAR_OBSTACLE_RECEIVE_ID (0xB81300) //4D后避障雷达参数配置接收 Can ID
  54. #define LEFT_OBSTACLE_RECEIVE_ID (0xC81300) //4D左避障雷达参数配置接收 Can ID
  55. #define RIGHT_OBSTACLE_RECEIVE_ID (0xD81300) //4D右避障雷达参数配置接收 Can ID
  56. static rt_uint8_t InitStack[1024];
  57. static rt_uint8_t NodeStatusStack[512];
  58. static rt_uint8_t ParameterStack[1024];
  59. static rt_uint8_t AppStack[2048];
  60. static rt_uint8_t ClusterStack[8192];
  61. static struct rt_thread InitHandle;
  62. static struct rt_thread ParameterHandle;
  63. static struct rt_thread AppHandle;
  64. static struct rt_thread ClusterHandle;
  65. static struct rt_thread NodeStatusHandle;
  66. // 信号量
  67. rt_sem_t uart_sem_t = RT_NULL;
  68. rt_sem_t cluster_sem_t = RT_NULL;
  69. rt_sem_t parameter_sem_t = RT_NULL;
  70. //////////////////////////////////////////////////////////////////
  71. static void AppTask( void *parameter );
  72. static void ParameterTask( void *parameter );
  73. //////////////////////////////////////////////////////////////////
  74. uint8_t ParameterData[8] = {0};
  75. uint32_t ParameterAckCanID = 0;
  76. uint32_t ParameterReceiveCanID = 0;
  77. uint32_t OstacleDistanceCanID = 0;
  78. uint32_t TerrainHeightCanID = 0;
  79. uint32_t RawPointCloudCanID = 0;
  80. uint32_t RceveiveCanID = 0;
  81. extern uint16_t canBitrate;
  82. /**
  83. * @brief Init任务
  84. *
  85. * @param parameter
  86. */
  87. static void InitTask( void *parameter )
  88. {
  89. read_iap_info();
  90. if ( iap_info.ValidFlag == IAP_VFLAG && iap_info.UpgradeFlag == IAP_FLAG )
  91. {
  92. iap_info.UpgradeFlag = IAP_UN_FLAG;
  93. write_iap_info();
  94. }
  95. // confInfo.DeviceType = THIS_DEVICE;
  96. // confInfo.MaxDist = 2500;
  97. // confInfo.RawDataFlag = 0;
  98. // confInfo.HeightFilterValue = 5;
  99. // confInfo.CompensateAngle = 0;
  100. // confInfo.PowerFilterLevel = 0;
  101. // confInfo.BlindDistance = 100;
  102. // write_conf_info();
  103. read_conf_info();
  104. canBitrate = confInfo.canBitrate;
  105. can_init();
  106. DroneCAN_Start();
  107. check_conf_info();
  108. read_dev_info();
  109. devInfo.soft_ver = RADAR_SOFTWARE_VERSION;
  110. write_dev_info();
  111. read_boot_info();
  112. if ( confInfo.DeviceType == FRONT_OBSTACLE_RADAR )
  113. {
  114. TerrainHeightCanID = FRONT_TERRAIN_CAN_ID;
  115. ParameterReceiveCanID = FRONT_OBSTACLE_RECEIVE_ID;
  116. ParameterAckCanID = FRONT_OBSTACLE_ACK_ID;
  117. OstacleDistanceCanID = FRONT_OBSTACLE_CAN_ID;
  118. RawPointCloudCanID = FRONT_OBSTACLE_OUT;
  119. }
  120. if ( confInfo.DeviceType == REAR_OBSTACLE_RADAR )
  121. {
  122. TerrainHeightCanID = REAR_TERRAIN_CAN_ID;
  123. ParameterReceiveCanID = REAR_OBSTACLE_RECEIVE_ID;
  124. ParameterAckCanID = REAR_OBSTACLE_ACK_ID;
  125. OstacleDistanceCanID = REAR_OBSTACLE_CAN_ID;
  126. RawPointCloudCanID = REAR_OBSTACLE_OUT;
  127. }
  128. if ( confInfo.DeviceType == LEFT_OBSTACLE_RADAR )
  129. {
  130. ParameterReceiveCanID = LEFT_OBSTACLE_RECEIVE_ID;
  131. ParameterAckCanID = LEFT_OBSTACLE_ACK_ID;
  132. OstacleDistanceCanID = LEFT_OBSTACLE_CAN_ID;
  133. }
  134. if ( confInfo.DeviceType == RIGHT_OBSTACLE_RADAR )
  135. {
  136. ParameterReceiveCanID = RIGHT_OBSTACLE_RECEIVE_ID;
  137. ParameterAckCanID = RIGHT_OBSTACLE_ACK_ID;
  138. OstacleDistanceCanID = RIGHT_OBSTACLE_CAN_ID;
  139. }
  140. read_dev_info();
  141. rt_err_t result = RT_EOK;
  142. result = rt_thread_init( &ParameterHandle, "parameter", ParameterTask, RT_NULL, ( rt_uint8_t * )&ParameterStack[0], sizeof( ParameterStack ), 4, 1 );
  143. if ( result == RT_EOK )
  144. {
  145. rt_thread_startup( &ParameterHandle );
  146. }
  147. result = rt_thread_init( &NodeStatusHandle, "nodestatus", NodeStatusTask, RT_NULL, ( rt_uint8_t * )&NodeStatusStack[0], sizeof( NodeStatusStack ), 10, 1 );
  148. if ( result == RT_EOK )
  149. {
  150. rt_thread_startup( &NodeStatusHandle );
  151. }
  152. result = rt_thread_init( &AppHandle, "app", AppTask, RT_NULL, ( rt_uint8_t * )&AppStack[0], sizeof( AppStack ), 2, 1 );
  153. if ( result == RT_EOK )
  154. {
  155. rt_thread_startup( &AppHandle );
  156. }
  157. rt_thread_init( &ClusterHandle, "cluster", ClusterTask, RT_NULL, ( rt_uint8_t * )&ClusterStack[0], sizeof( ClusterStack ), 3, 1 );
  158. if ( result == RT_EOK )
  159. {
  160. rt_thread_startup( &ClusterHandle );
  161. }
  162. }
  163. //串口数据帧头、帧尾
  164. uint8_t head_data[8] = {'R', 'a', 'd', 'a', 'r', 'E', 'y', 'e'};
  165. uint8_t tail_data[4] = {'R', 'E', 'N', 'D'};
  166. static uint8_t t_cnt = 0;
  167. uint8_t temp_buf[8192] = {0};
  168. uint32_t temp_len = 0;
  169. struct rt_mutex queue_lock;
  170. /**
  171. * @brief 原始点云处理
  172. *
  173. * @param parameter
  174. */
  175. static void AppTask( void *parameter )
  176. {
  177. while ( 1 )
  178. {
  179. rt_sem_take( uart2_rdata.sem, RT_WAITING_FOREVER );
  180. uint16_t current_len = uart2_rdata.recv_len;
  181. uint8_t *current_buf = uart2_rdata.buff;
  182. if ( ( memcmp( current_buf, head_data, 8 ) == 0 ) && ( memcmp( current_buf + current_len - 4, tail_data, 4 ) == 0 ) )
  183. {
  184. t_cnt++;
  185. if ( ( t_cnt % 2 ) == 0 )
  186. {
  187. LED0_OFF();
  188. }
  189. else
  190. {
  191. LED0_ON();
  192. }
  193. if ( confInfo.RawDataFlag == 1 ) parse_radar_response( current_buf, current_len );
  194. if ( rt_mutex_take( &queue_lock, 0 ) == RT_EOK )
  195. {
  196. memcpy( temp_buf, uart2_rdata.buff, 8192 );
  197. temp_len = uart2_rdata.recv_len;
  198. rt_mutex_release( &queue_lock );
  199. rt_sem_release( cluster_sem_t );
  200. }
  201. }
  202. memset( uart2_rdata.buff, 0, 8192 );
  203. uart2_rdata.recv_len = 0;
  204. }
  205. }
  206. uint8_t ParameterAck[8] = {0};
  207. FlagUnion ParameterFlag = {0};
  208. uint8_t uFlag = 0;
  209. static void ParameterTask( void *parameter )
  210. {
  211. while ( 1 )
  212. {
  213. rt_sem_take( parameter_sem_t, RT_WAITING_FOREVER );
  214. if ( RceveiveCanID != ParameterReceiveCanID )
  215. continue;
  216. if ( ParameterData[0] == 1 ) //飞控获取雷达版本信息
  217. {
  218. read_dev_info();
  219. ParameterAck[0] = 1;
  220. memcpy( &ParameterAck[1], &devInfo.sn, sizeof( devInfo.sn ) );
  221. uFlag = calculate_flag( 1, 2, &ParameterFlag );
  222. ParameterAck[7] = uFlag;
  223. MyCAN_Transmit( ParameterAckCanID, 8, ParameterAck, 0 );
  224. memcpy( &ParameterAck[1], &devInfo.soft_ver, sizeof( devInfo.soft_ver ) );
  225. memcpy( &ParameterAck[5], &bootInfo.boot_version, sizeof( bootInfo.boot_version ) );
  226. uFlag = calculate_flag( 2, 2, &ParameterFlag );
  227. ParameterAck[7] = uFlag;
  228. MyCAN_Transmit( ParameterAckCanID, 8, ParameterAck, 0 );
  229. }
  230. else if ( ParameterData[0] == 2 ) //设置雷达SN号
  231. {
  232. memcpy( &devInfo.sn, &ParameterData[1], sizeof( devInfo.sn ) );
  233. write_dev_info();
  234. read_dev_info();
  235. ParameterAck[0] = 2;
  236. memcpy( &ParameterAck[1], &devInfo.sn, sizeof( devInfo.sn ) );
  237. uFlag = calculate_flag( 1, 1, &ParameterFlag );
  238. ParameterAck[7] = uFlag;
  239. MyCAN_Transmit( ParameterAckCanID, 8, ParameterAck, 0 );
  240. }
  241. else if ( ParameterData[0] == 4 ) //设置雷达设备类型
  242. {
  243. memcpy( &confInfo.DeviceType, &ParameterData[1], sizeof( confInfo.DeviceType ) );
  244. write_conf_info();
  245. read_conf_info();
  246. ParameterAck[0] = 4;
  247. memcpy( &ParameterAck[1], &confInfo.DeviceType, sizeof( confInfo.DeviceType ) );
  248. uFlag = calculate_flag( 1, 1, &ParameterFlag );
  249. ParameterAck[7] = uFlag;
  250. MyCAN_Transmit( ParameterAckCanID, 8, ParameterAck, 0 );
  251. if ( confInfo.DeviceType == FRONT_OBSTACLE_RADAR )
  252. {
  253. TerrainHeightCanID = FRONT_TERRAIN_CAN_ID;
  254. ParameterReceiveCanID = FRONT_OBSTACLE_RECEIVE_ID;
  255. ParameterAckCanID = FRONT_OBSTACLE_ACK_ID;
  256. OstacleDistanceCanID = FRONT_OBSTACLE_CAN_ID;
  257. RawPointCloudCanID = FRONT_OBSTACLE_OUT;
  258. }
  259. if ( confInfo.DeviceType == REAR_OBSTACLE_RADAR )
  260. {
  261. TerrainHeightCanID = REAR_TERRAIN_CAN_ID;
  262. ParameterReceiveCanID = REAR_OBSTACLE_RECEIVE_ID;
  263. ParameterAckCanID = REAR_OBSTACLE_ACK_ID;
  264. OstacleDistanceCanID = REAR_OBSTACLE_CAN_ID;
  265. RawPointCloudCanID = REAR_OBSTACLE_OUT;
  266. }
  267. if ( confInfo.DeviceType == LEFT_OBSTACLE_RADAR )
  268. {
  269. ParameterReceiveCanID = LEFT_OBSTACLE_RECEIVE_ID;
  270. ParameterAckCanID = LEFT_OBSTACLE_ACK_ID;
  271. OstacleDistanceCanID = LEFT_OBSTACLE_CAN_ID;
  272. }
  273. if ( confInfo.DeviceType == RIGHT_OBSTACLE_RADAR )
  274. {
  275. ParameterReceiveCanID = RIGHT_OBSTACLE_RECEIVE_ID;
  276. ParameterAckCanID = RIGHT_OBSTACLE_ACK_ID;
  277. OstacleDistanceCanID = RIGHT_OBSTACLE_CAN_ID;
  278. }
  279. }
  280. else if ( ParameterData[0] == 5 ) //设置距离雷达盲区距离
  281. {
  282. memcpy( &confInfo.BlindDistance, &ParameterData[1], sizeof( confInfo.BlindDistance ) );
  283. write_conf_info();
  284. read_conf_info();
  285. ParameterAck[0] = 5;
  286. memcpy( &ParameterAck[1], &confInfo.BlindDistance, sizeof( confInfo.BlindDistance ) );
  287. uFlag = calculate_flag( 1, 1, &ParameterFlag );
  288. ParameterAck[7] = uFlag;
  289. MyCAN_Transmit( ParameterAckCanID, 8, ParameterAck, 0 );
  290. }
  291. else if ( ParameterData[0] == 6 ) //获取雷达UID
  292. {
  293. read_uid(uid);
  294. ParameterAck[0] = 6;
  295. memcpy( &ParameterAck[1], &uid[0], 6 );
  296. uFlag = calculate_flag( 1, 2, &ParameterFlag );
  297. ParameterAck[7] = uFlag;
  298. MyCAN_Transmit( ParameterAckCanID, 8, ParameterAck, 0 );
  299. memcpy( &ParameterAck[1], &uid[6], 6 );
  300. uFlag = calculate_flag( 2, 2, &ParameterFlag );
  301. ParameterAck[7] = uFlag;
  302. MyCAN_Transmit( ParameterAckCanID, 8, ParameterAck, 0 );
  303. }
  304. else if ( ParameterData[0] == 8 ) //获取雷达盲区距离
  305. {
  306. read_conf_info();
  307. ParameterAck[0] = 8;
  308. memcpy( &ParameterAck[1], &confInfo.BlindDistance, sizeof( confInfo.BlindDistance ) );
  309. uFlag = calculate_flag( 1, 1, &ParameterFlag );
  310. ParameterAck[7] = uFlag;
  311. MyCAN_Transmit( ParameterAckCanID, 8, ParameterAck, 0 );
  312. }
  313. else if ( ParameterData[0] == 10 ) //设置雷达点云数据开关
  314. {
  315. memcpy( &confInfo.RawDataFlag, &ParameterData[1], sizeof( confInfo.RawDataFlag ) );
  316. write_conf_info();
  317. read_conf_info();
  318. ParameterAck[0] = 10;
  319. memcpy( &ParameterAck[1], &confInfo.RawDataFlag, sizeof( confInfo.RawDataFlag ) );
  320. uFlag = calculate_flag( 1, 1, &ParameterFlag );
  321. ParameterAck[7] = uFlag;
  322. MyCAN_Transmit( ParameterAckCanID, 8, ParameterAck, 0 );
  323. }
  324. else if ( ParameterData[0] == 11 ) //获取雷达点云数据开关
  325. {
  326. read_conf_info();
  327. ParameterAck[0] = 11;
  328. memcpy( &ParameterAck[1], &confInfo.RawDataFlag, sizeof( confInfo.RawDataFlag ) );
  329. uFlag = calculate_flag( 1, 1, &ParameterFlag );
  330. ParameterAck[7] = uFlag;
  331. MyCAN_Transmit( ParameterAckCanID, 8, ParameterAck, 0 );
  332. }
  333. else if ( ParameterData[0] == 12 ) //设置雷达安装补偿角度
  334. {
  335. memcpy( &confInfo.CompensateAngle, &ParameterData[1], sizeof( confInfo.CompensateAngle ) );
  336. write_conf_info();
  337. read_conf_info();
  338. ParameterAck[0] = 12;
  339. memcpy( &ParameterAck[1], &confInfo.CompensateAngle, sizeof( confInfo.CompensateAngle ) );
  340. uFlag = calculate_flag( 1, 1, &ParameterFlag );
  341. ParameterAck[7] = uFlag;
  342. MyCAN_Transmit( ParameterAckCanID, 8, ParameterAck, 0 );
  343. }
  344. else if ( ParameterData[0] == 13 ) //获取雷达安装补偿角度
  345. {
  346. read_conf_info();
  347. ParameterAck[0] = 13;
  348. memcpy( &ParameterAck[1], &confInfo.CompensateAngle, sizeof( confInfo.CompensateAngle ) );
  349. uFlag = calculate_flag( 1, 1, &ParameterFlag );
  350. ParameterAck[7] = uFlag;
  351. MyCAN_Transmit( ParameterAckCanID, 8, ParameterAck, 0 );
  352. }
  353. else if ( ParameterData[0] == 14 ) //设置雷达高度过滤系数
  354. {
  355. memcpy( &confInfo.HeightFilterValue, &ParameterData[1], sizeof( confInfo.HeightFilterValue ) );
  356. write_conf_info();
  357. read_conf_info();
  358. ParameterAck[0] = 14;
  359. memcpy( &ParameterAck[1], &confInfo.HeightFilterValue, sizeof( confInfo.HeightFilterValue ) );
  360. uFlag = calculate_flag( 1, 1, &ParameterFlag );
  361. ParameterAck[7] = uFlag;
  362. MyCAN_Transmit( ParameterAckCanID, 8, ParameterAck, 0 );
  363. }
  364. else if ( ParameterData[0] == 15 ) //获取雷达高度过滤系数
  365. {
  366. read_conf_info();
  367. ParameterAck[0] = 15;
  368. memcpy( &ParameterAck[1], &confInfo.HeightFilterValue, sizeof( confInfo.HeightFilterValue ) );
  369. uFlag = calculate_flag( 1, 1, &ParameterFlag );
  370. ParameterAck[7] = uFlag;
  371. MyCAN_Transmit( ParameterAckCanID, 8, ParameterAck, 0 );
  372. }
  373. else if ( ParameterData[0] == 16 ) //设置雷达障碍反馈距离
  374. {
  375. memcpy( &confInfo.MaxDist, &ParameterData[1], sizeof( confInfo.MaxDist ) );
  376. write_conf_info();
  377. read_conf_info();
  378. ParameterAck[0] = 16;
  379. memcpy( &ParameterAck[1], &confInfo.MaxDist, sizeof( confInfo.MaxDist ) );
  380. uFlag = calculate_flag( 1, 1, &ParameterFlag );
  381. ParameterAck[7] = uFlag;
  382. MyCAN_Transmit( ParameterAckCanID, 8, ParameterAck, 0 );
  383. }
  384. else if ( ParameterData[0] == 17 ) //获取雷达障碍反馈距离
  385. {
  386. read_conf_info();
  387. ParameterAck[0] = 17;
  388. memcpy( &ParameterAck[1], &confInfo.MaxDist, sizeof( confInfo.MaxDist ) );
  389. uFlag = calculate_flag( 1, 1, &ParameterFlag );
  390. ParameterAck[7] = uFlag;
  391. MyCAN_Transmit( ParameterAckCanID, 8, ParameterAck, 0 );
  392. }
  393. else if ( ParameterData[0] == 18 ) //设置雷达升级模式
  394. {
  395. memcpy( &confInfo.upgradeMode, &ParameterData[1], sizeof( confInfo.upgradeMode ) );
  396. if (ParameterData[1] == 0)
  397. confInfo.canBitrate = 6;
  398. if (ParameterData[1] == 1)
  399. confInfo.canBitrate = 12;
  400. write_conf_info();
  401. read_conf_info();
  402. ParameterAck[0] = 18;
  403. memcpy( &ParameterAck[1], &confInfo.upgradeMode, sizeof( confInfo.upgradeMode ) );
  404. uFlag = calculate_flag( 1, 1, &ParameterFlag );
  405. ParameterAck[7] = uFlag;
  406. MyCAN_Transmit( ParameterAckCanID, 8, ParameterAck, 0 );
  407. }
  408. memset( &ParameterAck[0], 0, 8 );
  409. }
  410. }
  411. /**
  412. * @brief init application
  413. */
  414. void rt_application_init( void )
  415. {
  416. rt_err_t result = RT_EOK;
  417. log_info( "app init\r\n" );
  418. result = rt_mutex_init( &queue_lock, "queue", RT_IPC_FLAG_PRIO );
  419. if ( result != RT_EOK )
  420. {
  421. log_info( "queue_lock init failed!\n" );
  422. }
  423. rx_cache.sem = rt_sem_create( "Uart_r", 0, RT_IPC_FLAG_FIFO );
  424. log_assert( rx_cache.sem, RT_NULL, 1 );
  425. uart_sem_t = rt_sem_create( "Uart_t", 1, RT_IPC_FLAG_FIFO );
  426. log_assert( uart_sem_t, RT_NULL, 1 );
  427. uart2_rdata.sem = rt_sem_create( "Uart2_r", 0, RT_IPC_FLAG_FIFO );
  428. log_assert( uart2_rdata.sem, RT_NULL, 1 );
  429. cluster_sem_t = rt_sem_create( "Cluster_t", 0, RT_IPC_FLAG_FIFO );
  430. log_assert( cluster_sem_t, RT_NULL, 1 );
  431. parameter_sem_t = rt_sem_create( "Parameter_t", 0, RT_IPC_FLAG_FIFO );
  432. log_assert( parameter_sem_t, RT_NULL, 1 );
  433. result = rt_thread_init( &InitHandle, "Init", InitTask, RT_NULL, ( rt_uint8_t * )&InitStack[0], sizeof( InitStack ), 2, 5 );
  434. if ( result == RT_EOK )
  435. {
  436. rt_thread_startup( &InitHandle );
  437. }
  438. }