app_1_2.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. /****************************************************************************
  2. *
  3. * Copy right: 2020-, Copyrigths of QIXIANG TECH Ltd.
  4. * File name: app.c 睡眠测试
  5. * Description: QX app source file
  6. * History: Rev1.0 2020-10-16
  7. * Athuor: chenjie
  8. *
  9. ****************************************************************************/
  10. //include
  11. #include "bsp.h"
  12. #include "bsp_custom.h"
  13. #include "osasys.h"
  14. #include "ostask.h"
  15. #include "queue.h"
  16. #include "ps_event_callback.h"
  17. #include "app.h"
  18. #include "cmisim.h"
  19. #include "cmimm.h"
  20. #include "cmips.h"
  21. #include "sockets.h"
  22. #include "psifevent.h"
  23. #include "ps_lib_api.h"
  24. #include "lwip/netdb.h"
  25. #include <cis_def.h>
  26. #include "debug_log.h"
  27. #include "slpman_ec616.h"
  28. #include "plat_config.h"
  29. //define
  30. // app task static stack and control block
  31. #define PROC_TASK_STACK_SIZE (1024)
  32. uint8_t process0SlpHandler = 0xff;
  33. uint8_t process1SlpHandler = 0xff;
  34. uint8_t process2SlpHandler = 0xff;
  35. uint8_t deepslpTimerID = 0;
  36. typedef enum
  37. {
  38. PROCESS0_STATE_IDLE = 0,
  39. PROCESS0_STATE_WORK,
  40. PROCESS0_STATE_SLEEP
  41. }process0SM;
  42. typedef enum
  43. {
  44. PROCESS1_STATE_IDLE = 0,
  45. PROCESS1_STATE_WORK,
  46. PROCESS1_STATE_SLEEP
  47. }process1SM;
  48. typedef enum
  49. {
  50. PROCESS2_STATE_IDLE = 0,
  51. PROCESS2_STATE_WORK,
  52. PROCESS2_STATE_SLEEP
  53. }process2SM;
  54. static StaticTask_t gProcessTask0;
  55. static UINT8 gProcessTaskStack0[PROC_TASK_STACK_SIZE];
  56. static StaticTask_t gProcessTask1;
  57. static UINT8 gProcessTaskStack1[PROC_TASK_STACK_SIZE];
  58. static StaticTask_t gProcessTask2;
  59. static UINT8 gProcessTaskStack2[PROC_TASK_STACK_SIZE];
  60. process0SM gProc0State = PROCESS0_STATE_IDLE;
  61. process1SM gProc1State = PROCESS1_STATE_IDLE;
  62. process2SM gProc2State = PROCESS2_STATE_IDLE;
  63. #define PROC0_STATE_SWITCH(a) (gProc0State = a)
  64. #define PROC1_STATE_SWITCH(a) (gProc1State = a)
  65. #define PROC2_STATE_SWITCH(a) (gProc2State = a)
  66. static void appBeforeHib(void *pdata, slpManLpState state)
  67. {
  68. uint32_t *p_param = (uint32_t *)pdata;
  69. ECOMM_TRACE(UNILOG_PLA_APP, appBeforeHib_1, P_SIG, 1, "Before Hibernate = %x",*p_param);
  70. }
  71. static void appAfterHib(void *pdata, slpManLpState state)
  72. {
  73. ECOMM_TRACE(UNILOG_PLA_APP, appAfterHib_1, P_SIG, 0, "Try Hibernate Failed, Interrupt Pending. Only sleep failed this function will excute");
  74. }
  75. static void appBeforeSlp1(void *pdata, slpManLpState state)
  76. {
  77. ECOMM_TRACE(UNILOG_PLA_APP, appBeforeSlp1_1, P_SIG, 0, "Before Sleep1");
  78. }
  79. static void appAfterSlp1(void *pdata, slpManLpState state)
  80. {
  81. ECOMM_TRACE(UNILOG_PLA_APP, appAfterSlp1_1, P_SIG, 0, "After Sleep1, no matter sleep success or not this function will excute");
  82. }
  83. static void appBeforeSlp2(void *pdata, slpManLpState state)
  84. {
  85. ECOMM_TRACE(UNILOG_PLA_APP, appBeforeSlp2_1, P_SIG, 0, "Before Sleep2");
  86. }
  87. static void appAfterSlp2(void *pdata, slpManLpState state)
  88. {
  89. ECOMM_TRACE(UNILOG_PLA_APP, appAfterSlp2_1, P_SIG, 0, "Sleep2 Failed, Interrupt Pending. Only sleep failed this function will excute");
  90. }
  91. static void process0AppTask(void* arg)
  92. {
  93. NetSocDisplay(0,LED_TURN_OFF);
  94. NetSocDisplay(1,LED_TURN_OFF);
  95. NetSocDisplay(2,LED_TURN_OFF);
  96. NetSocDisplay(3,LED_TURN_OFF);
  97. NetSocDisplay(4,LED_TURN_OFF);
  98. uint32_t inParam = 0xAABBCCDD;
  99. uint32_t cnt;
  100. slpManSetPmuSleepMode(true,SLP_HIB_STATE,false);
  101. slpManApplyPlatVoteHandle("process0slp",&process0SlpHandler);
  102. slpManRegisterUsrdefinedBackupCb(appBeforeHib,&inParam,SLPMAN_HIBERNATE_STATE);
  103. slpManRegisterUsrdefinedRestoreCb(appAfterHib,NULL,SLPMAN_HIBERNATE_STATE);
  104. slpManRegisterUsrdefinedBackupCb(appBeforeSlp1,NULL,SLPMAN_SLEEP1_STATE);
  105. slpManRegisterUsrdefinedRestoreCb(appAfterSlp1,NULL,SLPMAN_SLEEP1_STATE);
  106. slpManRegisterUsrdefinedBackupCb(appBeforeSlp2,NULL,SLPMAN_SLEEP2_STATE);
  107. slpManRegisterUsrdefinedRestoreCb(appAfterSlp2,NULL,SLPMAN_SLEEP2_STATE);
  108. slpManSlpState_t slpstate = slpManGetLastSlpState();
  109. UINT8 Can_index = 0;
  110. UINT8 Uart_index = 0;
  111. uint32_t sleep_index = 0;
  112. NVIC_EnableIRQ(PXIC_Timer0_IRQn);
  113. PROC0_STATE_SWITCH(PROCESS0_STATE_IDLE);
  114. while(1)
  115. {
  116. switch(gProc0State)
  117. {
  118. case PROCESS0_STATE_IDLE:
  119. {
  120. slpManPlatVoteDisableSleep(process0SlpHandler, SLP_SLP2_STATE);
  121. PROC0_STATE_SWITCH(PROCESS0_STATE_WORK);
  122. break;
  123. }
  124. case PROCESS0_STATE_WORK:
  125. {
  126. NetSocDisplay(0,LED_TURN_ON);
  127. osDelay(10);//10ms
  128. Can_index++;
  129. Uart_index++;
  130. sleep_index++;
  131. if (Uart_index >10)//Uart 100ms 调用一次
  132. {
  133. PROC2_STATE_SWITCH(PROCESS2_STATE_WORK);
  134. Uart_index = 0;
  135. }
  136. if (Can_index >=100)//Can 1000ms 调用一次
  137. {
  138. PROC1_STATE_SWITCH(PROCESS1_STATE_WORK);
  139. Can_index = 0;
  140. }
  141. if (sleep_index >=1000)
  142. {
  143. PROC0_STATE_SWITCH(PROCESS0_STATE_SLEEP);
  144. PROC1_STATE_SWITCH(PROCESS1_STATE_SLEEP);
  145. PROC2_STATE_SWITCH(PROCESS2_STATE_SLEEP);
  146. sleep_index = 0;
  147. }
  148. break;
  149. }
  150. case PROCESS0_STATE_SLEEP:
  151. {
  152. slpManSlpState_t State;
  153. uint8_t cnt;
  154. slpManPlatVoteEnableSleep(process0SlpHandler,SLP_SLP2_STATE);
  155. slpManPlatVoteDisableSleep(process0SlpHandler, SLP_HIB_STATE);
  156. slpManDeepSlpTimerStart(deepslpTimerID, 10000); // create a 10s timer, DeepSleep Timer is always oneshoot
  157. while(1) // now app can enter hib, but ps and phy maybe not, so wait here
  158. {
  159. NetSocDisplay(0,LED_TURN_OFF);
  160. osDelay(3000);
  161. }
  162. }
  163. }
  164. }
  165. }
  166. static void process1AppTask(void* arg)
  167. {
  168. PROC1_STATE_SWITCH(PROCESS1_STATE_IDLE);
  169. NVIC_EnableIRQ(PadWakeup1_IRQn);
  170. slpManApplyPlatVoteHandle("process1slp",&process1SlpHandler);
  171. while(1)
  172. {
  173. switch(gProc1State)
  174. {
  175. case PROCESS1_STATE_IDLE:
  176. {
  177. slpManPlatVoteDisableSleep(process1SlpHandler, SLP_SLP2_STATE);
  178. break;
  179. }
  180. case PROCESS1_STATE_WORK:
  181. {
  182. NetSocDisplay(1,LED_TURN_ON);
  183. break;
  184. }
  185. case PROCESS1_STATE_SLEEP:
  186. {
  187. slpManPlatVoteEnableSleep(process1SlpHandler, SLP_SLP2_STATE);
  188. slpManPlatVoteDisableSleep(process1SlpHandler, SLP_HIB_STATE);
  189. while(1)
  190. {
  191. osDelay(3000);
  192. }
  193. break;
  194. }
  195. }
  196. }
  197. }
  198. static void process2AppTask(void* arg)
  199. {
  200. PROC2_STATE_SWITCH(PROCESS2_STATE_IDLE);
  201. NVIC_EnableIRQ(PadWakeup1_IRQn);
  202. slpManApplyPlatVoteHandle("process2slp",&process2SlpHandler);
  203. while(1)
  204. {
  205. switch(gProc2State)
  206. {
  207. case PROCESS2_STATE_IDLE:
  208. {
  209. slpManPlatVoteDisableSleep(process2SlpHandler, SLP_SLP2_STATE);
  210. break;
  211. }
  212. case PROCESS2_STATE_WORK:
  213. {
  214. NetSocDisplay(2,LED_TURN_ON);
  215. break;
  216. }
  217. case PROCESS2_STATE_SLEEP:
  218. {
  219. slpManPlatVoteEnableSleep(process2SlpHandler, SLP_SLP2_STATE);
  220. slpManPlatVoteDisableSleep(process2SlpHandler, SLP_HIB_STATE);
  221. while(1)
  222. {
  223. osDelay(3000);
  224. }
  225. break;
  226. }
  227. }
  228. }
  229. }
  230. /**
  231. \fn process0Init(void)
  232. \brief process0Init function.
  233. \return
  234. */
  235. void process0Init(void)
  236. {
  237. osThreadAttr_t task_attr;
  238. #ifndef USING_PRINTF
  239. if(BSP_GetPlatConfigItemValue(PLAT_CONFIG_ITEM_LOG_CONTROL) != 0)
  240. {
  241. HAL_UART_RecvFlowControl(false);
  242. }
  243. #endif
  244. memset(&task_attr,0,sizeof(task_attr));
  245. memset(gProcessTaskStack0, 0xA5,PROC_TASK_STACK_SIZE);
  246. task_attr.name = "Process0AppTask";
  247. task_attr.stack_mem = gProcessTaskStack0;
  248. task_attr.stack_size = PROC_TASK_STACK_SIZE;
  249. task_attr.priority = osPriorityNormal;//osPriorityBelowNormal;
  250. task_attr.cb_mem = &gProcessTask0;//task control block
  251. task_attr.cb_size = sizeof(StaticTask_t);//size of task control block
  252. osThreadNew(process0AppTask, NULL, &task_attr);
  253. }
  254. /**
  255. \fn process1Init(void)
  256. \brief process1Init function.
  257. \return
  258. */
  259. void process1Init(void)
  260. {
  261. osThreadAttr_t task_attr;
  262. #ifndef USING_PRINTF
  263. if(BSP_GetPlatConfigItemValue(PLAT_CONFIG_ITEM_LOG_CONTROL) != 0)
  264. {
  265. HAL_UART_RecvFlowControl(false);
  266. }
  267. #endif
  268. memset(&task_attr,0,sizeof(task_attr));
  269. memset(gProcessTaskStack1, 0xA5,PROC_TASK_STACK_SIZE);
  270. task_attr.name = "Process1AppTask";
  271. task_attr.stack_mem = gProcessTaskStack1;
  272. task_attr.stack_size = PROC_TASK_STACK_SIZE;
  273. task_attr.priority = osPriorityNormal;//osPriorityBelowNormal;
  274. task_attr.cb_mem = &gProcessTask1;//task control block
  275. task_attr.cb_size = sizeof(StaticTask_t);//size of task control block
  276. osThreadNew(process1AppTask, NULL, &task_attr);
  277. }
  278. /**
  279. \fn process2Init(void)
  280. \brief process2Init function.
  281. \return
  282. */
  283. void process2Init(void)
  284. {
  285. osThreadAttr_t task_attr;
  286. memset(&task_attr,0,sizeof(task_attr));
  287. memset(gProcessTaskStack2, 0xA5,PROC_TASK_STACK_SIZE);
  288. task_attr.name = "Process2AppTask";
  289. task_attr.stack_mem = gProcessTaskStack2;
  290. task_attr.stack_size = PROC_TASK_STACK_SIZE;
  291. task_attr.priority = osPriorityNormal;//osPriorityBelowNormal;
  292. task_attr.cb_mem = &gProcessTask2;//task control block
  293. task_attr.cb_size = sizeof(StaticTask_t);//size of task control block
  294. osThreadNew(process2AppTask, NULL, &task_attr);
  295. }
  296. /**
  297. \fn appInit(void)
  298. \brief appInit function.
  299. \return
  300. */
  301. void appInit(void *arg)
  302. {
  303. process0Init();
  304. process1Init();
  305. process2Init();
  306. }
  307. /**
  308. \fn int main_entry(void)
  309. \brief main entry function.
  310. \return
  311. */
  312. void main_entry(void) {
  313. BSP_CommonInit();
  314. osKernelInitialize();
  315. registerAppEntry(appInit, NULL);
  316. if (osKernelGetState() == osKernelReady)
  317. {
  318. osKernelStart();
  319. }
  320. while(1);
  321. }