printf_e907.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. /******************************************************************************
  2. 版权所有: 文件名称: printf_e907.c
  3. 文件版本: 01.01
  4. 创建作者: sunxi
  5. 创建日期: 2022-5-11
  6. 功能说明: 打印裸核e907的信息
  7. 其它说明:
  8. 修改记录:
  9. */
  10. #include "bspconfig.h"
  11. #include "bsp.h"
  12. #include "shm_comm_packet.h"
  13. #include <linux/sched.h>
  14. #include <sys/prctl.h>
  15. #define P_BUF_LEN_MAX 4096 //buf总长度
  16. //打印数据结构体
  17. typedef struct SHM_PRINTF_T
  18. {
  19. uint16_t A;
  20. uint16_t B;
  21. uint16_t w;
  22. uint16_t r;
  23. uint16_t crc;
  24. }SHM_PRINTF_T;
  25. static uint8_t p_buf[P_BUF_LEN_MAX];
  26. static uint16_t w_p = 0; //写指针
  27. static uint16_t r_p = 0; //读指针
  28. #if 0
  29. static char test_1[] = "printf_e907_func----------------------\r\n";
  30. static char test_2[] = "printf_e907_func----------------------123\r\n";
  31. static char test_3[] = "printf_e907_func----------------------456\r\n";
  32. #endif
  33. static pthread_t printf_e907_tid = 0;
  34. static int printf_e907_func(void *arg);
  35. static int exit_flag = 0;
  36. extern int main_mod_is_exit(void);
  37. static int get_printf_wr(uint8_t *out_data)
  38. {
  39. int ret = 0;
  40. int cnt = 0;
  41. if(out_data == NULL)
  42. return -1;
  43. while(1)
  44. {
  45. ret = shm_comm_packet_read(SHM_ADDR_U_WR, sizeof(SHM_PRINTF_T), out_data, sizeof(SHM_PRINTF_T));
  46. if(ret > 0)
  47. {
  48. break;
  49. }
  50. if(++cnt > 3)
  51. break;
  52. usleep(30);
  53. }
  54. return ret;
  55. }
  56. /******************************************************************************
  57. 函数名称: printf_e907_func
  58. 函数版本: 01.01
  59. 创建作者: sunxi
  60. 创建日期: 2022-5-11
  61. 函数说明: 打印工作函数.
  62. 参数说明:
  63. 返回值: 返回0
  64. 修改记录:
  65. */
  66. static int printf_e907_func(void *arg)
  67. {
  68. SHM_PRINTF_T wr;
  69. int ret = 0;
  70. int len = 0;
  71. int len_1 = 0;
  72. memset(p_buf,0,sizeof(p_buf));
  73. w_p = 0;
  74. r_p = 0;
  75. #if 0
  76. strcpy(&p_buf[w_p],test_1);
  77. w_p += strlen(test_1);
  78. strcpy(&p_buf[w_p],test_2);
  79. w_p += strlen(test_2);
  80. strcpy(&p_buf[w_p],test_3);
  81. w_p += strlen(test_3);
  82. rt_printf(p_buf);
  83. #endif
  84. uint32_t wdt_id;
  85. int rc = watchdog_add_item("printf_e907_func", &wdt_id,120);
  86. if(rc != 0) {
  87. printf("can not add printf_e907_func task to wdt\r\n");
  88. return 0;
  89. }
  90. prctl(PR_SET_NAME, "printf_e907");
  91. while(!exit_flag)
  92. {
  93. msleep(10);
  94. watchdog_feed(wdt_id);
  95. if(main_mod_is_exit())
  96. {
  97. break;
  98. }
  99. w_p = 0;
  100. //获取w,r
  101. memset(&wr,0,sizeof(wr));
  102. ret = get_printf_wr((uint8_t *)&wr);
  103. if(ret >= 0)
  104. {
  105. w_p = wr.w;
  106. }
  107. //rt_printf("w_p = %d, r_p = %d\r\n",w_p,r_p);
  108. if(w_p != r_p)
  109. {
  110. memset(p_buf,0,sizeof(p_buf));
  111. //获取打印信息
  112. if(w_p > r_p)
  113. {
  114. len = w_p - r_p;
  115. ret = shm_read(SHM_ADDR_U_DEBUG_MSG+r_p, len, p_buf, sizeof(p_buf));
  116. if(ret > 0)
  117. r_p += ret;
  118. }
  119. else
  120. {
  121. //w_p指针翻滚,过0
  122. //分两段读取,再合并
  123. len = P_BUF_LEN_MAX-r_p;
  124. ret = shm_read(SHM_ADDR_U_DEBUG_MSG+r_p, len, p_buf, sizeof(p_buf));
  125. if(ret > 0)
  126. r_p += ret;
  127. len_1 = w_p;
  128. ret = shm_read(SHM_ADDR_U_DEBUG_MSG, len_1, &p_buf[len], sizeof(p_buf)-len);
  129. if(ret > 0)
  130. r_p = ret;
  131. }
  132. if(r_p >= P_BUF_LEN_MAX)
  133. r_p = 0;
  134. p_buf[sizeof(p_buf)-1] = 0;//保证结束
  135. if(ret > 0)
  136. {
  137. rt_printf(p_buf);
  138. rt_printf("\r\n");
  139. }
  140. }
  141. }
  142. watchdog_remove_item(wdt_id);
  143. return 0;
  144. }
  145. /******************************************************************************
  146. 函数名称: printf_e907_init
  147. 函数版本: 01.01
  148. 创建作者: sunxi
  149. 创建日期: 2022-5-11
  150. 函数说明: 初始化.
  151. 参数说明:
  152. 无
  153. 返回值: 成功返回0, 失败返回-1
  154. 修改记录:
  155. */
  156. int printf_e907_init(void)
  157. {
  158. int ret;
  159. ret = pthread_create(&printf_e907_tid, NULL, (void *)printf_e907_func, NULL);
  160. if(ret)
  161. {
  162. rt_printf("ret = %d, err = %s\r\n", ret, strerror(ret));
  163. printf_e907_tid = 0;
  164. return ret;
  165. }
  166. return 0;
  167. }
  168. /******************************************************************************
  169. 函数名称: printf_e907_exit
  170. 函数版本: 01.01
  171. 创建作者: sunxi
  172. 创建日期: 2022-5-11
  173. 函数说明: 反初始化.
  174. 参数说明:
  175. 无
  176. 返回值: 总是返回0.
  177. 修改记录:
  178. */
  179. int printf_e907_exit(void)
  180. {
  181. exit_flag = 1;
  182. pthread_join(printf_e907_tid, NULL);
  183. return 0;
  184. }