app.c
上传用户:yj_qqy
上传日期:2017-01-28
资源大小:2911k
文件大小:28k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                              EXAMPLE CODE
  4. *
  5. *                          (c) Copyright 2003-2006; Micrium, Inc.; Weston, FL
  6. *
  7. *               All rights reserved.  Protected by international copyright laws.
  8. *               Knowledge of the source code may NOT be used to develop a similar product.
  9. *               Please help us continue to provide the Embedded community with the finest
  10. *               software available.  Your honesty is greatly appreciated.
  11. *********************************************************************************************************
  12. */
  13. /*
  14. *********************************************************************************************************
  15. *
  16. *                                            EXAMPLE CODE
  17. *
  18. *                                     ST Microelectronics STM32
  19. *                                              with the
  20. *                                   STM3210B-EVAL Evaluation Board
  21. *
  22. * Filename      : app.c
  23. * Version       : V1.10
  24. * Programmer(s) : BAN
  25. *********************************************************************************************************
  26. */
  27. /*
  28. *********************************************************************************************************
  29. *                                             INCLUDE FILES
  30. *********************************************************************************************************
  31. */
  32. #include <includes.h>
  33. #define MID_SAMPLE 100
  34. /*
  35. *********************************************************************************************************
  36. *                                            LOCAL DEFINES
  37. *********************************************************************************************************
  38. */
  39. /*
  40. *********************************************************************************************************
  41. *                                       LOCAL GLOBAL VARIABLES
  42. *********************************************************************************************************
  43. */
  44. static  OS_STK         App_TaskStartStk[APP_TASK_START_STK_SIZE];
  45. #if (OS_VIEW_MODULE == DEF_ENABLED)
  46. OS_STK  TerminalTaskStk[APP_TASK_TERMINAL_STK_SIZE];
  47. void TerminalTask(void *pdata);
  48. void  AppTerminalRx(CPU_INT08U   rx_data);
  49. CPU_INT08U AppTerminalRxMboxData = 0;
  50. OS_EVENT *AppTerminalRxMbox;
  51. #endif
  52. /*
  53. *********************************************************************************************************
  54. *                                      LOCAL FUNCTION PROTOTYPES
  55. *********************************************************************************************************
  56. */
  57. static  void  App_TaskCreate (void);
  58. static  void  App_EventCreate (void);
  59. static  void  App_TaskStart (void *p_arg);
  60. //static  void  APP_TaskPilot (void  *p_arg);
  61. #if (APP_LCD_EN == DEF_ENABLED)
  62. static  void  App_TaskUserIF             (void        *p_arg);
  63. static  void  App_DispScr_SignOn         (void);
  64. static  void  App_DispScr_VersionTickRate(void);
  65. static  void  App_DispScr_CPU            (void);
  66. static  void  App_DispScr_CtxSw          (void);
  67. static  void  App_DispScr_GPS   (void);
  68. #endif
  69. //static void PlayWAV(const char* pPath);
  70. #define r2d 57.29577951308 // = 180 / PI
  71. #define d2r 00.01745329252 // = PI / 180
  72. #define PI 3.1415926535
  73. void ADC_init(void);
  74. void ADC_offset(void);
  75. void kalmanReset(void);
  76. void readSensors (void);
  77. void kalmanFilter(void);
  78. void state_update(void); 
  79. void accel2angle(void);
  80. //state variables
  81. volatile FP32 gyroRate[3]; //roll, nick, yaw in rad/sec 横滚,俯仰,偏航 度/秒
  82. volatile FP32 gyroBias[3]={0.0,0.0,0.0}; // bias is the second 陀螺偏差
  83. volatile FP32 accelVal[3]; //Ax (=roll),Ay (=nick), Az
  84. //kalman estimates
  85. volatile FP32 angleMeasured[3] = {0.0,0.0,0.0}; //accelerometer based angle estimate 角度测量值
  86. volatile FP32 angleEstimate[3];  // angle is the first part of the state vector 角度估计值
  87. volatile FP32 dt = (1.0 / 100); // update funcs are called every 10ms
  88. /*
  89.  * Our Process covariance matrix.  This is updated at every time step to
  90.  * determine how well the sensors are tracking the actual state.
  91.  * 处理我们的协方差矩阵。这是在每一个更新的时间点,以确定如何以及传感器跟踪的实际状况。 
  92.  */
  93. volatile FP32 P[3][2][2] = {
  94. {
  95. { 1, 0 },
  96. { 0, 1 },
  97. },
  98. {
  99. { 1, 0 },
  100. { 0, 1 },
  101. },
  102. {
  103. { 1, 0 },
  104. { 0, 1 },
  105. }
  106. };
  107. /*
  108.  * R represents the measurement covariance noise.  In this case,
  109.  * it is a 1x1 matrix that says that we expect R rad jitter
  110.  * from the accelerometer.
  111.  * R代表了测量方差噪音。在这种情况下,它是一个1x1矩阵说,我们期望抖动R弧度从加速度。
  112.  */
  113. const FP32 R_angle =  0.5;
  114. /*
  115.  * Q is a 2x2 matrix that represents the process covariance noise.
  116.  * Q是2x2矩阵,代表进程协噪音
  117.  */
  118. const FP32 Q_angle =  0.10; // = angle noise E(alpha^2) 角噪音E
  119. const FP32 Q_gyro =  0.0010; // = bias noise  E(bias^2)  倾斜噪音E
  120. volatile INT32S angleN; // nick (front/back) angle in degrees 俯仰角
  121. volatile INT32S angleR; // roll (left/right) angle in degrees 横滚角
  122. volatile INT32S totalG; // total acceleration = sqrt(x^2 + y^2 + z^2)
  123. volatile INT32S gX, gY, gZ; // static acceleration without angle offsets
  124. volatile FP32 gyroCal[3]; // only for gyro calibration
  125. volatile INT32S calN;
  126. volatile INT32S calR;
  127. volatile INT32S calY;
  128. //-------------------------------------------------------------------------------
  129. // kalman reset is called when sensors are calibrated
  130. void kalmanReset()
  131. {
  132. INT8U i;
  133. for (i=0; i<3; i++)
  134. {
  135. angleMeasured[i] = 0.0;
  136. angleEstimate[i] = 0.0;
  137. gyroBias[i] = 0.0;
  138. P[i][0][0] = 1;
  139. P[i][0][1] = 0;
  140. P[i][1][0] = 0;
  141. P[i][1][1] = 1;
  142. gyroCal[i]=0.0;
  143. }
  144. }
  145. //-------------------------------------------------------------------------------
  146. //readSensors is called every 10ms. It transforms the raw gyro rates into radians/dt
  147. //rescales the accels values and computes the nick and roll angles in degrees*4. These are
  148. //then used in the mixer.
  149. void readSensors (void)
  150. {
  151. gyroRate[0] = (FP32)-(ADC_Mittelwert[ADC_ROLL]);
  152. gyroRate[0] *= PI / 16465.92;
  153. gyroRate[1] = (FP32)ADC_Mittelwert[ADC_NICK];
  154. gyroRate[1] *= PI / 16465.92;
  155. gyroRate[2] = (FP32)ADC_Mittelwert[ADC_GIER];
  156. gyroRate[2] *= PI / 16465.92;
  157. accelVal[0] = (FP32)ADC_Mittelwert[ADC_ACCX];
  158. accelVal[0] /= 4096 / 5.5f; // normalize
  159. accelVal[1] = (FP32)ADC_Mittelwert[ADC_ACCY];
  160. accelVal[1] /= 4096 / 5.5f;
  161. accelVal[2] = (FP32)ADC_Mittelwert[ADC_ACCZ];
  162. accelVal[2] /= 4096 / 5.5f;
  163. angleR = angleEstimate[0] * r2d; // covert to degrees and scale for mixer
  164. angleN = angleEstimate[1] * r2d;
  165. calN = (INT32S)(gyroCal[1] * 256);
  166. calR = (INT32S)(gyroCal[0] * 256);
  167. calY = (INT32S)(gyroCal[2] * 256);
  168. }
  169. //-------------------------------------------------------------------------------
  170. //accel2angle computes the angles with the accel values
  171. void accel2angle(void)
  172. {
  173. FP32 f;
  174. // Calculate g ( ||g_vec|| )
  175. FP32 g = sqrt(accelVal[0]*accelVal[0] + accelVal[1]*accelVal[1] + accelVal[2]*accelVal[2]);
  176. totalG = (g - 1.0) * 64; // = |a| - gravity
  177. //values in radians
  178. angleMeasured[0] = -asin(accelVal[0] / g);
  179. angleMeasured[1] = asin(accelVal[1] / g);
  180. angleMeasured[2] = 0; // later: magnetometer ...
  181. /* try to compute the linear part of the acceleration.
  182.    We assume, that the angleEstimate currently are the correct angles.
  183. */
  184. f = 64 * (accelVal[0] + sin(angleEstimate[0]));
  185. gX = (INT32S)f;
  186. f = 64 * (sin(angleEstimate[1]) - accelVal[1]);
  187. gY = (INT32S)f;
  188. }
  189. //-------------------------------------------------------------------------------
  190. //
  191. void state_update() //called on new gyro output available
  192. {
  193. INT8U i;
  194. FP32 Pdot[4];
  195. for(i=0;i<3;i++)
  196. {
  197. //  integrate angle by adding gyro rate
  198. angleEstimate[i] += (dt * (gyroRate[i] - gyroBias[i]));
  199. gyroCal[i] += (dt * gyroRate[i]);
  200. Pdot[0] = Q_angle - P[i][0][1] - P[i][1][0]; /* 0,0 */
  201. Pdot[1] = - P[i][1][1]; /* 0,1 */
  202. Pdot[2] = - P[i][1][1]; /* 1,0 */
  203. Pdot[3] = Q_gyro; /* 1,1 */
  204. /* Update the covariance matrix */
  205. P[i][0][0] += Pdot[0] * dt;
  206. P[i][0][1] += Pdot[1] * dt;
  207. P[i][1][0] += Pdot[2] * dt;
  208. P[i][1][1] += Pdot[3] * dt;
  209. }
  210. }
  211. //-------------------------------------------------------------------------------
  212. //
  213. void kalmanFilter(void)
  214. {
  215. FP32 angle_err;
  216. INT8U i;
  217. FP32 PCt_0, PCt_1, E, K_0, K_1, t_0, t_1;
  218. //our extractor matrix. We only want the angle part, not the bias
  219. const FP32 C_0 = 1.0;
  220. for(i=0;i<3;i++)
  221. {
  222. angle_err = angleMeasured[i] - angleEstimate[i];
  223. PCt_0 = C_0 * P[i][0][0];
  224. PCt_1 = C_0 * P[i][1][0];
  225. //error estimate
  226. E = R_angle + C_0 * PCt_0;
  227. K_0 = PCt_0 / E;
  228. K_1 = PCt_1 / E;
  229. t_0 = PCt_0;
  230. t_1 = C_0 * P[i][0][1];
  231. P[i][0][0] -= K_0 * t_0;
  232. P[i][0][1] -= K_0 * t_1;
  233. P[i][1][0] -= K_1 * t_0;
  234. P[i][1][1] -= K_1 * t_1;
  235. angleEstimate[i] += K_0 * angle_err;
  236. gyroBias[i] += K_1 * angle_err;
  237. }
  238. }
  239. void ADC_init(void){
  240.     CPU_INT08U  os_err;
  241. INT16U mid_i, pos;
  242. INT32S mux[8] = {0,0,0,0,0,0,0,0};
  243. BSP_LED_Off(1);
  244. for(mid_i = 0; mid_i < MID_SAMPLE; mid_i++) {
  245. BSP_LED_Toggle(1);
  246. OSTimeDlyHMSM(0, 0, 0, 20);
  247. ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  248. OSSemPend(App_ADCSem, 0, &os_err);
  249. for(pos = 0; pos < 8; pos++) {
  250. mux[pos] += ADC_Mittelwert[pos];
  251. }
  252. }
  253. BSP_LED_Off(1);
  254. ADC_Neutral[ADC_GIER] = abs(mux[ADC_GIER] / MID_SAMPLE);
  255. ADC_Neutral[ADC_ACCX] = abs(mux[ADC_ACCX] / MID_SAMPLE);
  256. ADC_Neutral[ADC_ACCZ] = 0;
  257. ADC_Neutral[ADC_ACCY] = abs(mux[ADC_ACCY] / MID_SAMPLE);
  258. ADC_Neutral[ADC_NICK] = abs(mux[ADC_NICK] / MID_SAMPLE);
  259. ADC_Neutral[ADC_ROLL] = abs(mux[ADC_ROLL] / MID_SAMPLE);
  260. }
  261. void ADC_offset(void) {
  262. OSTimeDlyHMSM(0, 0, 0, 200);
  263. ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  264. ADC_Neutral[ADC_GIER] -= ADC_Mittelwert[ADC_GIER];
  265. ADC_Neutral[ADC_NICK] += ADC_Mittelwert[ADC_NICK];
  266. ADC_Neutral[ADC_ROLL] += ADC_Mittelwert[ADC_ROLL];
  267. ADC_Neutral[ADC_ACCX] -= ADC_Mittelwert[ADC_ACCX];
  268. ADC_Neutral[ADC_ACCY] += ADC_Mittelwert[ADC_ACCY];
  269. OSTimeDlyHMSM(0, 0, 0, 200);
  270. ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  271. ADC_Neutral[ADC_GIER] -= ADC_Mittelwert[ADC_GIER];
  272. ADC_Neutral[ADC_NICK] += ADC_Mittelwert[ADC_NICK];
  273. ADC_Neutral[ADC_ROLL] += ADC_Mittelwert[ADC_ROLL];
  274. ADC_Neutral[ADC_ACCX] -= ADC_Mittelwert[ADC_ACCX];
  275. ADC_Neutral[ADC_ACCY] += ADC_Mittelwert[ADC_ACCY];
  276. }
  277. #if 0
  278. void AddStr(char *s1,char *s2,char *d)
  279. {
  280.    while(*s1!='') {*d=*s1; d++; s1++;}
  281.    while(*s2!='') {*d=*s2; d++; s2++;}
  282.    *d='';
  283. }
  284. void PlayWAV(const char* pPath)
  285. {
  286.    FS_DIR *pDir;
  287.    FS_FILE *pFile;
  288.    struct FS_DIRENT *pDirEnt;
  289.    
  290.    char d[50];
  291.    INT8U Buffer[512];
  292.    int x;
  293.    FS_Init();
  294.    printf("正在搜索目录.rn");
  295.    pDir = FS_OpenDir(pPath);
  296.    if(pDir)
  297.    {
  298.        printf("找到目录并已打开.rn");
  299.        for(;;)
  300.        {
  301.            pDirEnt = FS_ReadDir(pDir);
  302.            if((void*)pDirEnt == NULL) {break;}
  303.            //pDirEnt = FS_ReadDir(pDir);
  304.    
  305.            AddStr("mmc:\",pDirEnt->d_name,d);
  306.            pFile=FS_FOpen(d,"rb");
  307.            if(pFile)
  308.            {
  309.    printf(pDirEnt->d_name);
  310.    printf("rn");     
  311.                do 
  312.                {
  313.                    x = FS_FRead(Buffer,1,512,pFile);
  314.                    if(x)
  315.                    {
  316.        OSTimeDly(1);
  317.                    }
  318.    
  319.                }while(x);
  320.            }
  321.            FS_FClose(pFile);
  322.        }
  323.        FS_CloseDir(pDir);     
  324.    }
  325.    FS_Exit();
  326.    printf("读取文件结束.rn");
  327. }
  328. void GetDiskInfo(void) {
  329.   FS_DISKFREE_T disk_data;
  330.   FS_u32 free;
  331.   FS_u32 space;
  332.   int    x;
  333.   FS_Init();
  334.   printf("Test FS_IoCtl command FS_CMD_GET_DISKFREE :rn");
  335.   x = FS_IoCtl("",FS_CMD_GET_DISKFREE,0,(void*) &disk_data);
  336.   if (x==0) {
  337.     space = disk_data.total_clusters * disk_data.sectors_per_cluster * disk_data.bytes_per_sector;
  338.   free  = disk_data.avail_clusters * disk_data.sectors_per_cluster * disk_data.bytes_per_sector;
  339.     printf("Total clusters     : %lurn"
  340.                        "Available clusters : %lurn"
  341.                        "Sectors/cluster    : %urn"
  342.                        "Bytes per sector   : %urn"
  343.                        "Total space        : %lurn"
  344.                        "Free space         : %lurn",
  345. disk_data.total_clusters, disk_data.avail_clusters, disk_data.sectors_per_cluster, disk_data.bytes_per_sector, space, free);
  346.     printf("OKrn");
  347.   } else {
  348.     printf("Test failedrn");
  349.   }
  350.   printf("rn");
  351.   FS_Exit();
  352. }
  353. #endif
  354. /*
  355. *********************************************************************************************************
  356. *                                                main()
  357. *
  358. * Description : This is the standard entry point for C code.  It is assumed that your code will call
  359. *               main() once you have performed all necessary initialization.
  360. *
  361. * Argument(s) : none.
  362. *
  363. * Return(s)   : none.
  364. *********************************************************************************************************
  365. */
  366. INT32S main (void)
  367. {
  368.     CPU_INT08U  os_err;
  369. #if 0
  370. INT32U sdret, i;
  371. INT8U buffer[512];
  372. BSP_Init(); 
  373. sdret = SD_Initialize();
  374. printf("sdret=0x%02Xrn", sdret);
  375. if(!sdret) {
  376. while(1) {
  377. sdret = SD_ReadBlock(0, 512, buffer);
  378. //printf("---------------------------------rn");
  379. //for(i = 0; i < 512; i+=8)
  380. //{
  381.     // printf("%03X %02X %02X %02X %02X %02X %02X %02X %02Xrn",i, buffer[i], buffer[i+1], buffer[i+2], buffer[i+3], buffer[i+4], buffer[i+5], buffer[i+6], buffer[i+7]);
  382. //}
  383. if(sdret) {
  384. printf("sdret=0x%02Xrn", sdret);
  385. break;
  386. }
  387. OSTimeDly(1);
  388. }
  389. }
  390. #endif
  391.     BSP_IntDisAll();                                            /* Disable all ints until we are ready to accept them.  */
  392.     OSInit();                                                   /* Initialize "uC/OS-II, The Real-Time Kernel".         */
  393.     os_err = OSTaskCreateExt((void (*)(void *)) App_TaskStart,  /* Create the start task.                               */
  394.                              (void          * ) 0,
  395.                              (OS_STK        * )&App_TaskStartStk[APP_TASK_START_STK_SIZE - 1],
  396.                              (INT8U           ) APP_TASK_START_PRIO,
  397.                              (INT16U          ) APP_TASK_START_PRIO,
  398.                              (OS_STK        * )&App_TaskStartStk[0],
  399.                              (INT32U          ) APP_TASK_START_STK_SIZE,
  400.                              (void          * )0,
  401.                              (INT16U          )(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK));
  402. #if OS_TASK_NAME_EN > 0
  403.     OSTaskNameSet(APP_TASK_START_PRIO, (CPU_INT08U *)"Start Task", &os_err);
  404. #endif
  405.     OSStart();                                                  /* Start multitasking (i.e. give control to uC/OS-II).  */
  406.     return (0);
  407. }
  408. /*
  409. *********************************************************************************************************
  410. *                                          App_TaskStart()
  411. *
  412. * Description : The startup task.  The uC/OS-II ticker should only be initialize once multitasking starts.
  413. *
  414. * Argument(s) : p_arg       Argument passed to 'App_TaskStart()' by 'OSTaskCreate()'.
  415. *
  416. * Return(s)   : none.
  417. *
  418. * Caller(s)   : This is a task.
  419. *
  420. * Note(s)     : none.
  421. *********************************************************************************************************
  422. */
  423. static  void  App_TaskStart (void *p_arg)
  424. {
  425.     //CPU_INT08U  os_err;
  426. INT32U count = 0, sdret;// i;
  427. INT8U buffer[512];
  428.     (void)p_arg;
  429.     BSP_Init();                                                 /* Initialize BSP functions.                            */
  430.     OS_CPU_SysTickInit();                                       /* Initialize the SysTick.                              */
  431. #if (OS_TASK_STAT_EN > 0)
  432.     OSStatInit();                                               /* Determine CPU capacity.                              */
  433. #endif
  434. #if (GPS_MODULE == DEF_ENABLED)
  435.     GPS_Init();                                          /* GPS Init                           */
  436.     GPS_RxIntEn();                                            /* Enable Rx Interrupts                                 */
  437. #endif
  438. #if (OS_VIEW_MODULE == DEF_ENABLED)
  439.     OSView_Init(115200);                                        /* OSView Init, baud rate = 115200                      */
  440.     OSView_TerminalRxSetCallback(AppTerminalRx);
  441.     OSView_RxIntEn();                                           /* Enable Rx Interrupts                                 */
  442. AppTerminalRxMbox = OSMboxCreate((void *)0);
  443. #endif
  444.     App_EventCreate();                                          /* Create application events.                           */
  445.     App_TaskCreate();                                           /* Create application tasks.                            */
  446. //ADC_init();
  447. //ADC_offset();
  448. //GetDiskInfo();
  449. //PlayWAV("mmc:\");
  450. sdret = SD_Initialize();
  451. printf("sdret=0x%02Xrn", sdret);
  452. if(!sdret) {
  453. while(1) {
  454. sdret = SD_ReadBlock(0, 512, buffer);
  455. //printf("---------------------------------rn");
  456. //for(i = 0; i < 512; i+=8)
  457. //{
  458.     // printf("%03X %02X %02X %02X %02X %02X %02X %02X %02Xrn",i, buffer[i], buffer[i+1], buffer[i+2], buffer[i+3], buffer[i+4], buffer[i+5], buffer[i+6], buffer[i+7]);
  459. //}
  460. if(sdret) {
  461. printf("sdret=0x%02Xrn", sdret);
  462. break;
  463. }
  464. OSTimeDly(1);
  465. }
  466. }
  467. //while(DEF_TRUE) {
  468. // GPIO_SetBits(GPIOA, GPIO_Pin_6);
  469. // GPIO_ResetBits(GPIOA, GPIO_Pin_6);
  470. //}
  471. //kalmanReset();
  472. BSP_LED_Off(2);
  473.     while (DEF_TRUE) {                                          /* Task body, always written as an infinite loop.       */
  474. count++;
  475. if(count % 25 == 0) {
  476. BSP_LED_Toggle(2);
  477. }
  478. OSTimeDlyHMSM(0, 0, 0, 10);
  479. //ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  480. //OSSemPend(App_ADCSem, 0, &os_err);
  481. //readSensors ();
  482. //state_update(); 
  483. //accel2angle();
  484. //kalmanFilter();
  485. //printf("N: %4d R: %4d G: %4d X: %4d Y: %4d Z: %4drn", ADC_Mittelwert[ADC_NICK], ADC_Mittelwert[ADC_ROLL], ADC_Mittelwert[ADC_GIER], ADC_Mittelwert[ADC_ACCX], ADC_Mittelwert[ADC_ACCY], ADC_Mittelwert[ADC_ACCZ]);
  486. //printf("x: %4d y: %4d z: %4drn",gX, gY, gZ);
  487. //printf("testrn");
  488.     }
  489. }
  490. /*
  491. *********************************************************************************************************
  492. *                                             App_EventCreate()
  493. *
  494. * Description : Create the application events.
  495. *
  496. * Argument(s) : none.
  497. *
  498. * Return(s)   : none.
  499. *
  500. * Caller(s)   : App_TaskStart().
  501. *
  502. * Note(s)     : none.
  503. *********************************************************************************************************
  504. */
  505. static  void  App_EventCreate (void)
  506. {
  507. #if (OS_EVENT_NAME_SIZE > 12)
  508.     CPU_INT08U  os_err;
  509. #endif
  510.     App_ADCSem = OSSemCreate(0);                   /* Create MBOX for communication between Kbd and UserIF.*/
  511. #if (OS_EVENT_NAME_SIZE > 12)
  512.     OSEventNameSet(App_ADCSem, "ADC Sem", &os_err);
  513. #endif
  514. }
  515. /*
  516. *********************************************************************************************************
  517. *                                            App_TaskCreate()
  518. *
  519. * Description : Create the application tasks.
  520. *
  521. * Argument(s) : none.
  522. *
  523. * Return(s)   : none.
  524. *
  525. * Caller(s)   : App_TaskStart().
  526. *
  527. * Note(s)     : none.
  528. *********************************************************************************************************
  529. */
  530. static  void  App_TaskCreate (void)
  531. {
  532.     CPU_INT08U  os_err;
  533. #if (OS_VIEW_MODULE == DEF_ENABLED)
  534.     os_err = OSTaskCreateExt((void (*)(void *)) TerminalTask,
  535.                              (void          * ) 0,
  536.                              (OS_STK        * )&TerminalTaskStk[APP_TASK_TERMINAL_STK_SIZE - 1],
  537.                              (INT8U           ) APP_TASK_TERMINAL_PRIO,
  538.                              (INT16U          ) APP_TASK_TERMINAL_PRIO,
  539.                              (OS_STK        * )&TerminalTaskStk[0],
  540.                              (INT32U          ) APP_TASK_TERMINAL_STK_SIZE,
  541.                              (void          * ) 0,
  542.                              (INT16U          )(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK));
  543. #if OS_TASK_NAME_EN > 0
  544.      OSTaskNameSet(APP_TASK_TERMINAL_PRIO, "Terminal Task", &os_err);
  545. #endif
  546. #endif
  547. }
  548. /*
  549. *********************************************************************************************************
  550. *                                          AppTerminalRx()
  551. *
  552. * Description : Callback function for uC/OS-View
  553. *
  554. * Argument(s) : rx_data     The received data.
  555. *
  556. * Return(s)   : none.
  557. *********************************************************************************************************
  558. */
  559. #if (OS_VIEW_MODULE == DEF_ENABLED)
  560. void  AppTerminalRx (CPU_INT08U rx_data)
  561. {
  562. AppTerminalRxMboxData = rx_data; 
  563. OSMboxPost(AppTerminalRxMbox, &AppTerminalRxMboxData);
  564. }
  565. #endif
  566. /*
  567. *********************************************************************************************************
  568. *********************************************************************************************************
  569. *                                          uC/OS-II APP HOOKS
  570. *********************************************************************************************************
  571. *********************************************************************************************************
  572. */
  573. #if (OS_APP_HOOKS_EN > 0)
  574. /*
  575. *********************************************************************************************************
  576. *                                      TASK CREATION HOOK (APPLICATION)
  577. *
  578. * Description : This function is called when a task is created.
  579. *
  580. * Argument(s) : ptcb   is a pointer to the task control block of the task being created.
  581. *
  582. * Note(s)     : (1) Interrupts are disabled during this call.
  583. *********************************************************************************************************
  584. */
  585. void  App_TaskCreateHook (OS_TCB *ptcb)
  586. {
  587. #if (OS_VIEW_MODULE == DEF_ENABLED)
  588.     OSView_TaskCreateHook(ptcb);
  589. #endif
  590. }
  591. /*
  592. *********************************************************************************************************
  593. *                                    TASK DELETION HOOK (APPLICATION)
  594. *
  595. * Description : This function is called when a task is deleted.
  596. *
  597. * Argument(s) : ptcb   is a pointer to the task control block of the task being deleted.
  598. *
  599. * Note(s)     : (1) Interrupts are disabled during this call.
  600. *********************************************************************************************************
  601. */
  602. void  App_TaskDelHook (OS_TCB *ptcb)
  603. {
  604.     (void)ptcb;
  605. }
  606. /*
  607. *********************************************************************************************************
  608. *                                      IDLE TASK HOOK (APPLICATION)
  609. *
  610. * Description : This function is called by OSTaskIdleHook(), which is called by the idle task.  This hook
  611. *               has been added to allow you to do such things as STOP the CPU to conserve power.
  612. *
  613. * Argument(s) : none.
  614. *
  615. * Note(s)     : (1) Interrupts are enabled during this call.
  616. *********************************************************************************************************
  617. */
  618. #if OS_VERSION >= 251
  619. void  App_TaskIdleHook (void)
  620. {
  621. }
  622. #endif
  623. /*
  624. *********************************************************************************************************
  625. *                                        STATISTIC TASK HOOK (APPLICATION)
  626. *
  627. * Description : This function is called by OSTaskStatHook(), which is called every second by uC/OS-II's
  628. *               statistics task.  This allows your application to add functionality to the statistics task.
  629. *
  630. * Argument(s) : none.
  631. *********************************************************************************************************
  632. */
  633. void  App_TaskStatHook (void)
  634. {
  635. }
  636. /*
  637. *********************************************************************************************************
  638. *                                        TASK SWITCH HOOK (APPLICATION)
  639. *
  640. * Description : This function is called when a task switch is performed.  This allows you to perform other
  641. *               operations during a context switch.
  642. *
  643. * Argument(s) : none.
  644. *
  645. * Note(s)     : (1) Interrupts are disabled during this call.
  646. *
  647. *               (2) It is assumed that the global pointer 'OSTCBHighRdy' points to the TCB of the task that
  648. *                   will be 'switched in' (i.e. the highest priority task) and, 'OSTCBCur' points to the
  649. *                  task being switched out (i.e. the preempted task).
  650. *********************************************************************************************************
  651. */
  652. #if OS_TASK_SW_HOOK_EN > 0
  653. void  App_TaskSwHook (void)
  654. {
  655. #if (OS_VIEW_MODULE == DEF_ENABLED)
  656.     OSView_TaskSwHook();
  657. #endif
  658. }
  659. #endif
  660. /*
  661. *********************************************************************************************************
  662. *                                     OS_TCBInit() HOOK (APPLICATION)
  663. *
  664. * Description : This function is called by OSTCBInitHook(), which is called by OS_TCBInit() after setting
  665. *               up most of the TCB.
  666. *
  667. * Argument(s) : ptcb    is a pointer to the TCB of the task being created.
  668. *
  669. * Note(s)     : (1) Interrupts may or may not be ENABLED during this call.
  670. *********************************************************************************************************
  671. */
  672. #if OS_VERSION >= 204
  673. void  App_TCBInitHook (OS_TCB *ptcb)
  674. {
  675.     (void)ptcb;
  676. }
  677. #endif
  678. /*
  679. *********************************************************************************************************
  680. *                                        TICK HOOK (APPLICATION)
  681. *
  682. * Description : This function is called every tick.
  683. *
  684. * Argument(s) : none.
  685. *
  686. * Note(s)     : (1) Interrupts may or may not be ENABLED during this call.
  687. *********************************************************************************************************
  688. */
  689. #if OS_TIME_TICK_HOOK_EN > 0
  690. void  App_TimeTickHook (void)
  691. {
  692. #if (OS_VIEW_MODULE == DEF_ENABLED)
  693.     OSView_TickHook();
  694. #endif
  695. }
  696. #endif
  697. #endif
  698. #if (OS_VIEW_MODULE == DEF_ENABLED)
  699. void  TerminalTask(void *pdata)
  700. {
  701.     INT8U      s[100];
  702.     INT8U      *key;
  703.     INT8U      err;
  704.     (void)pdata;
  705.                                          /* Prevent compiler warning                 */
  706.     while (1) {
  707.         key = (INT8U *)OSMboxPend(AppTerminalRxMbox, 0, &err);
  708.         switch (*key) {
  709.             case '1':
  710.                  sprintf((char *)s, "nCPU Usage = %3u%%n", OSCPUUsage);
  711.                  OSView_TxStr(s, 1);
  712.                  break;
  713.             case '2':
  714.                  sprintf((char *)s, "n#Tasks    = %3un", OSTaskCtr);
  715.                  OSView_TxStr(s, 1);
  716.                  break;
  717.             default:
  718.                  OSView_TxStr("nnMicrium, Inc.",       1);
  719.                  OSView_TxStr("n1: CPU Usage (%)",      1);
  720.                  OSView_TxStr("n2: #Tasks",             1);
  721.                  OSView_TxStr("n?: Help (This menu)n", 1);
  722.                  break;
  723.         }
  724.     }
  725. }
  726. #endif
  727. #ifdef DEBUG
  728. /****************************************************************** 
  729. * Function name : assert_failed 
  730. * Description : Reports the name of the source file and the source line number 
  731. * where the assert_param error has occurred. 
  732. * Input : - file: pointer to the source file name 
  733. * - line: assert_param error line source number 
  734. * Output : None * Return : None 
  735. ******************************************************************/ 
  736. void assert_failed(u8* file, u32 line) { 
  737. printf("Wrong parameters value: file %s on line %drn", file, line); 
  738. while (1) { } 
  739. }
  740.  #endif