core_service.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. /*
  2. * Copyright (c) 2022 OpenLuat & AirM2M
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a copy of
  5. * this software and associated documentation files (the "Software"), to deal in
  6. * the Software without restriction, including without limitation the rights to
  7. * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  8. * the Software, and to permit persons to whom the Software is furnished to do so,
  9. * subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in all
  12. * copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  16. * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  17. * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  18. * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  19. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  20. */
  21. #include "user.h"
  22. #ifdef __BUILD_OS__
  23. #include "zbar.h"
  24. #include "symbol.h"
  25. #include "image.h"
  26. #include "tiny_jpeg.h"
  27. extern void SPI_TestInit(uint8_t SpiID, uint32_t Speed, uint32_t TestLen);
  28. extern void SPI_TestOnce(uint8_t SpiID, uint32_t TestLen);
  29. extern void DHT11_TestOnce(uint8_t Pin, CBFuncEx_t CB);
  30. extern void DHT11_TestResult(void);
  31. extern void SHT30_Init(CBFuncEx_t CB, void *pParam);
  32. extern void SHT30_GetResult(CBFuncEx_t CB, void *pParam);
  33. extern void GC032A_TestInit(void);
  34. extern void OV2640_TestInit(void);
  35. enum
  36. {
  37. SERVICE_LCD_DRAW = SERVICE_EVENT_ID_START + 1,
  38. SERVICE_CAMERA_DRAW,
  39. SERVICE_DECODE_QR,
  40. SERVICE_SCAN_KEYBOARD,
  41. SERVICE_ENCODE_JPEG_START,
  42. SERVICE_ENCODE_JPEG_RUN,
  43. SERVICE_ENCODE_JPEG_END,
  44. };
  45. typedef struct
  46. {
  47. tje_write_func *JPEGEncodeWriteFun;
  48. void *JPEGEncodeWriteParam;
  49. HANDLE HardwareHandle;
  50. HANDLE ServiceHandle;
  51. HANDLE UserHandle;
  52. uint64_t LCDDrawRequireByte;
  53. uint64_t LCDDrawDoneByte;
  54. uint32_t InitAllocMem;
  55. uint32_t LastAllocMem;
  56. uint8_t RFix;
  57. uint8_t GFix;
  58. uint8_t BFix;
  59. }Service_CtrlStruct;
  60. static Service_CtrlStruct prvService;
  61. static void prvCore_LCDCmd(LCD_DrawStruct *Draw, uint8_t Cmd)
  62. {
  63. GPIO_Output(Draw->DCPin, 0);
  64. if (Draw->DCDelay)
  65. {
  66. SysTickDelay(Draw->DCDelay * CORE_TICK_1US);
  67. }
  68. GPIO_Output(Draw->CSPin, 0);
  69. SPI_BlockTransfer(Draw->SpiID, &Cmd, NULL, 1);
  70. GPIO_Output(Draw->CSPin, 1);
  71. GPIO_Output(Draw->DCPin, 1);
  72. // SysTickDelay(300);
  73. }
  74. static void prvCore_LCDData(LCD_DrawStruct *Draw, uint8_t *Data, uint32_t Len)
  75. {
  76. GPIO_Output(Draw->CSPin, 0);
  77. SPI_BlockTransfer(Draw->SpiID, Data, NULL, Len);
  78. GPIO_Output(Draw->CSPin, 1);
  79. }
  80. static uint16_t RGB888toRGB565(uint8_t red, uint8_t green, uint8_t blue, uint8_t IsBe)
  81. {
  82. uint16_t B = (blue >> 3) & 0x001F;
  83. uint16_t G = ((green >> 2) << 5) & 0x07E0;
  84. uint16_t R = ((red >> 3) << 11) & 0xF800;
  85. uint16_t C = (R | G | B);
  86. if (IsBe)
  87. {
  88. C = BSP_Swap16(C);
  89. }
  90. return C;
  91. }
  92. static void RGB565toRGB888(uint16_t In, uint8_t *Out, uint8_t IsBe)
  93. {
  94. if (IsBe)
  95. {
  96. In = BSP_Swap16(In);
  97. }
  98. Out[2] = ((In & 0x001F) << 3) | prvService.BFix;
  99. Out[1] = ((In & 0x07E0) >> 3) | prvService.GFix;
  100. Out[0] = ((In & 0xF800) >> 8) | prvService.RFix;
  101. }
  102. static void prv_CoreJpegSave(void* context, void* data, int size)
  103. {
  104. }
  105. static void prvHW_Task(void* params)
  106. {
  107. uint64_t StartUS;
  108. OS_EVENT Event;
  109. int32_t Result;
  110. LCD_DrawStruct *Draw;
  111. PV_Union uPV;
  112. uint16_t uColor[256];
  113. uint32_t i, j, Size;
  114. for(i = 0; i < 256; i++)
  115. {
  116. uColor[i] = RGB888toRGB565(i, i, i, 1);
  117. }
  118. while(1)
  119. {
  120. Result = Task_GetEvent(prvService.HardwareHandle, CORE_EVENT_ID_ANY, &Event, NULL, 0);
  121. switch(Event.ID)
  122. {
  123. case SERVICE_LCD_DRAW:
  124. Draw = (LCD_DrawStruct *)Event.Param1;
  125. if (Draw->Speed > 30000000)
  126. {
  127. SPI_SetTxOnlyFlag(Draw->SpiID, 1);
  128. }
  129. SPI_SetNewConfig(Draw->SpiID, Draw->Speed, Draw->Mode);
  130. SPI_DMATxInit(Draw->SpiID, LCD_SPI_TX_DMA_STREAM, 0);
  131. SPI_DMARxInit(Draw->SpiID, LCD_SPI_RX_DMA_STREAM, 0);
  132. prvCore_LCDCmd(Draw, 0x2a);
  133. BytesPutBe16(uPV.u8, Draw->x1 + Draw->xoffset);
  134. BytesPutBe16(uPV.u8 + 2, Draw->x2 + Draw->xoffset);
  135. prvCore_LCDData(Draw, uPV.u8, 4);
  136. prvCore_LCDCmd(Draw, 0x2b);
  137. BytesPutBe16(uPV.u8, Draw->y1 + Draw->yoffset);
  138. BytesPutBe16(uPV.u8 + 2, Draw->y2 + Draw->yoffset);
  139. prvCore_LCDData(Draw, uPV.u8, 4);
  140. prvCore_LCDCmd(Draw, 0x2c);
  141. GPIO_Output(Draw->CSPin, 0);
  142. // StartUS = GetSysTickUS();
  143. // SPI_Transfer(Draw->SpiID, Draw->Data, Draw->Data, Draw->Size, 2);
  144. SPI_BlockTransfer(Draw->SpiID, Draw->Data, Draw->Data, Draw->Size);
  145. // DBG("%u, %u", Draw->Size, (uint32_t)(GetSysTickUS() - StartUS));
  146. prvService.LCDDrawDoneByte += Draw->Size;
  147. free(Draw->Data);
  148. GPIO_Output(Draw->CSPin, 1);
  149. free(Draw);
  150. SPI_SetTxOnlyFlag(Draw->SpiID, 0);
  151. break;
  152. case SERVICE_CAMERA_DRAW:
  153. Draw = (LCD_DrawStruct *)Event.Param1;
  154. SPI_SetTxOnlyFlag(Draw->SpiID, 1);
  155. SPI_SetNewConfig(Draw->SpiID, Draw->Speed, Draw->Mode);
  156. SPI_DMATxInit(Draw->SpiID, LCD_SPI_TX_DMA_STREAM, 0);
  157. SPI_DMARxInit(Draw->SpiID, LCD_SPI_RX_DMA_STREAM, 0);
  158. prvCore_LCDCmd(Draw, 0x2a);
  159. BytesPutBe16(uPV.u8, Draw->x1 + Draw->xoffset);
  160. BytesPutBe16(uPV.u8 + 2, Draw->x2 + Draw->xoffset);
  161. prvCore_LCDData(Draw, uPV.u8, 4);
  162. prvCore_LCDCmd(Draw, 0x2b);
  163. BytesPutBe16(uPV.u8, Draw->y1 + Draw->yoffset);
  164. BytesPutBe16(uPV.u8 + 2, Draw->y2 + Draw->yoffset);
  165. prvCore_LCDData(Draw, uPV.u8, 4);
  166. prvCore_LCDCmd(Draw, 0x2c);
  167. GPIO_Output(Draw->CSPin, 0);
  168. switch(Draw->ColorMode)
  169. {
  170. case COLOR_MODE_RGB_565:
  171. SPI_BlockTransfer(Draw->SpiID, Draw->Data, Draw->Data, Draw->Size);
  172. break;
  173. case COLOR_MODE_GRAY:
  174. Size = Draw->Size/10;
  175. uPV.pu16 = malloc(Size * 2);
  176. for(i = 0; i < 10; i++)
  177. {
  178. for(j = 0; j < Size; j++)
  179. {
  180. uPV.pu16[j] = uColor[Draw->Data[i * Size + j]];
  181. }
  182. SPI_BlockTransfer(Draw->SpiID, uPV.pu8, uPV.pu8, Size * 2);
  183. }
  184. free(uPV.pu16);
  185. break;
  186. }
  187. free(Draw);
  188. GPIO_Output(Draw->CSPin, 1);
  189. SPI_SetTxOnlyFlag(Draw->SpiID, 0);
  190. break;
  191. }
  192. }
  193. }
  194. static void prvService_Task(void* params)
  195. {
  196. zbar_image_scanner_t *zbar_scanner;
  197. zbar_image_t *zbar_image;
  198. zbar_symbol_t *zbar_symbol;
  199. CBDataFun_t CBDataFun;
  200. PV_Union uPV;
  201. PV_Union uColor;
  202. HANDLE JPEGEncodeHandle = NULL;
  203. OS_EVENT Event;
  204. uint32_t i;
  205. CBFuncEx_t CB;
  206. Core_SetRGB565FixValue(0xff, 0xff, 0xff);
  207. // Audio_Test();
  208. while(1)
  209. {
  210. Task_GetEventByMS(prvService.ServiceHandle, CORE_EVENT_ID_ANY, &Event, NULL, 0);
  211. switch(Event.ID)
  212. {
  213. case SERVICE_SCAN_KEYBOARD:
  214. SoftKB_ScanOnce();
  215. break;
  216. case SERVICE_DECODE_QR:
  217. if (Event.Param3)
  218. {
  219. //此处代码可以更换成第三方解码
  220. CBDataFun = (CBDataFun_t)(Event.Param3);
  221. uPV.u32 = Event.Param2;
  222. zbar_scanner = zbar_image_scanner_create();
  223. zbar_image_scanner_set_config(zbar_scanner, 0, ZBAR_CFG_ENABLE, 1);
  224. zbar_image = zbar_image_create();
  225. zbar_image_set_format(zbar_image, *(int*)"Y800");
  226. zbar_image_set_size(zbar_image, uPV.u16[0], uPV.u16[1]);
  227. zbar_image_set_data(zbar_image, Event.Param1, uPV.u16[0] * uPV.u16[1], zbar_image_free_data);
  228. if (zbar_scan_image(zbar_scanner, zbar_image) > 0)
  229. {
  230. zbar_symbol = (zbar_symbol_t *)zbar_image_first_symbol(zbar_image);
  231. free(Event.Param1);
  232. //解码完成回调
  233. CBDataFun(zbar_symbol->data, zbar_symbol->datalen);
  234. }
  235. else
  236. {
  237. free(Event.Param1);
  238. //解码失败回调
  239. CBDataFun(NULL, 0);
  240. }
  241. zbar_image_destroy(zbar_image);
  242. zbar_image_scanner_destroy(zbar_scanner);
  243. }
  244. else
  245. {
  246. free(Event.Param1);
  247. }
  248. break;
  249. case SERVICE_ENCODE_JPEG_START:
  250. JPEGEncodeHandle = jpeg_encode_init(prvService.JPEGEncodeWriteFun, prvService.JPEGEncodeWriteParam, Event.Param2, Event.Param1 >> 16, Event.Param1 & 0x0000ffff, 3);
  251. break;
  252. case SERVICE_ENCODE_JPEG_RUN:
  253. if (JPEGEncodeHandle)
  254. {
  255. uColor.u32 = Event.Param1;
  256. switch(Event.Param3)
  257. {
  258. case COLOR_MODE_YCBCR_422_CBYCRY:
  259. uPV.pu8 = malloc((Event.Param2 >> 1) * 3);
  260. if (!uPV.pu8)
  261. {
  262. DBG("jpeg encode no momery");
  263. break;
  264. }
  265. Event.Param2 >>= 2;
  266. for(i = 0; i < Event.Param2; i++)
  267. {
  268. uPV.pu8[i * 6 + 0] = uColor.pu8[i * 4 + 1];
  269. uPV.pu8[i * 6 + 1] = uColor.pu8[i * 4 + 0];
  270. uPV.pu8[i * 6 + 2] = uColor.pu8[i * 4 + 2];
  271. uPV.pu8[i * 6 + 3] = uColor.pu8[i * 4 + 3];
  272. uPV.pu8[i * 6 + 4] = uColor.pu8[i * 4 + 0];
  273. uPV.pu8[i * 6 + 5] = uColor.pu8[i * 4 + 2];
  274. }
  275. jpeg_encode_run(JPEGEncodeHandle, uPV.pu8, 0);
  276. free(uPV.pu8);
  277. break;
  278. case COLOR_MODE_RGB_565:
  279. uPV.pu8 = malloc((Event.Param2 >> 1) * 3);
  280. if (!uPV.pu8)
  281. {
  282. DBG("jpeg encode no momery");
  283. break;
  284. }
  285. Event.Param2 >>= 1;
  286. for(i = 0; i < Event.Param2; i++)
  287. {
  288. RGB565toRGB888(uColor.pu16[i], uPV.pu8 + i * 3, 1);
  289. }
  290. jpeg_encode_run(JPEGEncodeHandle, uPV.pu8, 1);
  291. free(uPV.pu8);
  292. break;
  293. case COLOR_MODE_GRAY:
  294. uPV.pu8 = malloc(Event.Param2 * 3);
  295. if (!uPV.pu8)
  296. {
  297. DBG("jpeg encode no momery");
  298. break;
  299. }
  300. for(i = 0; i < Event.Param2; i++)
  301. {
  302. uPV.pu8[i * 3 + 0] = uColor.pu8[i];
  303. uPV.pu8[i * 3 + 1] = uColor.pu8[i];
  304. uPV.pu8[i * 3 + 2] = uColor.pu8[i];
  305. }
  306. jpeg_encode_run(JPEGEncodeHandle, uPV.pu8, 1);
  307. free(uPV.pu8);
  308. break;
  309. default:
  310. break;
  311. }
  312. }
  313. free(Event.Param1);
  314. break;
  315. case SERVICE_ENCODE_JPEG_END:
  316. if (JPEGEncodeHandle)
  317. {
  318. jpeg_encode_end(JPEGEncodeHandle);
  319. free(JPEGEncodeHandle);
  320. JPEGEncodeHandle = NULL;
  321. }
  322. if (Event.Param1)
  323. {
  324. CB = (CBFuncEx_t)Event.Param1;
  325. CB(NULL, Event.Param2);
  326. }
  327. break;
  328. }
  329. }
  330. }
  331. extern int luat_fs_init(void);
  332. static void prvLuatOS_Task(void* params)
  333. {
  334. // 文件系统初始化
  335. // luat_fs_init();
  336. // 载入LuatOS主入口
  337. luat_main();
  338. // 永不进入的代码, 避免编译警告.
  339. // for(;;)
  340. // {
  341. // vTaskDelayUntil( &xLastWakeTime, 2000 * portTICK_RATE_MS );
  342. // }
  343. }
  344. extern void luat_base_init(void);
  345. uint32_t Core_LCDDrawCacheLen(void)
  346. {
  347. if (prvService.LCDDrawRequireByte > prvService.LCDDrawDoneByte)
  348. {
  349. return (uint32_t)(prvService.LCDDrawRequireByte - prvService.LCDDrawDoneByte);
  350. }
  351. else
  352. {
  353. return 0;
  354. }
  355. }
  356. void Core_LCDDraw(LCD_DrawStruct *Draw)
  357. {
  358. prvService.LCDDrawRequireByte += Draw->Size;
  359. Task_SendEvent(prvService.HardwareHandle, SERVICE_LCD_DRAW, Draw, 0, 0);
  360. }
  361. void Core_LCDDrawBlock(LCD_DrawStruct *Draw)
  362. {
  363. PV_Union uPV;
  364. uint64_t StartUS;
  365. // if (Draw->Speed > 30000000)
  366. // {
  367. // SPI_SetTxOnlyFlag(Draw->SpiID, 1);
  368. // }
  369. SPI_SetNewConfig(Draw->SpiID, Draw->Speed, Draw->Mode);
  370. // SPI_DMATxInit(Draw->SpiID, LCD_SPI_TX_DMA_STREAM, 0);
  371. // SPI_DMARxInit(Draw->SpiID, LCD_SPI_RX_DMA_STREAM, 0);
  372. prvCore_LCDCmd(Draw, 0x2a);
  373. BytesPutBe16(uPV.u8, Draw->x1 + Draw->xoffset);
  374. BytesPutBe16(uPV.u8 + 2, Draw->x2 + Draw->xoffset);
  375. prvCore_LCDData(Draw, uPV.u8, 4);
  376. prvCore_LCDCmd(Draw, 0x2b);
  377. BytesPutBe16(uPV.u8, Draw->y1 + Draw->yoffset);
  378. BytesPutBe16(uPV.u8 + 2, Draw->y2 + Draw->yoffset);
  379. prvCore_LCDData(Draw, uPV.u8, 4);
  380. prvCore_LCDCmd(Draw, 0x2c);
  381. GPIO_Output(Draw->CSPin, 0);
  382. // StartUS = GetSysTickUS();
  383. // SPI_Transfer(Draw->SpiID, Draw->Data, Draw->Data, Draw->Size, 2);
  384. SPI_BlockTransfer(Draw->SpiID, Draw->Data, Draw->Data, Draw->Size);
  385. // DBG("%u, %u", Draw->Size, (uint32_t)(GetSysTickUS() - StartUS));
  386. // if (Draw->Speed > 30000000)
  387. // {
  388. // Task_DelayUS(1);
  389. // }
  390. GPIO_Output(Draw->CSPin, 1);
  391. SPI_SetTxOnlyFlag(Draw->SpiID, 0);
  392. }
  393. void Core_CameraDraw(LCD_DrawStruct *Draw)
  394. {
  395. Task_SendEvent(prvService.HardwareHandle, SERVICE_CAMERA_DRAW, Draw, 0, 0);
  396. }
  397. void Core_DecodeQR(uint8_t *ImageData, uint16_t ImageW, uint16_t ImageH, CBDataFun_t CB)
  398. {
  399. PV_Union uPV;
  400. uPV.u16[0] = ImageW;
  401. uPV.u16[1] = ImageH;
  402. Task_SendEvent(prvService.ServiceHandle, SERVICE_DECODE_QR, ImageData, uPV.u32, CB);
  403. }
  404. void Core_ScanKeyBoard(void)
  405. {
  406. Task_SendEvent(prvService.ServiceHandle, SERVICE_SCAN_KEYBOARD, 0, 0, 0);
  407. }
  408. void Core_SetRGB565FixValue(uint8_t R, uint8_t G, uint8_t B)
  409. {
  410. prvService.RFix = R & 0x07;
  411. prvService.GFix = G & 0x03;
  412. prvService.BFix = B & 0x07;
  413. }
  414. void Core_EncodeJPEGSetup(HANDLE Fun, void *pParam)
  415. {
  416. if (Fun)
  417. {
  418. prvService.JPEGEncodeWriteFun = Fun;
  419. }
  420. else
  421. {
  422. prvService.JPEGEncodeWriteFun = prv_CoreJpegSave;
  423. }
  424. prvService.JPEGEncodeWriteParam = pParam;
  425. }
  426. void Core_EncodeJPEGStart(uint32_t Width, uint32_t Height, uint8_t Quality)
  427. {
  428. Task_SendEvent(prvService.ServiceHandle, SERVICE_ENCODE_JPEG_START, (Width << 16 | Height), Quality, 0);
  429. }
  430. void Core_EncodeJPEGRun(uint8_t *Data, uint32_t Len, uint8_t ColorMode)
  431. {
  432. Task_SendEvent(prvService.ServiceHandle, SERVICE_ENCODE_JPEG_RUN, Data, Len, ColorMode);
  433. }
  434. void Core_EncodeJPEGEnd(CBFuncEx_t CB, void *pParam)
  435. {
  436. Task_SendEvent(prvService.ServiceHandle, SERVICE_ENCODE_JPEG_END, CB, pParam, 0);
  437. }
  438. void Core_PrintMemInfo(void)
  439. {
  440. uint32_t curalloc, totfree, maxfree;
  441. OS_MemInfo(&curalloc, &totfree, &maxfree);
  442. DBG("curalloc %uB, totfree %uB, maxfree %uB", curalloc, totfree, maxfree);
  443. }
  444. static uint8_t disassembly_ins_is_bl_blx(uint32_t addr) {
  445. uint16_t ins1 = *((uint16_t *)addr);
  446. uint16_t ins2 = *((uint16_t *)(addr + 2));
  447. #define BL_INS_MASK 0xF800
  448. #define BL_INS_HIGH 0xF800
  449. #define BL_INS_LOW 0xF000
  450. #define BLX_INX_MASK 0xFF00
  451. #define BLX_INX 0x4700
  452. if ((ins2 & BL_INS_MASK) == BL_INS_HIGH && (ins1 & BL_INS_MASK) == BL_INS_LOW) {
  453. return 1;
  454. } else if ((ins2 & BLX_INX_MASK) == BLX_INX) {
  455. return 1;
  456. } else {
  457. return 0;
  458. }
  459. }
  460. static void prvCore_PrintTaskStack(HANDLE TaskHandle)
  461. {
  462. uint32_t SP, StackAddress, Len, i, PC;
  463. uint32_t Buffer[16];
  464. if (!TaskHandle) return;
  465. char *Name = vTaskInfo(TaskHandle, &SP, &StackAddress, &Len);
  466. Len *= 4;
  467. DBG_Trace("%s call stack info:", Name);
  468. for(i = 0; i < 16, SP < StackAddress + Len; SP += 4)
  469. {
  470. PC = *((uint32_t *) SP) - 4;
  471. if ((PC > __FLASH_APP_START_ADDR__) && (PC < (__FLASH_BASE_ADDR__ + __CORE_FLASH_BLOCK_NUM__ * __FLASH_BLOCK_SIZE__)))
  472. {
  473. if (PC % 2 == 0) {
  474. continue;
  475. }
  476. PC = *((uint32_t *) SP) - 1;
  477. if (disassembly_ins_is_bl_blx(PC - 4))
  478. {
  479. DBG_Trace("%x", PC);
  480. i++;
  481. }
  482. }
  483. }
  484. }
  485. void Core_PrintServiceStack(void)
  486. {
  487. prvCore_PrintTaskStack(prvService.HardwareHandle);
  488. prvCore_PrintTaskStack(prvService.UserHandle);
  489. prvCore_PrintTaskStack(prvService.ServiceHandle);
  490. }
  491. void Core_DebugMem(uint8_t HeapID, const char *FuncName, uint32_t Line)
  492. {
  493. int32_t curalloc, totfree, maxfree;
  494. OS_MemInfo(&curalloc, &totfree, &maxfree);
  495. if (!prvService.InitAllocMem)
  496. {
  497. prvService.InitAllocMem = curalloc;
  498. prvService.LastAllocMem = curalloc;
  499. DBG_Printf("base %d\r\n", prvService.InitAllocMem);
  500. }
  501. else
  502. {
  503. DBG_Printf("%s %u:total %d last %d\r\n", FuncName, Line, curalloc - prvService.InitAllocMem, curalloc - prvService.LastAllocMem);
  504. prvService.LastAllocMem = curalloc;
  505. }
  506. }
  507. void Core_HWTaskInit(void)
  508. {
  509. prvService.HardwareHandle = Task_Create(prvHW_Task, NULL, 2 * 1024, HW_TASK_PRO, "HW task");
  510. }
  511. void Core_ServiceInit(void)
  512. {
  513. prvService.ServiceHandle = Task_Create(prvService_Task, NULL, 4 * 1024, SERVICE_TASK_PRO, "Serv task");
  514. }
  515. void Core_UserTaskInit(void)
  516. {
  517. #ifdef __LUATOS__
  518. prvService.UserHandle = Task_Create(prvLuatOS_Task, NULL, 8*1024, LUATOS_TASK_PRO, "luatos task");
  519. luat_base_init();
  520. #endif
  521. }
  522. INIT_TASK_EXPORT(Core_HWTaskInit, "0");
  523. INIT_TASK_EXPORT(Core_ServiceInit, "1");
  524. INIT_TASK_EXPORT(Core_UserTaskInit, "5");
  525. #endif